num4equ 0.0.9 → 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: 4441f4b5ae669c3fd23a7c5a18ec3e5b8ad1978dac7b35182efa2ca405bda1b9
4
- data.tar.gz: d91a9cfc49ae241e825559436fc2e2e88c6a2af427b05be6e6355d8c8390b6a5
3
+ metadata.gz: 0f4d45a4303869d3bc6c7a47da7dddf6cc67f47e6de2f96be6d0e04a2f0fefd0
4
+ data.tar.gz: 4c4cc2f0c5c88d016826d5575df652ce113a7c934bf693332eac4e5d8d8a43fa
5
5
  SHA512:
6
- metadata.gz: 432f514112960806adc43ca26e4627aa0faf4dd1a164a8356aab04eaa532a49f1c38920327f34cfebe9fa0143016863be0777f0c0c838463430fbc8179dc4909
7
- data.tar.gz: f20d5d091abe3c49fd7202afa6f6acd09b1fa7f74fdd71b48f67f8f545b676a6012907e1029d59c8575c7ec3e932b5ba40a313159cb791bca5fc26a431403fee
6
+ metadata.gz: d897598486152d6fba6a732d36a4d4b725fe99b78b2720c12c43e0bf39d8f0c0e0db2825068c6a2a4c91490f806596279b2b429e3d2e267fe9dd87ee1bf6d498
7
+ data.tar.gz: 19c36fde2ef67d634e5bb6c206a94b589ca302cc0d3ddafb3fefea902dac03a0e326b3005b702f6a65fa4e016c26c0a668e2a5fdba627822cb3c1b6a80f2209d
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
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
+
5
13
  ## [0.0.9] - 2023-04-18
6
14
 
7
15
  ### Added
@@ -4,7 +4,7 @@
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
9
  static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok);
10
10
 
@@ -20,12 +20,11 @@ static CNum4Equ _cNum4Equ = {
20
20
  /**************************************/
21
21
  /* Class部 */
22
22
  /**************************************/
23
- double CNum4Equ_newtonMethodFFI(double a, Func func, DFunc dFunc, int *ok)
23
+ double CNum4Equ_newtonMethodFFI(double a, Func func, int *ok)
24
24
  {
25
25
  assert(func != 0);
26
- assert(dFunc != 0);
27
26
 
28
- return _cNum4Equ.FP_newtonMethodFFI(a, func, dFunc, ok);
27
+ return _cNum4Equ.FP_newtonMethodFFI(a, func, ok);
29
28
  }
30
29
  double CNum4Equ_bisectionMethodFFI(double a, double b, Func func, int *ok)
31
30
  {
@@ -42,32 +41,40 @@ double CNum4Equ_secantMethodFFI(double a, double b, Func func, int *ok)
42
41
  return _cNum4Equ.FP_secantMethodFFI(a, b, func, ok);
43
42
  }
44
43
  /**************************************/
45
- /* 処理実行部 */
44
+ /* 処理実行部 */
46
45
  /**************************************/
47
- 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)
48
50
  {
49
- double xn;
50
- double x0 = a;
51
+ double xn = a;
52
+ double xn_1;
51
53
  long idx = 0;
52
54
 
53
55
  *ok = 0;
54
- xn = x0;
55
56
  do {
56
- double f;
57
+ double fx;
58
+ double fxh;
57
59
  double df;
58
60
 
59
- x0 = xn;
60
- f = func(x0);
61
- df = dFunc(x0);
62
- 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;
63
67
  idx++;
64
68
  if (100000 < idx) {
65
69
  *ok = -1;
66
70
  break;
67
71
  }
68
- } while(fabs(xn - x0) > EPS);
72
+ } while(1);
69
73
  return xn;
70
74
  }
75
+ /*
76
+ * 2分法
77
+ */
71
78
  static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *ok)
72
79
  {
73
80
  double fa = func(a);
@@ -76,7 +83,7 @@ static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *
76
83
  double xc;
77
84
 
78
85
  *ok = (fa * fb) < 0 ? 0 : -1;
79
- if (0 != ok) { return 0; }
86
+ if (0 != *ok) { return 0; }
80
87
  do {
81
88
  xc = (a + b) / 2.0;
82
89
  fxc = func(xc);
@@ -90,6 +97,9 @@ static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *
90
97
  } while(fxc != 0 && fabs(b - a) > EPS);
91
98
  return xc;
92
99
  }
100
+ /*
101
+ * 割線法
102
+ */
93
103
  static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok)
94
104
  {
95
105
  double new_x = 0.0;
@@ -119,4 +129,3 @@ static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok)
119
129
  return new_x;
120
130
  }
121
131
 
122
-
@@ -6,22 +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);
15
14
  double (*FP_secantMethodFFI)(double a, double b, Func func, int *ok);
16
15
  };
17
16
  /**********************************************/
18
17
  /* definen宣言 */
19
18
  /**********************************************/
20
- #define EPS (1.0e-6)
19
+ #define EPS (1.0e-7)
20
+ #define DX 0.001
21
21
  /**********************************************/
22
22
  /* プロトタイプ宣言 */
23
23
  /**********************************************/
24
- double CNum4Equ_newtonMethodFFI(double a, Func func, DFunc dFunc, int *ok);
24
+ double CNum4Equ_newtonMethodFFI(double a, Func func, int *ok);
25
25
  double CNum4Equ_bisectionMethodFFI(double a, double b, Func func, int *ok);
26
26
  double CNum4Equ_secantMethodFFI(double a, double b, Func func, int *ok);
27
27
  #endif
data/lib/num4equ.rb CHANGED
@@ -13,29 +13,23 @@ module Num4EquLib
13
13
  # @yieldparam [double] aの値
14
14
  # @return [double] xの値
15
15
  callback :f, [:double], :double
16
- # @overload dfunc(a)
17
- # @yield [a] 関数に対する微分関数
18
- # @yieldparam [double] aの値
19
- # @return [double] xの値
20
- callback :df, [:double], :double
21
16
 
22
17
  attach_function :newtonMethodFFI,
23
- :CNum4Equ_newtonMethodFFI, [:double, :f, :df, :buffer_out], :double
18
+ :CNum4Equ_newtonMethodFFI, [:double, :f, :buffer_out], :double
24
19
  attach_function :bisectionMethodFFI,
25
20
  :CNum4Equ_bisectionMethodFFI, [:double, :double, :f, :buffer_out], :double
26
21
  attach_function :secantMethodFFI,
27
22
  :CNum4Equ_secantMethodFFI, [:double, :double, :f, :buffer_out], :double
28
23
  class << self
29
- # @overload newtonMethod(a, func, dfunc)
24
+ # @overload newtonMethod(a, func)
30
25
  # ニュートン法による解法
31
26
  # @param [double] a aの値
32
27
  # @param [callback] func aに対する値を計算
33
- # @param [callback] dfunc fに対する微分関数
34
28
  # @return [double] xの値
35
29
  # @raise RangeError
36
- def newtonMethod(a, func, dfunc)
30
+ def newtonMethod(a, func)
37
31
  ok_ptr = FFI::MemoryPointer.new :int
38
- x = newtonMethodFFI(a, func, dfunc, ok_ptr)
32
+ x = newtonMethodFFI(a, func, ok_ptr)
39
33
  ok = ok_ptr.read_int
40
34
  ok_ptr.free()
41
35
  if ok < 0 then
@@ -77,7 +71,6 @@ module Num4EquLib
77
71
  end
78
72
  return x
79
73
  end
80
-
81
74
  private :newtonMethodFFI
82
75
  private :bisectionMethodFFI
83
76
  private :secantMethodFFI
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.9
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-17 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.9
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: