num4equ 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df19fd2bb0a886f566c14a1cbfc2a4cc27de3f720a6cd96fa664e10d14a5d412
4
- data.tar.gz: 31f369bdc107b02c4aa6472dc38c5ebcecd46f4ec74f380d24c0d4f2c003685d
3
+ metadata.gz: 4441f4b5ae669c3fd23a7c5a18ec3e5b8ad1978dac7b35182efa2ca405bda1b9
4
+ data.tar.gz: d91a9cfc49ae241e825559436fc2e2e88c6a2af427b05be6e6355d8c8390b6a5
5
5
  SHA512:
6
- metadata.gz: c45aa264ded3405d2e9fac971f3dc79ed51fb135a577b823ac64b463a6c2a7d52684897e46d791bb985310b6f3da449759c77006ab143a80966fdbbb00740546
7
- data.tar.gz: ed545922c2a69db002d7d49b6caeb583caac170292e2e4503831ed178bcccefc85b6079d00fcdee9ff77d2b5aac4eeff3e61f1674d3087907798a89fd5fcfa52
6
+ metadata.gz: 432f514112960806adc43ca26e4627aa0faf4dd1a164a8356aab04eaa532a49f1c38920327f34cfebe9fa0143016863be0777f0c0c838463430fbc8179dc4909
7
+ data.tar.gz: f20d5d091abe3c49fd7202afa6f6acd09b1fa7f74fdd71b48f67f8f545b676a6012907e1029d59c8575c7ec3e932b5ba40a313159cb791bca5fc26a431403fee
data/CHANGELOG.md CHANGED
@@ -2,10 +2,15 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.0.9] - 2023-04-18
6
+
7
+ ### Added
8
+ - Add function of secantMethod.
9
+
5
10
  ## [0.0.8] - 2023-04-17
6
11
 
7
12
  ### Added
8
- - Add file of LICENSE.
13
+ - Add file of CHANGELOH.md.
9
14
 
10
15
  ## [0.0.7] - 2023-03-17
11
16
 
@@ -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 != *ok) { return 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
 
@@ -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, :bisectionMethodFFI
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.8
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-16 00:00:00.000000000 Z
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.8
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: []