num4diff 0.4.6 → 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: ff5e1dfd13b71508a48cf82c7e4cfdb28f83971c410a4d33aeabf2807c840b04
4
- data.tar.gz: 67d9c83ef8cef833b636aedd31c0f686d0066272560c670159fef169e91aca4a
3
+ metadata.gz: 236c79b20fa3b5aff7de7ac41181c458a3d42cf2c846e8a1d9e01265729fd762
4
+ data.tar.gz: d0ace9350577ba3cadeaa37f05061a406274194357b8912df2890efc1c0f4e38
5
5
  SHA512:
6
- metadata.gz: f2a668107ed2dbe416f00a1a16ef6eda01832894fe5c2b8153efb948b440fa591d9ef4d33b0187da7e6fcf73dadb306c3c3b6f15f4f372cfd6a91b204e6bceae
7
- data.tar.gz: ed3e97fa67b1dc82dc409a3ed8c4a2606c6f08a6a12d5c1d690e144c3fb31d98c245decb48284abdedc3e8a56e624ef68a8b44dcaa78a88a242d9f8d57421cbe
6
+ metadata.gz: d125cbc9bfdc8cc65ff57c9057c579ce1030c167f60af69c5723dc3c08d71fcb2c36822df3671dab5b0ca944b62de885e21e795943739e31b22d8505464ed3c9
7
+ data.tar.gz: ee2914de197552cd9be54a17e135da56cfb2a0ef36076fb14d66bedf379b3acf31d07f4a1db95a14d9d2aa0e39fdf38b8326979f200f59e4cb8b6fed44306b67
data/CHANGELOG.md CHANGED
@@ -2,7 +2,15 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
- ## [0.4.5] - 2023-04-24
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
6
14
 
7
15
  ### Fixed
8
16
  - Fix Split into single-step and multi-step solutions.
@@ -6,8 +6,8 @@
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
12
  .tierMethod = {
13
13
  .FP_eulerMethod = CNum4Diff_doEulerMethod,
@@ -19,6 +19,35 @@ static CNum4Diff _cNum4Diff = {
19
19
  .FP_adamsMoultonMethod = CNum4Diff_doAdamsMoultonMethod,
20
20
  },
21
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
+ },
50
+ };
22
51
  /**************************************/
23
52
  /* InterFface部 */
24
53
  /**************************************/
@@ -43,19 +72,21 @@ double CNum4Diff_Tier_rungeKuttaMethod(double yi, double xi, double h, Func func
43
72
 
44
73
  return _cNum4Diff.tierMethod.FP_rungeKuttaMethod(yi, xi, h, func);
45
74
  }
46
- double CNum4Diff_Multistage_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)
47
76
  {
48
77
  assert(func != 0);
49
78
  assert(a < b);
79
+ assert((1 < k) && (k < 6));
50
80
 
51
- return _cNum4Diff.multistageMethod.FP_adamsBashforthMethod(a, b, y0, h, func);
81
+ return _cNum4Diff.multistageMethod.FP_adamsBashforthMethod(k, a, b, y0, h, func);
52
82
  }
53
- double CNum4Diff_Multistage_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)
54
84
  {
55
85
  assert(func != 0);
56
86
  assert(a < b);
87
+ assert((1 < k) && (k < 6));
57
88
 
58
- return _cNum4Diff.multistageMethod.FP_adamsMoultonMethod(a, b, y0, h, func);
89
+ return _cNum4Diff.multistageMethod.FP_adamsMoultonMethod(k, a, b, y0, h, func);
59
90
  }
60
91
  /**************************************/
61
92
  /* 処理実行部 */
