num4diff 0.4.5 → 0.5.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: fc6954bb9f3eb7e7b35429c7f4429aa60f5a998ce1934dbe79b0117ae1013a51
4
- data.tar.gz: 3caa0e4e7b083a435b374c0739134ac583ab149f30306327783cf239896c263b
3
+ metadata.gz: 236c79b20fa3b5aff7de7ac41181c458a3d42cf2c846e8a1d9e01265729fd762
4
+ data.tar.gz: d0ace9350577ba3cadeaa37f05061a406274194357b8912df2890efc1c0f4e38
5
5
  SHA512:
6
- metadata.gz: b9e5780c5bbfecb0dd284e561775f78a8cff1530194817f4ac58f22db6f0103e851558a548e3cf04d54e4f4d009a2cad2508d1f5bb6a2e2cf33f8aa59a50174e
7
- data.tar.gz: 2d4736748fa20f35f7ba11fa0e614f165d9b30a73038d4942262c30f3951d33db45bf0ffb46970197b45e3d98e51d639365a3845e69a8ebc52c4db309be9569b
6
+ metadata.gz: d125cbc9bfdc8cc65ff57c9057c579ce1030c167f60af69c5723dc3c08d71fcb2c36822df3671dab5b0ca944b62de885e21e795943739e31b22d8505464ed3c9
7
+ data.tar.gz: ee2914de197552cd9be54a17e135da56cfb2a0ef36076fb14d66bedf379b3acf31d07f4a1db95a14d9d2aa0e39fdf38b8326979f200f59e4cb8b6fed44306b67
data/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.5.1] - 2023-05-18
6
+
7
+ ### Fixed
8
+ - Fix correspondence of k step.
9
+
10
+ ### Changed
11
+ - chg wiki-uri
12
+
13
+ ## [0.4.6] - 2023-04-24
14
+
15
+ ### Fixed
16
+ - Fix Split into single-step and multi-step solutions.
17
+
5
18
  ## [0.4.5] - 2023-04-14
6
19
 
7
20
  ### Fixed
@@ -6,14 +6,47 @@
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 y0, double h, Func func);
10
- static double CNum4Diff_doAdamsMoultonMethod(double a, double b, double y0, double h, Func func);
9
+ static double CNum4Diff_doAdamsBashforthMethod(int k, double a, double b, double y0, double h, Func func);
10
+ static double CNum4Diff_doAdamsMoultonMethod(int k, double a, double b, double y0, double h, Func func);
11
11
  static CNum4Diff _cNum4Diff = {
12
+ .tierMethod = {
12
13
  .FP_eulerMethod = CNum4Diff_doEulerMethod,
13
14
  .FP_heunMethod = CNum4Diff_doHeunMethod,
14
15
  .FP_rungeKuttaMethod = CNum4Diff_doRungeKuttaMethod,
16
+ },
17
+ .multistageMethod = {
15
18
  .FP_adamsBashforthMethod = CNum4Diff_doAdamsBashforthMethod,
16
19
  .FP_adamsMoultonMethod = CNum4Diff_doAdamsMoultonMethod,
20
+ },
21
+ };
22
+ /* アダムステーブル */
23
+ static AdamsTbl bash[] = {
24
+ [0] = {.s = 2, // k = 2
25
+ .bv = {[0] = 3, [1] = -1}
26
+ },
27
+ [1] = {.s = 12, // k = 3
28
+ .bv = {[0] = 23, [1] = -16, [2] = 5}
29
+ },
30
+ [2] = {.s = 24, // k = 4
31
+ .bv = {[0] = 55, [1] = -59, [2] = 37, [3] = -9}
32
+ },
33
+ [3] = {.s = 720, // k = 5
34
+ .bv = {[0] = 1901,[1] = -2774,[2] = 2616,[3] = -1274, [4] = 251}
35
+ },
36
+ };
37
+ static AdamsTbl moulton[] = {
38
+ [0] = {.s = 2, // k = 2
39
+ .bv = {[0] = 1, [1] = 1}
40
+ },
41
+ [1] = {.s = 12, // k = 3
42
+ .bv = {[0] = 5, [1] = 8, [2] = -1}
43
+ },
44
+ [2] = {.s = 24, // k = 4
45
+ .bv = {[0] = 9, [1] = 19, [2] = -5, [3] = 1}
46
+ },
47
+ [3] = {.s = 720, // k = 5
48
+ .bv = {[0] = 251,[1] = 646,[2] = -264,[3] = 106,[4] = -19}
49
+ },
17
50
  };
18
51
  /**************************************/
19
52
  /* InterFface部 */
@@ -21,37 +54,39 @@ static CNum4Diff _cNum4Diff = {
21
54
  /**************************************/
22
55
  /* Class部 */
23
56
  /**************************************/
24
- double CNum4Diff_eulerMethod(double yi, double xi, double h, Func func)
57
+ double CNum4Diff_Tier_eulerMethod(double yi, double xi, double h, Func func)
25
58
  {
26
59
  assert(func != 0);
27
60
 
28
- return _cNum4Diff.FP_eulerMethod(yi, xi, h, func);
61
+ return _cNum4Diff.tierMethod.FP_eulerMethod(yi, xi, h, func);
29
62
  }
30
- double CNum4Diff_heunMethod(double yi, double xi, double h, Func func)
63
+ double CNum4Diff_Tier_heunMethod(double yi, double xi, double h, Func func)
31
64
  {
32
65
  assert(func != 0);
33
66
 
34
- return _cNum4Diff.FP_heunMethod(yi, xi, h, func);
67
+ return _cNum4Diff.tierMethod.FP_heunMethod(yi, xi, h, func);
35
68
  }
36
- double CNum4Diff_rungeKuttaMethod(double yi, double xi, double h, Func func)
69
+ double CNum4Diff_Tier_rungeKuttaMethod(double yi, double xi, double h, Func func)
37
70
  {
38
71
  assert(func != 0);
39
72
 
40
- return _cNum4Diff.FP_rungeKuttaMethod(yi, xi, h, func);
73
+ return _cNum4Diff.tierMethod.FP_rungeKuttaMethod(yi, xi, h, func);
41
74
  }
42
- double CNum4Diff_adamsBashforthMethod(double a, double b, double y0, double h, Func func)
75
+ double CNum4Diff_Multistage_adamsBashforthMethod(int k, double a, double b, double y0, double h, Func func)
43
76
  {
44
77
  assert(func != 0);
45
78
  assert(a < b);
79
+ assert((1 < k) && (k < 6));
46
80
 
47
- return _cNum4Diff.FP_adamsBashforthMethod(a, b, y0, h, func);
81
+ return _cNum4Diff.multistageMethod.FP_adamsBashforthMethod(k, a, b, y0, h, func);
48
82
  }
49
- double CNum4Diff_adamsMoultonMethod(double a, double b, double y0, double h, Func func)
83
+ double CNum4Diff_Multistage_adamsMoultonMethod(int k, double a, double b, double y0, double h, Func func)
50
84
  {
51
85
  assert(func != 0);
52
86
  assert(a < b);
87
+ assert((1 < k) && (k < 6));
53
88
 
54
- return _cNum4Diff.FP_adamsMoultonMethod(a, b, y0, h, func);
89
+ return _cNum4Diff.multistageMethod.FP_adamsMoultonMethod(k, a, b, y0, h, func);
55
90
  }
56
91
  /**************************************/
57
92
  /* 処理実行部 */
@@ -97,50 +132,72 @@ static double CNum4Diff_doRungeKuttaMethod(double yi, double xi, double h, Func
97
132
  return yi + (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;
98
133
  }
99
134
  /*
100
- * アダムス・バッシュフォース法(3段)
135
+ * アダムス・バッシュフォース法(k段)
101
136
  */
102
- static double CNum4Diff_doAdamsBashforthMethod(double a, double b, double y0, double h, Func func)
137
+ static double CNum4Diff_doAdamsBashforthMethod(int k, double a, double b, double y0, double h, Func func)
103
138
  {
104
139
  double xi = a;
105
- double fi;
106
- double fi1 = 0;
107
- double fi2 = 0;
108
140
  double y = 0.0;
141
+ double *f = malloc(sizeof(double) * k);
142
+ int i;
143
+ double bk;
109
144
 
110
- fi2 = y0;
111
- xi = xi + h;
112
- fi1 = CNum4Diff_rungeKuttaMethod(fi2, xi, h, func);
113
- y = fi1;
145
+ f[k - 1] = y0;
146
+ for (i = 0; i < k - 2; i++) {
147
+ f[k - (i + 2)] = CNum4Diff_Tier_rungeKuttaMethod(f[k - (i + 1)], xi, h, func);
148
+ }
114
149
  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;
150
+ f[0] = CNum4Diff_Tier_rungeKuttaMethod(f[1], xi, h, func);
151
+ // 予測子
152
+ bk = 0.0;
153
+ for (i = 0; i < k; i++) {
154
+ bk += bash[k - 2].bv[i] * f[i];
155
+ }
156
+ y = f[0] + h * bk / bash[k - 2].s;
157
+ // f値をずらす
158
+ for (i = 0; i < k - 1; i++) {
159
+ f[k - (i + 1)] = f[k - (i + 2)];
160
+ }
119
161
  }
120
162
  return y;
121
163
  }
122
164
  /*
123
- * アダムス・ムルトン法(3段)
165
+ * アダムス・ムルトン法(k段)
124
166
  */
125
- static double CNum4Diff_doAdamsMoultonMethod(double a, double b, double y0, double h, Func func)
167
+ static double CNum4Diff_doAdamsMoultonMethod(int k, double a, double b, double y0, double h, Func func)
126
168
  {
127
169
  double xi = a;
128
- double fi;
129
- double fi1 = 0;
130
- double fi2 = 0;
131
170
  double y_pred = 0.0;
132
171
  double y = 0.0;
172
+ double *f = malloc(sizeof(double) * k);
173
+ double *f2 = malloc(sizeof(double) * (k + 1));
174
+ int i;
175
+ double bk;
133
176
 
134
- fi2 = y0;
135
- xi = xi + h;
136
- fi1 = CNum4Diff_rungeKuttaMethod(fi2, xi, h, func);
137
- y = fi1;
177
+ f[k - 1] = y0;
178
+ for (i = 0; i < k - 2; i++) {
179
+ f[k - (i + 2)] = CNum4Diff_Tier_rungeKuttaMethod(f[k - (i + 1)], xi, h, func);
180
+ }
138
181
  for (xi = xi + h; xi < b; xi += h) {
139
- fi = CNum4Diff_rungeKuttaMethod(fi1, xi, h, func);
140
- y_pred = y + h * (23 * fi - 16 * fi1 + 5 * fi2) / 12.0;
141
- y = y + h * (5 * y_pred + 8 * fi -1 * fi1) / 12.0;
142
- fi2 = fi1;
143
- fi1 = fi;
182
+ f[0] = CNum4Diff_Tier_rungeKuttaMethod(f[1], xi, h, func);
183
+ // 予測子
184
+ bk = 0.0;
185
+ for (i = 0; i < k; i++) {
186
+ bk += bash[k - 2].bv[i] * f[i];
187
+ f2[i + 1] = f[i];
188
+ }
189
+ y_pred = f[0] + h * bk / bash[k - 2].s;
190
+ f2[0] = y_pred;
191
+ // 修正子
192
+ bk = 0.0;
193
+ for (i = 0; i < k; i++) {
194
+ bk += moulton[k - 2].bv[i] * f2[i];
195
+ }
196
+ y = f[0] + h * bk / moulton[k - 2].s;
197
+ // f値をずらす
198
+ for (i = 0; i < k - 1; i++) {
199
+ f[k - (i + 1)] = f[k - (i + 2)];
200
+ }
144
201
  }
145
202
  return y;
146
203
  }
@@ -4,27 +4,43 @@
4
4
  /**************************************/
5
5
  /* 構造体宣言 */
6
6
  /**************************************/
7
- typedef struct _CNum4Diff CNum4Diff;
7
+ typedef struct _CNum4Diff CNum4Diff;
8
+ typedef struct _CNum4DiffTier CNum4DiffTier;
9
+ typedef struct _CNum4DiffMultistage CNum4DiffMultistage;
8
10
  typedef double (*Func)(double x);
11
+ typedef struct _AdamsTbl AdamsTbl;
9
12
 
10
- struct _CNum4Diff
13
+ struct _AdamsTbl
14
+ {
15
+ int s;
16
+ int bv[5];
17
+ };
18
+ struct _CNum4DiffTier
19
+ {
20
+ double (*FP_eulerMethod)(double yi, double xi, double h, Func func);
21
+ double (*FP_heunMethod)(double yi, double xi, double h, Func func);
22
+ double (*FP_rungeKuttaMethod)(double yi, double xi, double h, Func func);
23
+ };
24
+ struct _CNum4DiffMultistage
11
25
  {
12
- double (*FP_eulerMethod)(double yi, double xi, double h, Func func);
13
- double (*FP_heunMethod)(double yi, double xi, double h, Func func);
14
- double (*FP_rungeKuttaMethod)(double yi, double xi, double h, Func func);
15
- double (*FP_adamsBashforthMethod)(double a, double b, double y0, double h, Func func);
16
- double (*FP_adamsMoultonMethod)(double a, double b, double y0, double h, Func func);
26
+ double (*FP_adamsBashforthMethod)(int k, double a, double b, double y0, double h, Func func);
27
+ double (*FP_adamsMoultonMethod)(int k, double a, double b, double y0, double h, Func func);
17
28
  ;
18
29
  };
30
+ struct _CNum4Diff
31
+ {
32
+ CNum4DiffTier tierMethod;
33
+ CNum4DiffMultistage multistageMethod;
34
+ };
19
35
  /**************************************/
20
36
  /* define宣言 */
21
37
  /**************************************/
22
38
  /**************************************/
23
39
  /* プロトタイプ宣言 */
24
40
  /**************************************/
25
- double CNum4Diff_eulerMethod(double yi, double xi, double h, Func func);
26
- double CNum4Diff_heunMethod(double yi, double xi, double h, Func func);
27
- double CNum4Diff_rungeKuttaMethod(double yi, double xi, double h, Func func);
28
- double CNum4Diff_adamsBashforthMethod(double a, double b, double y0, double h, Func func);
29
- double CNum4Diff_adamsMoultonMethod(double a, double b, double y0, double h, Func func);
41
+ double CNum4Diff_Tier_eulerMethod(double yi, double xi, double h, Func func);
42
+ double CNum4Diff_Tier_heunMethod(double yi, double xi, double h, Func func);
43
+ double CNum4Diff_Tier_rungeKuttaMethod(double yi, double xi, double h, Func func);
44
+ double CNum4Diff_Multistage_adamsBashforthMethod(int k, double a, double b, double y0, double h, Func func);
45
+ double CNum4Diff_Multistage_adamsMoultonMethod(int k, double a, double b, double y0, double h, Func func);
30
46
  #endif
data/lib/num4diff.rb CHANGED
@@ -26,7 +26,7 @@ module Num4DiffLib
26
26
  # @return [double] xi+hに対するyi_1の値
27
27
  #
28
28
  attach_function :eulerMethod,
29
- :CNum4Diff_eulerMethod, [:double, :double, :double, :f], :double
29
+ :CNum4Diff_Tier_eulerMethod, [:double, :double, :double, :f], :double
30
30
  #
31
31
  # ホイン法による数値計算
32
32
  # @overload heunMethod(yi, xi, h, func)
@@ -38,7 +38,7 @@ module Num4DiffLib
38
38
  # @return [double] xi+hに対するyi_1の値
39
39
  #
40
40
  attach_function :heunMethod,
41
- :CNum4Diff_heunMethod, [:double, :double, :double, :f], :double
41
+ :CNum4Diff_Tier_heunMethod, [:double, :double, :double, :f], :double
42
42
  #
43
43
  # 4次のルンゲ=クッタ法による数値計算
44
44
  # @overload rungeKuttaMethod(yi, xi, h, func)
@@ -50,10 +50,11 @@ module Num4DiffLib
50
50
  # @return [double] xi+hに対するyi_1の値
51
51
  #
52
52
  attach_function :rungeKuttaMethod,
53
- :CNum4Diff_rungeKuttaMethod, [:double, :double, :double, :f], :double
53
+ :CNum4Diff_Tier_rungeKuttaMethod, [:double, :double, :double, :f], :double
54
54
  #
55
- # アダムス・バッシュフォース法(3段)による数値計算
56
- # @overload adamsBashforthMethod(a, b, y0, h, func)
55
+ # アダムス・バッシュフォース法(k段)による数値計算
56
+ # @overload adamsBashforthMethod(k, a, b, y0, h, func)
57
+ # @param [int] k k段アダムス法
57
58
  # @param [double] a 下限値
58
59
  # @param [double] b 上限値
59
60
  # @param [double] y0 y(x0=a)の値
@@ -62,10 +63,11 @@ module Num4DiffLib
62
63
  # @return [double] [a,b]の積分値
63
64
  #
64
65
  attach_function :adamsBashforthMethod,
65
- :CNum4Diff_adamsBashforthMethod, [:double, :double, :double, :double, :f], :double
66
+ :CNum4Diff_Multistage_adamsBashforthMethod, [:int, :double, :double, :double, :double, :f], :double
66
67
  #
67
- # アダムス・ムルトン法(3段)による数値計算
68
- # @overload adamsMoultonMethod(a, b, y0, xi, h, func)
68
+ # アダムス・ムルトン法(k段)による数値計算
69
+ # @overload adamsMoultonMethod(k, a, b, y0, xi, h, func)
70
+ # @param [int] k k段アダムス法
69
71
  # @param [double] a 下限値
70
72
  # @param [double] b 上限値
71
73
  # @param [double] y0 y0 y(x0=a)の値
@@ -74,5 +76,5 @@ module Num4DiffLib
74
76
  # @return [double] [a,b]の積分値
75
77
  #
76
78
  attach_function :adamsMoultonMethod,
77
- :CNum4Diff_adamsMoultonMethod, [:double, :double, :double, :double, :f], :double
79
+ :CNum4Diff_Multistage_adamsMoultonMethod, [:int, :double, :double, :double, :double, :f], :double
78
80
  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.5
4
+ version: 0.5.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-13 00:00:00.000000000 Z
11
+ date: 2023-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi-compiler
@@ -69,7 +69,9 @@ licenses:
69
69
  - MIT
70
70
  metadata:
71
71
  changelog_uri: http://github.com/siranovel/num4different/blob/main/CHANGELOG.md
72
+ documentation_uri: https://rubydoc.info/gems/num4diff/0.5.1
72
73
  homepage_uri: http://github.com/siranovel/num4different
74
+ wiki_uri: https://github.com/siranovel/mydocs/tree/main/num4different
73
75
  post_install_message:
74
76
  rdoc_options: []
75
77
  require_paths: