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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df19fd2bb0a886f566c14a1cbfc2a4cc27de3f720a6cd96fa664e10d14a5d412
4
- data.tar.gz: 31f369bdc107b02c4aa6472dc38c5ebcecd46f4ec74f380d24c0d4f2c003685d
3
+ metadata.gz: 0f4d45a4303869d3bc6c7a47da7dddf6cc67f47e6de2f96be6d0e04a2f0fefd0
4
+ data.tar.gz: 4c4cc2f0c5c88d016826d5575df652ce113a7c934bf693332eac4e5d8d8a43fa
5
5
  SHA512:
6
- metadata.gz: c45aa264ded3405d2e9fac971f3dc79ed51fb135a577b823ac64b463a6c2a7d52684897e46d791bb985310b6f3da449759c77006ab143a80966fdbbb00740546
7
- data.tar.gz: ed545922c2a69db002d7d49b6caeb583caac170292e2e4503831ed178bcccefc85b6079d00fcdee9ff77d2b5aac4eeff3e61f1674d3087907798a89fd5fcfa52
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 LICENSE.
21
+ - Add file of CHANGELOH.md.
9
22
 
10
23
  ## [0.0.7] - 2023-03-17
11
24
 
@@ -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, DFunc dFunc, int *ok);
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, DFunc dFunc, int *ok)
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, dFunc, ok);
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
- static double CNum4Equ_doNewtonMethodFFI(double a, Func func, DFunc dFunc, int *ok)
46
+ /*
47
+ * ニュートン法
48
+ */
49
+ static double CNum4Equ_doNewtonMethodFFI(double a, Func func, int *ok)
39
50
  {
40
- double xn;
41
- double x0 = a;
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 f;
57
+ double fx;
58
+ double fxh;
48
59
  double df;
49
60
 
50
- x0 = xn;
51
- f = func(x0);
52
- df = dFunc(x0);
53
- xn = -1 * f / df + x0;
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(fabs(xn - x0) > EPS);
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
 
@@ -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, DFunc dFunc, int *ok);
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-6)
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, DFunc dFunc, int *ok);
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, :df, :buffer_out], :double
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, dfunc)
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, dfunc)
30
+ def newtonMethod(a, func)
27
31
  ok_ptr = FFI::MemoryPointer.new :int
28
- x = newtonMethodFFI(a, func, dfunc, ok_ptr)
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
- private :newtonMethodFFI, :bisectionMethodFFI
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.0.8
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-04-16 00:00:00.000000000 Z
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.0.8
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: