num4equ 0.0.9 → 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: 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: