num4equ 0.0.9 → 0.1.2

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: c9999f0550bf5719b1f533abe772b711527b6ca26608f910fc53866944eea78e
4
+ data.tar.gz: 1e898d1910107d1b81ea430ed79bdc92874413ce0320a992873bcc1c63d23f42
5
5
  SHA512:
6
- metadata.gz: 432f514112960806adc43ca26e4627aa0faf4dd1a164a8356aab04eaa532a49f1c38920327f34cfebe9fa0143016863be0777f0c0c838463430fbc8179dc4909
7
- data.tar.gz: f20d5d091abe3c49fd7202afa6f6acd09b1fa7f74fdd71b48f67f8f545b676a6012907e1029d59c8575c7ec3e932b5ba40a313159cb791bca5fc26a431403fee
6
+ metadata.gz: 71701934716dc8bd1ab3952a226cb00741fd9a335a7030328747bda8dc981b1a891a388d693a89fa72a4421b44e6446472a0ecc99bdb995576504819e9eaa955
7
+ data.tar.gz: 548a45584072da76972d4e964df7cd46b58e371c53106a978aa449abc29372552a46f726c3f1aac6016bb1df1837dcb4c98ea0a7dc97c677ae259de63ad8fe32
data/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.1.2] - 2023-05-28
6
+
7
+ ### fixed
8
+ - fix refactoring for newtonMethod
9
+
10
+ ## [0.1.1] - 2023-05-20
11
+
12
+ ### fixed
13
+ - fix use definition of derivative for newtonMethod
14
+
15
+ ### Added
16
+ - Add wiki_rui into file of gemspec.
17
+
5
18
  ## [0.0.9] - 2023-04-18
6
19
 
7
20
  ### 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,41 @@ 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 df;
57
+ double fx;
58
+ double fxh;
58
59
 
59
- x0 = xn;
60
- f = func(x0);
61
- df = dFunc(x0);
62
- xn = -1 * f / df + x0;
60
+ // xn_1 = xn - f(x)/f'(x)
61
+ // f'(x) = lim (f(x + h) - f(x)) / h
62
+ // h -> 0
63
+ fx = func(xn);
64
+ fxh = func(xn + DX);
65
+ xn_1 = xn + -1 * DX * fx / (fxh - fx);
66
+ if (fabs(xn_1 - xn) < EPS) break;
67
+ xn = xn_1;
63
68
  idx++;
64
69
  if (100000 < idx) {
65
70
  *ok = -1;
66
71
  break;
67
72
  }
68
- } while(fabs(xn - x0) > EPS);
73
+ } while(1);
69
74
  return xn;
70
75
  }
76
+ /*
77
+ * 2分法
78
+ */
71
79
  static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *ok)
72
80
  {
73
81
  double fa = func(a);
@@ -76,7 +84,7 @@ static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *
76
84
  double xc;
77
85
 
78
86
  *ok = (fa * fb) < 0 ? 0 : -1;
79
- if (0 != ok) { return 0; }
87
+ if (0 != *ok) { return 0; }
80
88
  do {
81
89
  xc = (a + b) / 2.0;
82
90
  fxc = func(xc);
@@ -90,6 +98,9 @@ static double CNum4Equ_doBisectionMethodFFI(double a, double b, Func func, int *
90
98
  } while(fxc != 0 && fabs(b - a) > EPS);
91
99
  return xc;
92
100
  }
101
+ /*
102
+ * 割線法
103
+ */
93
104
  static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok)
94
105
  {
95
106
  double new_x = 0.0;
@@ -119,4 +130,3 @@ static double CNum4Equ_doSecantMethodFFI(double a, double b, Func func, int *ok)
119
130
  return new_x;
120
131
  }
121
132
 
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.2
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-28 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.2
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: