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 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: []