num4equ 0.0.8 → 0.1.1

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