num4diff 0.4.1 → 0.4.3

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: 95791897f007359af4173789c870f3ffa8452f09fc017a536d48d37fcdc603da
4
- data.tar.gz: 524fa90d4419c943c8a3299536d1cd01e1579dba2b40fa4f7f230cf1c9b3ebb0
3
+ metadata.gz: 6149200658f494c188c57a669cd8bf2ae8c758228ab43fbdf5eaa5c936f13957
4
+ data.tar.gz: ab3f4902560d4527cac3ed1f8770b1aad1d245194fe87e375a5d218b8cdad1da
5
5
  SHA512:
6
- metadata.gz: 7e92082fecfcf942195fed655174f373b5c681bb8cb4db3824faca0a36a85df8cca4dd1eec0f4257c3139e210f81c9302673ff21447d96f5b5fdc5eab3469573
7
- data.tar.gz: 2f900014fff30736796d7ae47ca4e83abe2e579ce0664879be88e70ff7ab890d4ac602881f9b2c04c5f3223000706ef1b75ac8d43caadd4bf15edcf86afd05fd
6
+ metadata.gz: 30e9c6762756c3ea9a88b8a89b3db0bcc91a6770c831eaac165ebed648a51d61d78968a2a11df1425d2b7e4f601cacab950a7f1da88eb642d9ecd5683a60bd6f
7
+ data.tar.gz: c027beb0e8652d3ffa0d1d47e4af677bb5ffef139591ea8b7c3cd6dcd9ac40010983e7b2841d94551a8ecb81f5a4de43de46a565f8d6bb4369a027d924938576
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ num4different
2
+ =============
3
+ 数値計算による常微分方程式を解くFFI
4
+
5
+ ## decscription ##
6
+ ![num4diff](images/ucNumDiff.jpg)
7
+
8
+ 詳細は、https://siranovel.github.io/mydocs/num4different
9
+
10
+ ## Demo ##
11
+
12
+ ## VS. ##
13
+
14
+ ## Requirement ##
15
+ ruby FFIライブラリ
16
+
17
+ ## Usage ##
18
+ sample/samplez.rb ファイル参照
19
+
20
+ ## install ##
21
+
22
+ From rubygems:
23
+ ~~~
24
+ [sudo] gem install num4diff
25
+ ~~~
26
+
27
+ or from the git repository on github:
28
+ ~~~
29
+ git clone https://github.com/siranovel/num4different.git
30
+ cd num4different
31
+ jruby -S gem build *.gemspec
32
+ jruby -S gem install num4diff
33
+ ~~~
34
+
35
+ ## Contribution ##
36
+
37
+ ## Licence ##
38
+ [MIT](LICENSE)
39
+
40
+ ## Author ##
41
+
42
+ [siranovel](https://github.com/siranovel)
@@ -6,10 +6,14 @@
6
6
  static double CNum4Diff_doEulerMethod(double yi, double xi, double h, Func func);
7
7
  static double CNum4Diff_doHeunMethod(double yi, double xi, double h, Func func);
8
8
  static double CNum4Diff_doRungeKuttaMethod(double yi, double xi, double h, Func func);
9
+ static double CNum4Diff_doAdamsBashforthMethod(double a, double b, double yi, double h, Func func);
10
+ static double CNum4Diff_doAdamsMoultonMethod(double a, double b, double yi, double h, Func func);
9
11
  static CNum4Diff _cNum4Diff = {
10
- .FP_eulerMethod = CNum4Diff_doEulerMethod,
11
- .FP_heunMethod = CNum4Diff_doHeunMethod,
12
- .FP_rungeKuttaMethod = CNum4Diff_doRungeKuttaMethod,
12
+ .FP_eulerMethod = CNum4Diff_doEulerMethod,
13
+ .FP_heunMethod = CNum4Diff_doHeunMethod,
14
+ .FP_rungeKuttaMethod = CNum4Diff_doRungeKuttaMethod,
15
+ .FP_adamsBashforthMethod = CNum4Diff_doAdamsBashforthMethod,
16
+ .FP_adamsMoultonMethod = CNum4Diff_doAdamsMoultonMethod,
13
17
  };
14
18
  /**************************************/
15
19
  /* InterFface部 */
@@ -35,6 +39,20 @@ double CNum4Diff_rungeKuttaMethod(double yi, double xi, double h, Func func)
35
39
 
36
40
  return _cNum4Diff.FP_rungeKuttaMethod(yi, xi, h, func);
37
41
  }
