num4equ 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/ext/num4equ/CNum4Equ.c +39 -1
- data/ext/num4equ/CNum4Equ.h +2 -0
- data/lib/num4equ.rb +30 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4441f4b5ae669c3fd23a7c5a18ec3e5b8ad1978dac7b35182efa2ca405bda1b9
|
4
|
+
data.tar.gz: d91a9cfc49ae241e825559436fc2e2e88c6a2af427b05be6e6355d8c8390b6a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 432f514112960806adc43ca26e4627aa0faf4dd1a164a8356aab04eaa532a49f1c38920327f34cfebe9fa0143016863be0777f0c0c838463430fbc8179dc4909
|
7
|
+
data.tar.gz: f20d5d091abe3c49fd7202afa6f6acd09b1fa7f74fdd71b48f67f8f545b676a6012907e1029d59c8575c7ec3e932b5ba40a313159cb791bca5fc26a431403fee
|
data/CHANGELOG.md
CHANGED
data/ext/num4equ/CNum4Equ.c
CHANGED
@@ -6,10 +6,12 @@
|
|
6
6
|
|
7
7
|
static double CNum4Equ_doNewtonMethodFFI(double a, Func func, DFunc dFunc, int *ok);
|
8
8
|
static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *ok);
|
9
|
+
static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok);
|
9
10
|
|
10
11
|
static CNum4Equ _cNum4Equ = {
|
11
12
|
.FP_newtonMethodFFI = CNum4Equ_doNewtonMethodFFI,
|
12
13
|
.FP_bisectionMethodFFI = CNum4Equ_doBisectionMethodFFI,
|
14
|
+
.FP_secantMethodFFI = CNum4Equ_doSecantMethodFFI,
|
13
15
|
};
|
14
16
|
|
15
17
|
/**************************************/
|
@@ -32,6 +34,13 @@ double CNum4Equ_bisectionMethodFFI(double a, double b, Func func, int *ok)
|
|
32
34
|
|
33
35
|
return _cNum4Equ.FP_bisectionMethodFFI(a, b, func, ok);
|
34
36
|
}
|
37
|
+
double CNum4Equ_secantMethodFFI(double a, double b, Func func, int *ok)
|
38
|
+
{
|
39
|
+
assert(func != 0);
|
40
|
+
assert(a < b);
|
41
|
+
|
42
|
+
return _cNum4Equ.FP_secantMethodFFI(a, b, func, ok);
|
43
|
+
}
|
35
44
|
/**************************************/
|
36
45
|
/* 処理実行部 */
|
37
46
|
/**************************************/
|
@@ -67,7 +76,7 @@ static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *
|
|
67
76
|
double xc;
|
68
77
|
|
69
78
|
*ok = (fa * fb) < 0 ? 0 : -1;
|
70
|
-
if (0 !=
|
79
|
+
if (0 != ok) { return 0; }
|
71
80
|
do {
|
72
81
|
xc = (a + b) / 2.0;
|
73
82
|
fxc = func(xc);
|
@@ -81,4 +90,33 @@ static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *
|
|
81
90
|
} while(fxc != 0 && fabs(b - a) > EPS);
|
82
91
|
return xc;
|
83
92
|
}
|
93
|
+
static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok)
|
94
|
+
{
|
95
|
+
double new_x = 0.0;
|
96
|
+
double x_n = b;
|
97
|
+
double x_n_1 = a;
|
98
|
+
double fa = 0.0;
|
99
|
+
double fb = 0.0;
|
100
|
+
double df;
|
101
|
+
long idx = 0;
|
102
|
+
|
103
|
+
*ok = 0;
|
104
|
+
do {
|
105
|
+
fa = func(x_n_1);
|
106
|
+
fb = func(x_n);
|
107
|
+
df = (x_n - x_n_1 ) / (fb - fa);
|
108
|
+
new_x = x_n - fb * df;
|
109
|
+
if (fabs(fb * df) < EPS) break;
|
110
|
+
if (fabs(func(new_x)) < EPS) break;
|
111
|
+
idx++;
|
112
|
+
if (100000 < idx) {
|
113
|
+
*ok = -1;
|
114
|
+
break;
|
115
|
+
}
|
116
|
+
x_n_1 = x_n;
|
117
|
+
x_n = new_x;
|
118
|
+
} while(1);
|
119
|
+
return new_x;
|
120
|
+
}
|
121
|
+
|
84
122
|
|
data/ext/num4equ/CNum4Equ.h
CHANGED
@@ -12,6 +12,7 @@ struct _CNum4Equ
|
|
12
12
|
{
|
13
13
|
double (*FP_newtonMethodFFI)(double a, Func func, DFunc dFunc, int *ok);
|
14
14
|
double (*FP_bisectionMethodFFI)(double a, double b, Func func, int *ok);
|
15
|
+
double (*FP_secantMethodFFI)(double a, double b, Func func, int *ok);
|
15
16
|
};
|
16
17
|
/**********************************************/
|
17
18
|
/* definen宣言 */
|
@@ -22,4 +23,5 @@ struct _CNum4Equ
|
|
22
23
|
/**********************************************/
|
23
24
|
double CNum4Equ_newtonMethodFFI(double a, Func func, DFunc dFunc, int *ok);
|
24
25
|
double CNum4Equ_bisectionMethodFFI(double a, double b, Func func, int *ok);
|
26
|
+
double CNum4Equ_secantMethodFFI(double a, double b, Func func, int *ok);
|
25
27
|
#endif
|
data/lib/num4equ.rb
CHANGED
@@ -8,13 +8,23 @@ module Num4EquLib
|
|
8
8
|
extend FFI::Library
|
9
9
|
|
10
10
|
ffi_lib FFI::Compiler::Loader.find('num4equ')
|
11
|
+
# @overload func(a)
|
12
|
+
# @yield [a] 関数
|
13
|
+
# @yieldparam [double] aの値
|
14
|
+
# @return [double] xの値
|
11
15
|
callback :f, [:double], :double
|
16
|
+
# @overload dfunc(a)
|
17
|
+
# @yield [a] 関数に対する微分関数
|
18
|
+
# @yieldparam [double] aの値
|
19
|
+
# @return [double] xの値
|
12
20
|
callback :df, [:double], :double
|
13
21
|
|
14
22
|
attach_function :newtonMethodFFI,
|
15
23
|
:CNum4Equ_newtonMethodFFI, [:double, :f, :df, :buffer_out], :double
|
16
24
|
attach_function :bisectionMethodFFI,
|
17
25
|
:CNum4Equ_bisectionMethodFFI, [:double, :double, :f, :buffer_out], :double
|
26
|
+
attach_function :secantMethodFFI,
|
27
|
+
:CNum4Equ_secantMethodFFI, [:double, :double, :f, :buffer_out], :double
|
18
28
|
class << self
|
19
29
|
# @overload newtonMethod(a, func, dfunc)
|
20
30
|
# ニュートン法による解法
|
@@ -50,7 +60,26 @@ module Num4EquLib
|
|
50
60
|
end
|
51
61
|
return x
|
52
62
|
end
|
63
|
+
# @overload secantMethod(a, b, func)
|
64
|
+
# 割線法による解法
|
65
|
+
# @param [double] a aの値
|
66
|
+
# @param [double] b bの値
|
67
|
+
# @param [callback] func aに対する値を計算
|
68
|
+
# @return [double] xの値
|
69
|
+
# @raise RangeError
|
70
|
+
def secantMethod(a, b, func)
|
71
|
+
ok_ptr = FFI::MemoryPointer.new :int
|
72
|
+
x = secantMethodFFI(a, b, func, ok_ptr)
|
73
|
+
ok = ok_ptr.read_int
|
74
|
+
ok_ptr.free()
|
75
|
+
if ok < 0 then
|
76
|
+
raise RangeError.new("a:" + a.to_s + " " + "b:" + b.to_s)
|
77
|
+
end
|
78
|
+
return x
|
79
|
+
end
|
53
80
|
|
54
|
-
private :newtonMethodFFI
|
81
|
+
private :newtonMethodFFI
|
82
|
+
private :bisectionMethodFFI
|
83
|
+
private :secantMethodFFI
|
55
84
|
end
|
56
85
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: num4equ
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- siranovel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi-compiler
|
@@ -69,7 +69,7 @@ licenses:
|
|
69
69
|
- MIT
|
70
70
|
metadata:
|
71
71
|
changelog_uri: http://github.com/siranovel/num4equation/blob/main/CHANGELOG.md
|
72
|
-
documentation_uri: https://rubydoc.info/gems/num4equ/0.0.
|
72
|
+
documentation_uri: https://rubydoc.info/gems/num4equ/0.0.9
|
73
73
|
homepage_uri: http://github.com/siranovel/num4equation
|
74
74
|
post_install_message:
|
75
75
|
rdoc_options: []
|