@@ -101,50 +132,72 @@ static double CNum4Diff_doRungeKuttaMethod(double yi, double xi, double h, Func
101
132
  return yi + (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;
102
133
  }
103
134
  /*
104
- * アダムス・バッシュフォース法(3段)
135
+ * アダムス・バッシュフォース法(k段)
105
136
  */
106
- 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)
107
138
  {
108
139
  double xi = a;
109
- double fi;
110
- double fi1 = 0;
111
- double fi2 = 0;
112
140
  double y = 0.0;
141
+ double *f = malloc(sizeof(double) * k);
142
+ int i;
143
+ double bk;
113
144
 
114
- fi2 = y0;
115
- xi = xi + h;
116
- fi1 = CNum4Diff_Tier_rungeKuttaMethod(fi2, xi, h, func);
117
- 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
+ }
118
149
  for (xi = xi + h; xi < b; xi += h) {
119
- fi = CNum4Diff_Tier_rungeKuttaMethod(fi1, xi, h, func);
120
- y = y + h * (23 * fi - 16 * fi1 + 5 * fi2) / 12.0;
121
- fi2 = fi1;
122
- 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
+ }
123
161
  }
124
162
  return y;
125
163
  }
126
164
  /*
127
- * アダムス・ムルトン法(3段)
165
+ * アダムス・ムルトン法(k段)
128
166
  */
129
- 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)
130
168
  {
131
169
  double xi = a;
132
- double fi;
133
- double fi1 = 0;
134
- double fi2 = 0;
135
170
  double y_pred = 0.0;
136
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;
137
176
 
138
- fi2 = y0;
139
- xi = xi + h;
140
- fi1 = CNum4Diff_Tier_rungeKuttaMethod(fi2, xi, h, func);
141
- 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
+ }
142
181
  for (xi = xi + h; xi < b; xi += h) {
143
- fi = CNum4Diff_Tier_rungeKuttaMethod(fi1, xi, h, func);
144
- y_pred = y + h * (23 * fi - 16 * fi1 + 5 * fi2) / 12.0;
145
- y = y + h * (5 * y_pred + 8 * fi -1 * fi1) / 12.0;
146
- fi2 = fi1;
147
- 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
+ }
148
201
  }
149
202
  return y;
150
203
  }
@@ -8,7 +8,13 @@ typedef struct _CNum4Diff CNum4Diff;
8
8
  typedef struct _CNum4DiffTier CNum4DiffTier;
9
9
  typedef struct _CNum4DiffMultistage CNum4DiffMultistage;
10
10
  typedef double (*Func)(double x);
11
+ typedef struct _AdamsTbl AdamsTbl;
11
12
 
13
+ struct _AdamsTbl
14
+ {
15
+ int s;
16
+ int bv[5];
17
+ };
12
18
  struct _CNum4DiffTier
13
19
  {
14
20
  double (*FP_eulerMethod)(double yi, double xi, double h, Func func);
@@ -17,8 +23,8 @@ struct _CNum4DiffTier
17
23
  };
18
24
  struct _CNum4DiffMultistage
19
25
  {
20
- double (*FP_adamsBashforthMethod)(double a, double b, double y0, double h, Func func);
21
- 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);
22
28
  ;
23
29
  };
24
30
  struct _CNum4Diff
@@ -35,6 +41,6 @@ struct _CNum4Diff
35
41
  double CNum4Diff_Tier_eulerMethod(double yi, double xi, double h, Func func);
36
42
  double CNum4Diff_Tier_heunMethod(double yi, double xi, double h, Func func);
37
43
  double CNum4Diff_Tier_rungeKuttaMethod(double yi, double xi, double h, Func func);
38
- double CNum4Diff_Multistage_adamsBashforthMethod(double a, double b, double y0, double h, Func func);
39
- double CNum4Diff_Multistage_adamsMoultonMethod(double a, double b, double y0, 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);
40
46
  #endif
data/lib/num4diff.rb CHANGED
@@ -52,8 +52,9 @@ module Num4DiffLib
52
52
  attach_function :rungeKuttaMethod,
53
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_Multistage_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_Multistage_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.6
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-23 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,8 +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.4.6
72
+ documentation_uri: https://rubydoc.info/gems/num4diff/0.5.1
73
73
  homepage_uri: http://github.com/siranovel/num4different
74
+ wiki_uri: https://github.com/siranovel/mydocs/tree/main/num4different
74
75
  post_install_message:
75
76
  rdoc_options: []
76
77
  require_paths: