num4diff 0.4.5 → 0.5.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: 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: