num4equ 0.0.8 → 0.1.1
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 +14 -1
- data/ext/num4equ/CNum4Equ.c +62 -15
- data/ext/num4equ/CNum4Equ.h +6 -4
- data/lib/num4equ.rb +30 -8
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f4d45a4303869d3bc6c7a47da7dddf6cc67f47e6de2f96be6d0e04a2f0fefd0
|
4
|
+
data.tar.gz: 4c4cc2f0c5c88d016826d5575df652ce113a7c934bf693332eac4e5d8d8a43fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d897598486152d6fba6a732d36a4d4b725fe99b78b2720c12c43e0bf39d8f0c0e0db2825068c6a2a4c91490f806596279b2b429e3d2e267fe9dd87ee1bf6d498
|
7
|
+
data.tar.gz: 19c36fde2ef67d634e5bb6c206a94b589ca302cc0d3ddafb3fefea902dac03a0e326b3005b702f6a65fa4e016c26c0a668e2a5fdba627822cb3c1b6a80f2209d
|
data/CHANGELOG.md
CHANGED
@@ -2,10 +2,23 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## [0.1.1] - 2023-05-20
|
6
|
+
|
7
|
+
### fixed
|
8
|
+
- fix use definition of derivative for newtonMethod
|
9
|
+
|
10
|
+
### Added
|
11
|
+
- Add wiki_rui into file of gemspec.
|
12
|
+
|
13
|
+
## [0.0.9] - 2023-04-18
|
14
|
+
|
15
|
+
### Added
|
16
|
+
- Add function of secantMethod.
|
17
|
+
|
5
18
|
## [0.0.8] - 2023-04-17
|
6
19
|
|
7
20
|
### Added
|
8
|
-
- Add file of
|
21
|
+
- Add file of CHANGELOH.md.
|
9
22
|
|
10
23
|
## [0.0.7] - 2023-03-17
|
11
24
|
|
data/ext/num4equ/CNum4Equ.c
CHANGED
@@ -4,12 +4,14 @@
|
|
4
4
|
#include <math.h>
|
5
5
|
#include "CNum4Equ.h"
|
6
6
|
|
7
|
-
static double CNum4Equ_doNewtonMethodFFI(double a, Func func,
|
7
|
+
static double CNum4Equ_doNewtonMethodFFI(double a, Func func, 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
|
/**************************************/
|
@@ -18,12 +20,11 @@ static CNum4Equ _cNum4Equ = {
|
|
18
20
|
/**************************************/
|
19
21
|
/* Class部 */
|
20
22
|
/**************************************/
|
21
|
-
double CNum4Equ_newtonMethodFFI(double a, Func func,
|
23
|
+
double CNum4Equ_newtonMethodFFI(double a, Func func, int *ok)
|
22
24
|
{
|
23
25
|
assert(func != 0);
|
24
|
-
assert(dFunc != 0);
|
25
26
|
|
26
|
-
return _cNum4Equ.FP_newtonMethodFFI(a, func,
|
27
|
+
return _cNum4Equ.FP_newtonMethodFFI(a, func, ok);
|
27
28
|
}
|
28
29
|
double CNum4Equ_bisectionMethodFFI(double a, double b, Func func, int *ok)
|
29
30
|
{
|
@@ -32,33 +33,48 @@ double CNum4Equ_bisectionMethodFFI(double a, double b, Func func, int *ok)
|
|
32
33
|
|
33
34
|
return _cNum4Equ.FP_bisectionMethodFFI(a, b, func, ok);
|
34
35
|
}
|
36
|
+
double CNum4Equ_secantMethodFFI(double a, double b, Func func, int *ok)
|
37
|
+
{
|
38
|
+
assert(func != 0);
|
39
|
+
assert(a < b);
|
40
|
+
|
41
|
+
return _cNum4Equ.FP_secantMethodFFI(a, b, func, ok);
|
42
|
+
}
|
35
43
|
/**************************************/
|
36
|
-
/* 処理実行部
|
44
|
+
/* 処理実行部 */
|
37
45
|
/**************************************/
|
38
|
-
|
46
|
+
/*
|
47
|
+
* ニュートン法
|
48
|
+
*/
|
49
|
+
static double CNum4Equ_doNewtonMethodFFI(double a, Func func, int *ok)
|
39
50
|
{
|
40
|
-
double xn;
|
41
|
-
double
|
51
|
+
double xn = a;
|
52
|
+
double xn_1;
|
42
53
|
long idx = 0;
|
43
54
|
|
44
55
|
*ok = 0;
|
45
|
-
xn = x0;
|
46
56
|
do {
|
47
|
-
double
|
57
|
+
double fx;
|
58
|
+
double fxh;
|
48
59
|
double df;
|
49
60
|
|
50
|
-
|
51
|
-
|
52
|
-
df =
|
53
|
-
|
61
|
+
fx = func(xn);
|
62
|
+
fxh = func(xn + DX);
|
63
|
+
df = (fxh - fx) / DX;
|
64
|
+
xn_1 = xn + -1 * fx / df;
|
65
|
+
if (fabs(xn_1 - xn) < EPS) break;
|
66
|
+
xn = xn_1;
|
54
67
|
idx++;
|
55
68
|
if (100000 < idx) {
|
56
69
|
*ok = -1;
|
57
70
|
break;
|
58
71
|
}
|
59
|
-
} while(
|
72
|
+
} while(1);
|
60
73
|
return xn;
|
61
74
|
}
|
75
|
+
/*
|
76
|
+
* 2分法
|
77
|
+
*/
|
62
78
|
static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *ok)
|
63
79
|
{
|
64
80
|
double fa = func(a);
|
@@ -81,4 +97,35 @@ static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *
|
|
81
97
|
} while(fxc != 0 && fabs(b - a) > EPS);
|
82
98
|
return xc;
|
83
99
|
}
|
100
|
+
/*
|
101
|
+
* 割線法
|
102
|
+
*/
|
103
|
+
static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok)
|
104
|
+
{
|
105
|
+
double new_x = 0.0;
|
106
|
+
double x_n = b;
|
107
|
+
double x_n_1 = a;
|
108
|
+
double fa = 0.0;
|
109
|
+
double fb = 0.0;
|
110
|
+
double df;
|
111
|
+
long idx = 0;
|
112
|
+
|
113
|
+
*ok = 0;
|
114
|
+
do {
|
115
|
+
fa = func(x_n_1);
|
116
|
+
fb = func(x_n);
|
117
|
+
df = (x_n - x_n_1 ) / (fb - fa);
|
118
|
+
new_x = x_n - fb * df;
|
119
|
+
if (fabs(fb * df) < EPS) break;
|
120
|
+
if (fabs(func(new_x)) < EPS) break;
|
121
|
+
idx++;
|
122
|
+
if (100000 < idx) {
|
123
|
+
*ok = -1;
|
124
|
+
break;
|
125
|
+
}
|
126
|
+
x_n_1 = x_n;
|
127
|
+
x_n = new_x;
|
128
|
+
} while(1);
|
129
|
+
return new_x;
|
130
|
+
}
|
84
131
|
|
data/ext/num4equ/CNum4Equ.h
CHANGED
@@ -6,20 +6,22 @@
|
|
6
6
|
/**********************************************/
|
7
7
|
typedef struct _CNum4Equ CNum4Equ;
|
8
8
|
typedef double (*Func)(double x);
|
9
|
-
typedef double (*DFunc)(double x);
|
10
9
|
|
11
10
|
struct _CNum4Equ
|
12
11
|
{
|
13
|
-
double (*FP_newtonMethodFFI)(double a, Func func,
|
12
|
+
double (*FP_newtonMethodFFI)(double a, Func func, int *ok);
|
14
13
|
double (*FP_bisectionMethodFFI)(double a, double b, Func func, int *ok);
|
14
|
+
double (*FP_secantMethodFFI)(double a, double b, Func func, int *ok);
|
15
15
|
};
|
16
16
|
/**********************************************/
|
17
17
|
/* definen宣言 */
|
18
18
|
/**********************************************/
|
19
|
-
#define EPS (1.0e-
|
19
|
+
#define EPS (1.0e-7)
|
20
|
+
#define DX 0.001
|
20
21
|
/**********************************************/
|
21
22
|
/* プロトタイプ宣言 */
|
22
23
|
/**********************************************/
|
23
|
-
double CNum4Equ_newtonMethodFFI(double a, Func func,
|
24
|
+
double CNum4Equ_newtonMethodFFI(double a, Func func, 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,24 +8,28 @@ 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
|
12
|
-
callback :df, [:double], :double
|
13
16
|
|
14
17
|
attach_function :newtonMethodFFI,
|
15
|
-
:CNum4Equ_newtonMethodFFI, [:double, :f, :
|
18
|
+
:CNum4Equ_newtonMethodFFI, [:double, :f, :buffer_out], :double
|
16
19
|
attach_function :bisectionMethodFFI,
|
17
20
|
:CNum4Equ_bisectionMethodFFI, [:double, :double, :f, :buffer_out], :double
|
21
|
+
attach_function :secantMethodFFI,
|
22
|
+
:CNum4Equ_secantMethodFFI, [:double, :double, :f, :buffer_out], :double
|
18
23
|
class << self
|
19
|
-
# @overload newtonMethod(a, func
|
24
|
+
# @overload newtonMethod(a, func)
|
20
25
|
# ニュートン法による解法
|
21
26
|
# @param [double] a aの値
|
22
27
|
# @param [callback] func aに対する値を計算
|
23
|
-
# @param [callback] dfunc fに対する微分関数
|
24
28
|
# @return [double] xの値
|
25
29
|
# @raise RangeError
|
26
|
-
def newtonMethod(a, func
|
30
|
+
def newtonMethod(a, func)
|
27
31
|
ok_ptr = FFI::MemoryPointer.new :int
|
28
|
-
x = newtonMethodFFI(a, func,
|
32
|
+
x = newtonMethodFFI(a, func, ok_ptr)
|
29
33
|
ok = ok_ptr.read_int
|
30
34
|
ok_ptr.free()
|
31
35
|
if ok < 0 then
|
@@ -50,7 +54,25 @@ module Num4EquLib
|
|
50
54
|
end
|
51
55
|
return x
|
52
56
|
end
|
53
|
-
|
54
|
-
|
57
|
+
# @overload secantMethod(a, b, func)
|
58
|
+
# 割線法による解法
|
59
|
+
# @param [double] a aの値
|
60
|
+
# @param [double] b bの値
|
61
|
+
# @param [callback] func aに対する値を計算
|
62
|
+
# @return [double] xの値
|
63
|
+
# @raise RangeError
|
64
|
+
def secantMethod(a, b, func)
|
65
|
+
ok_ptr = FFI::MemoryPointer.new :int
|
66
|
+
x = secantMethodFFI(a, b, func, ok_ptr)
|
67
|
+
ok = ok_ptr.read_int
|
68
|
+
ok_ptr.free()
|
69
|
+
if ok < 0 then
|
70
|
+
raise RangeError.new("a:" + a.to_s + " " + "b:" + b.to_s)
|
71
|
+
end
|
72
|
+
return x
|
73
|
+
end
|
74
|
+
private :newtonMethodFFI
|
75
|
+
private :bisectionMethodFFI
|
76
|
+
private :secantMethodFFI
|
55
77
|
end
|
56
78
|
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.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- siranovel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi-compiler
|
@@ -69,8 +69,9 @@ 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.
|
72
|
+
documentation_uri: https://rubydoc.info/gems/num4equ/0.1.1
|
73
73
|
homepage_uri: http://github.com/siranovel/num4equation
|
74
|
+
wiki_uri: https://github.com/siranovel/mydocs/tree/main/num4equation
|
74
75
|
post_install_message:
|
75
76
|
rdoc_options: []
|
76
77
|
require_paths:
|