42
+ double CNum4Diff_adamsBashforthMethod(double a, double b, double yi, double h, Func func)
43
+ {
44
+ assert(func != 0);
45
+ assert(a < b);
46
+
47
+ return _cNum4Diff.FP_adamsBashforthMethod(a, b, yi, h, func);
48
+ }
49
+ double CNum4Diff_adamsMoultonMethod(double a, double b, double yi, double h, Func func)
50
+ {
51
+ assert(func != 0);
52
+ assert(a < b);
53
+
54
+ return _cNum4Diff.FP_adamsMoultonMethod(a, b, yi, h, func);
55
+ }
38
56
  /**************************************/
39
57
  /* 処理実行部 */
40
58
  /**************************************/
@@ -57,7 +75,7 @@ static double CNum4Diff_doHeunMethod(double yi, double xi, double h, Func func)
57
75
  double k2 = 0.0;
58
76
 
59
77
  k1 = h * y; // k1 = h * f(xi, y)
60
- k2 = h * (yi + k1); // k2 = h * f(xi_h, h * f(xi + h, yi + k1)
78
+ k2 = h * (yi + k1); // k2 = h * f(xi + h, h * f(xi + h, yi + k1)
61
79
  return yi + (k1 + k2) / 2.0;
62
80
  }
63
81
  /*
@@ -78,4 +96,50 @@ static double CNum4Diff_doRungeKuttaMethod(double yi, double xi, double h, Func
78
96
  k4 = h * (yi + k3); // k4 = h * f(xi + h, yi + k3)
79
97
  return yi + (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;
80
98
  }
99
+ /*
100
+ * アダムス・バッシュフォース法(3段)
101
+ */
102
+ static double CNum4Diff_doAdamsBashforthMethod(double a, double b, double yi, double h, Func func)
103
+ {
104
+ double xi = a;
105
+ double fi;
106
+ double fi1 = 0;
107
+ double fi2 = 0;
108
+ double y = yi;
109
+
110
+ fi2 = yi;
111
+ xi = xi + h;
112
+ fi1 = CNum4Diff_rungeKuttaMethod(fi2, xi, h, func);
113
+ y = fi1;
114
+ for (xi = xi + h; xi < b; xi += h) {
115
+ fi = CNum4Diff_rungeKuttaMethod(fi1, xi, h, func);
116
+ y = y + h * (23 * fi - 16 * fi1 + 5 * fi2) / 12.0;
117
+ fi2 = fi1;
118
+ fi1 = fi;
119
+ }
120
+ return y;
121
+ }
122
+ /*
123
+ * アダムス・ムルトン法(3段)
124
+ */
125
+ static double CNum4Diff_doAdamsMoultonMethod(double a, double b, double yi, double h, Func func)
126
+ {
127
+ double xi = a;
128
+ double fi;
129
+ double fi1 = 0;
130
+ double fi2 = 0;
131
+ double y = yi;
132
+
133
+ fi2 = CNum4Diff_rungeKuttaMethod(yi, xi, h, func);
134
+ xi = xi + h;
135
+ fi1 = CNum4Diff_rungeKuttaMethod(fi2, xi, h, func);
136
+ y = fi1;
137
+ for (xi = xi + h; xi < b; xi += h) {
138
+ fi = CNum4Diff_rungeKuttaMethod(fi1, xi, h, func);
139
+ y = y + h * (5 * fi + 8 * fi1 -1 * fi2) / 12.0;
140
+ fi2 = fi1;
141
+ fi1 = fi;
142
+ }
143
+ return y;
144
+ }
81
145
 
@@ -12,6 +12,9 @@ struct _CNum4Diff
12
12
  double (*FP_eulerMethod)(double yi, double xi, double h, Func func);
13
13
  double (*FP_heunMethod)(double yi, double xi, double h, Func func);
14
14
  double (*FP_rungeKuttaMethod)(double yi, double xi, double h, Func func);
15
+ double (*FP_adamsBashforthMethod)(double a, double b, double yi, double h, Func func);
16
+ double (*FP_adamsMoultonMethod)(double a, double b, double yi, double h, Func func);
17
+ ;
15
18
  };
16
19
  /**************************************/
17
20
  /* define宣言 */
@@ -22,4 +25,6 @@ struct _CNum4Diff
22
25
  double CNum4Diff_eulerMethod(double yi, double xi, double h, Func func);
23
26
  double CNum4Diff_heunMethod(double yi, double xi, double h, Func func);
24
27
  double CNum4Diff_rungeKuttaMethod(double yi, double xi, double h, Func func);
28
+ double CNum4Diff_adamsBashforthMethod(double a, double b, double yi, double h, Func func);
29
+ double CNum4Diff_adamsMoultonMethod(double a, double b, double yi, double h, Func func);
25
30
  #endif
data/lib/num4diff.rb CHANGED
@@ -9,40 +9,70 @@ module Num4DiffLib
9
9
 
10
10
  ffi_lib FFI::Compiler::Loader.find('num4diff')
11
11
  # @overload f(xi)
12
- # @param [double] xi xiの値
12
+ # dy = f(xi)
13
+ # @yield [x] dy = f(x)
14
+ # @yieldparam [double] xi xiの値
13
15
  # @return [double] xiに対するyの値
14
16
  callback :f, [:double], :double
15
17
 
16
18
  #
17
- # @overload eulerMethod(yi, xi, h, func)
18
- # オイラー法による数値計算
19
+ # オイラー法による数値計算
20
+ # @overload eulerMethod(yi, xi, h, func)
21
+ # yi_1 = eulerMethod(yi, xi, h, func)
19
22
  # @param [double] yi xiに対するyiの値
20
23
  # @param [double] xi xiの値
21
24
  # @param [double] h 刻み幅
22
25
  # @param [callback] func xiに対する傾きを計算する関数
23
- # @return [double] xi+hに対するyiの値
26
+ # @return [double] xi+hに対するyi_1の値
24
27
  #
25
28
  attach_function :eulerMethod,
26
29
  :CNum4Diff_eulerMethod, [:double, :double, :double, :f], :double
30
+ #
31
+ # ホイン法による数値計算
27
32
  # @overload heunMethod(yi, xi, h, func)
28
- # ホイン法による数値計算
33
+ # yi_1 = heunMethod(yi, xi, h, func)
29
34
  # @param [double] yi xiに対するyiの値
30
35
  # @param [double] xi xiの値
31
36
  # @param [double] h 刻み幅
32
37
  # @param [callback] func xiに対する傾きを計算する関数
33
- # @return [double] xi+hに対するyiの値
38
+ # @return [double] xi+hに対するyi_1の値
34
39
  #
35
40
  attach_function :heunMethod,
36
41
  :CNum4Diff_heunMethod, [:double, :double, :double, :f], :double
37
42
  #
38
- # @overload rungeKuttaMethod(yi, xi, h, func)
39
- # 4次のルンゲ=クッタ法による数値計算
43
+ # 4次のルンゲ=クッタ法による数値計算
44
+ # @overload rungeKuttaMethod(yi, xi, h, func)
45
+ # yi_1 = rungeKuttaMethod(yi, xi, h, func)
40
46
  # @param [double] yi xiに対するyiの値
41
47
  # @param [double] xi xiの値
42
48
  # @param [double] h 刻み幅
43
49
  # @param [callback] func xiに対する傾きを計算する関数
44
- # @return [double] xi+hに対するyiの値
50
+ # @return [double] xi+hに対するyi_1の値
45
51
  #
46
52
  attach_function :rungeKuttaMethod,
47
53
  :CNum4Diff_rungeKuttaMethod, [:double, :double, :double, :f], :double
54
+ #
55
+ # アダムス・バッシュフォース法(3段)による数値計算
56
+ # @overload adamsBashforthMethod(a, b, yi, h, func)
57
+ # @param [double] a 下限値
58
+ # @param [double] b 上限値
59
+ # @param [double] yi xiに対するyiの値
60
+ # @param [double] h 刻み幅
61
+ # @param [callback] func xiに対する傾きを計算する関数
62
+ # @return [double] xi+hに対するyi_1の値
63
+ #
64
+ attach_function :adamsBashforthMethod,
65
+ :CNum4Diff_adamsBashforthMethod, [:double, :double, :double, :double, :f], :double
66
+ #
67
+ # アダムス・ムルトン法(3段)による数値計算
68
+ # @overload adamsMoultonMethod(yi, xi, h, func)
69
+ # @param [double] a 下限値
70
+ # @param [double] b 上限値
71
+ # @param [double] yi xiに対するyiの値
72
+ # @param [double] h 刻み幅
73
+ # @param [callback] func xiに対する傾きを計算する関数
74
+ # @return [double] xi+hに対するyi_1の値
75
+ #
76
+ attach_function :adamsMoultonMethod,
77
+ :CNum4Diff_adamsMoultonMethod, [:double, :double, :double, :double, :f], :double
48
78
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: num4diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - siranovel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-26 00:00:00.000000000 Z
11
+ date: 2023-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi-compiler
@@ -59,6 +59,7 @@ extra_rdoc_files: []
59
59
  files:
60
60
  - Gemfile
61
61
  - LICENSE
62
+ - README.md
62
63
  - ext/num4diff/CNum4Diff.c
63
64
  - ext/num4diff/CNum4Diff.h
64
65
  - ext/num4diff/Rakefile