diff-grok 1.0.10 → 1.1.0

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.
Files changed (212) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/CLAUDE.md +98 -0
  3. package/README.MD +100 -24
  4. package/images/E5.png +0 -0
  5. package/images/HIRES.png +0 -0
  6. package/images/OREGO.png +0 -0
  7. package/images/POLL-full.png +0 -0
  8. package/images/ROBER.png +0 -0
  9. package/images/VDP0L.png +0 -0
  10. package/index.js +1 -1
  11. package/index.js.map +1 -1
  12. package/index.ts +2 -1
  13. package/jest.config.js +1 -0
  14. package/package.json +1 -1
  15. package/src/examples/bioreactor.js +125 -0
  16. package/src/examples/bioreactor.js.map +1 -0
  17. package/src/examples/bioreactor.ts +132 -0
  18. package/src/examples/cyclic-model.js +3 -1
  19. package/src/examples/cyclic-model.js.map +1 -1
  20. package/src/examples/cyclic-model.ts +3 -1
  21. package/src/solver-tools/ab4-method.js +332 -0
  22. package/src/solver-tools/ab4-method.js.map +1 -0
  23. package/src/solver-tools/ab4-method.ts +395 -0
  24. package/src/solver-tools/ab5-method.js +334 -0
  25. package/src/solver-tools/ab5-method.js.map +1 -0
  26. package/src/solver-tools/ab5-method.ts +397 -0
  27. package/src/solver-tools/index.js +6 -0
  28. package/src/solver-tools/index.js.map +1 -1
  29. package/src/solver-tools/index.ts +6 -0
  30. package/src/solver-tools/lsoda/blas.js +246 -0
  31. package/src/solver-tools/lsoda/blas.js.map +1 -0
  32. package/src/solver-tools/lsoda/blas.ts +267 -0
  33. package/src/solver-tools/lsoda/cfode.js +73 -0
  34. package/src/solver-tools/lsoda/cfode.js.map +1 -0
  35. package/src/solver-tools/lsoda/cfode.ts +83 -0
  36. package/src/solver-tools/lsoda/common.js +94 -0
  37. package/src/solver-tools/lsoda/common.js.map +1 -0
  38. package/src/solver-tools/lsoda/common.ts +135 -0
  39. package/src/solver-tools/lsoda/corfailure.js +25 -0
  40. package/src/solver-tools/lsoda/corfailure.js.map +1 -0
  41. package/src/solver-tools/lsoda/corfailure.ts +30 -0
  42. package/src/solver-tools/lsoda/correction.js +101 -0
  43. package/src/solver-tools/lsoda/correction.js.map +1 -0
  44. package/src/solver-tools/lsoda/correction.ts +119 -0
  45. package/src/solver-tools/lsoda/dense.js +110 -0
  46. package/src/solver-tools/lsoda/dense.js.map +1 -0
  47. package/src/solver-tools/lsoda/dense.ts +129 -0
  48. package/src/solver-tools/lsoda/index.js +4 -0
  49. package/src/solver-tools/lsoda/index.js.map +1 -0
  50. package/src/solver-tools/lsoda/index.ts +5 -0
  51. package/src/solver-tools/lsoda/intdy.js +43 -0
  52. package/src/solver-tools/lsoda/intdy.js.map +1 -0
  53. package/src/solver-tools/lsoda/intdy.ts +50 -0
  54. package/src/solver-tools/lsoda/lsoda.js +567 -0
  55. package/src/solver-tools/lsoda/lsoda.js.map +1 -0
  56. package/src/solver-tools/lsoda/lsoda.ts +632 -0
  57. package/src/solver-tools/lsoda/methodswitch.js +97 -0
  58. package/src/solver-tools/lsoda/methodswitch.js.map +1 -0
  59. package/src/solver-tools/lsoda/methodswitch.ts +107 -0
  60. package/src/solver-tools/lsoda/orderswitch.js +86 -0
  61. package/src/solver-tools/lsoda/orderswitch.js.map +1 -0
  62. package/src/solver-tools/lsoda/orderswitch.ts +95 -0
  63. package/src/solver-tools/lsoda/prja.js +43 -0
  64. package/src/solver-tools/lsoda/prja.js.map +1 -0
  65. package/src/solver-tools/lsoda/prja.ts +49 -0
  66. package/src/solver-tools/lsoda/scaleh.js +30 -0
  67. package/src/solver-tools/lsoda/scaleh.js.map +1 -0
  68. package/src/solver-tools/lsoda/scaleh.ts +33 -0
  69. package/src/solver-tools/lsoda/solsy.js +14 -0
  70. package/src/solver-tools/lsoda/solsy.js.map +1 -0
  71. package/src/solver-tools/lsoda/solsy.ts +18 -0
  72. package/src/solver-tools/lsoda/stoda.js +259 -0
  73. package/src/solver-tools/lsoda/stoda.js.map +1 -0
  74. package/src/solver-tools/lsoda/stoda.ts +286 -0
  75. package/src/solver-tools/lsoda-method.js +120 -0
  76. package/src/solver-tools/lsoda-method.js.map +1 -0
  77. package/src/solver-tools/lsoda-method.ts +136 -0
  78. package/src/solver-tools/mrt-method.js +81 -18
  79. package/src/solver-tools/mrt-method.js.map +1 -1
  80. package/src/solver-tools/mrt-method.ts +111 -21
  81. package/src/solver-tools/rk3-method.js +210 -0
  82. package/src/solver-tools/rk3-method.js.map +1 -0
  83. package/src/solver-tools/rk3-method.ts +257 -0
  84. package/src/solver-tools/rk4-method.js +236 -0
  85. package/src/solver-tools/rk4-method.js.map +1 -0
  86. package/src/solver-tools/rk4-method.ts +286 -0
  87. package/src/solver-tools/rkdp-method.js +247 -0
  88. package/src/solver-tools/rkdp-method.js.map +1 -0
  89. package/src/solver-tools/rkdp-method.ts +300 -0
  90. package/src/solver-tools/ros34prw-method.js +1 -1
  91. package/src/solver-tools/ros34prw-method.js.map +1 -1
  92. package/src/solver-tools/ros34prw-method.ts +1 -1
  93. package/src/solver-tools/ros3prw-method.js +1 -1
  94. package/src/solver-tools/ros3prw-method.js.map +1 -1
  95. package/src/solver-tools/ros3prw-method.ts +1 -1
  96. package/src/solver-tools/solver-defs.js +6 -0
  97. package/src/solver-tools/solver-defs.js.map +1 -1
  98. package/src/solver-tools/solver-defs.ts +6 -0
  99. package/src/tests/correctness.test.js +6 -4
  100. package/src/tests/correctness.test.js.map +1 -1
  101. package/src/tests/correctness.test.ts +6 -4
  102. package/src/tests/lsoda-lib-correctness.test.js +223 -0
  103. package/src/tests/lsoda-lib-correctness.test.js.map +1 -0
  104. package/src/tests/lsoda-lib-correctness.test.ts +283 -0
  105. package/src/tests/lsoda-lib-performance.test.js +95 -0
  106. package/src/tests/lsoda-lib-performance.test.js.map +1 -0
  107. package/src/tests/lsoda-lib-performance.test.ts +126 -0
  108. package/src/tests/performance.test.js +10 -8
  109. package/src/tests/performance.test.js.map +1 -1
  110. package/src/tests/performance.test.ts +10 -8
  111. package/src/tests/test-defs.js +14 -1
  112. package/src/tests/test-defs.js.map +1 -1
  113. package/src/tests/test-defs.ts +15 -1
  114. package/src/worker-tools/solving.js +13 -1
  115. package/src/worker-tools/solving.js.map +1 -1
  116. package/src/worker-tools/solving.ts +20 -1
  117. package/docs/.nojekyll +0 -1
  118. package/docs/assets/hierarchy.js +0 -1
  119. package/docs/assets/highlight.css +0 -99
  120. package/docs/assets/icons.js +0 -18
  121. package/docs/assets/icons.svg +0 -1
  122. package/docs/assets/main.js +0 -60
  123. package/docs/assets/navigation.js +0 -1
  124. package/docs/assets/search.js +0 -1
  125. package/docs/assets/style.css +0 -1633
  126. package/docs/classes/BasicModelPipelineCreator.html +0 -10
  127. package/docs/classes/Callback.html +0 -7
  128. package/docs/classes/CyclicModelPipelineCreator.html +0 -10
  129. package/docs/classes/IterCheckerCallback.html +0 -8
  130. package/docs/classes/PipelineCreator.html +0 -6
  131. package/docs/classes/TimeCheckerCallback.html +0 -8
  132. package/docs/classes/UpdatesModelPipelineCreator.html +0 -10
  133. package/docs/functions/applyPipeline.html +0 -9
  134. package/docs/functions/getCallback.html +0 -3
  135. package/docs/functions/getIVP.html +0 -6
  136. package/docs/functions/getInputVector.html +0 -2
  137. package/docs/functions/getIvp2WebWorker.html +0 -6
  138. package/docs/functions/getJScode.html +0 -6
  139. package/docs/functions/getOutputNames.html +0 -4
  140. package/docs/functions/getPipelineCreator.html +0 -7
  141. package/docs/functions/mrt.html +0 -11
  142. package/docs/functions/printE5.html +0 -76
  143. package/docs/functions/printHires.html +0 -76
  144. package/docs/functions/printOrego.html +0 -66
  145. package/docs/functions/printPollution.html +0 -163
  146. package/docs/functions/printRobertson.html +0 -60
  147. package/docs/functions/printVdpol.html +0 -66
  148. package/docs/functions/ros34prw.html +0 -8
  149. package/docs/functions/ros3prw.html +0 -8
  150. package/docs/functions/solveIvp.html +0 -5
  151. package/docs/hierarchy.html +0 -1
  152. package/docs/index.html +0 -683
  153. package/docs/media/CONTRIBUTING.md +0 -74
  154. package/docs/media/POLL.png +0 -0
  155. package/docs/media/VDPOL.png +0 -0
  156. package/docs/media/acid-prod.gif +0 -0
  157. package/docs/media/basic-use.js +0 -40
  158. package/docs/media/basic-use.js.map +0 -1
  159. package/docs/media/basic-use.ts +0 -44
  160. package/docs/media/check-methods.js +0 -59
  161. package/docs/media/check-methods.js.map +0 -1
  162. package/docs/media/check-methods.ts +0 -81
  163. package/docs/media/corr-probs.js +0 -132
  164. package/docs/media/corr-probs.js.map +0 -1
  165. package/docs/media/corr-probs.ts +0 -155
  166. package/docs/media/cyclic-model.js +0 -100
  167. package/docs/media/cyclic-model.js.map +0 -1
  168. package/docs/media/cyclic-model.ts +0 -110
  169. package/docs/media/e5.js +0 -36
  170. package/docs/media/e5.js.map +0 -1
  171. package/docs/media/e5.ts +0 -36
  172. package/docs/media/hires.js +0 -39
  173. package/docs/media/hires.js.map +0 -1
  174. package/docs/media/hires.ts +0 -40
  175. package/docs/media/model-updates.js +0 -112
  176. package/docs/media/model-updates.js.map +0 -1
  177. package/docs/media/model-updates.ts +0 -122
  178. package/docs/media/orego.js +0 -24
  179. package/docs/media/orego.js.map +0 -1
  180. package/docs/media/orego.ts +0 -25
  181. package/docs/media/pipeline-use.js +0 -87
  182. package/docs/media/pipeline-use.js.map +0 -1
  183. package/docs/media/pipeline-use.ts +0 -98
  184. package/docs/media/pollution.js +0 -132
  185. package/docs/media/pollution.js.map +0 -1
  186. package/docs/media/pollution.ts +0 -133
  187. package/docs/media/print-benchmark.js +0 -581
  188. package/docs/media/print-benchmark.js.map +0 -1
  189. package/docs/media/print-benchmark.ts +0 -594
  190. package/docs/media/robertson.js +0 -19
  191. package/docs/media/robertson.js.map +0 -1
  192. package/docs/media/robertson.ts +0 -19
  193. package/docs/media/scripting.js +0 -30
  194. package/docs/media/scripting.js.map +0 -1
  195. package/docs/media/scripting.ts +0 -35
  196. package/docs/media/vdpol.js +0 -17
  197. package/docs/media/vdpol.js.map +0 -1
  198. package/docs/media/vdpol.ts +0 -17
  199. package/docs/modules.html +0 -1
  200. package/docs/types/Arg.html +0 -12
  201. package/docs/types/DifEqs.html +0 -8
  202. package/docs/types/Func.html +0 -7
  203. package/docs/types/IVP.html +0 -40
  204. package/docs/types/IVP2WebWorker.html +0 -12
  205. package/docs/types/Input.html +0 -8
  206. package/docs/types/Loop.html +0 -7
  207. package/docs/types/ODEs.html +0 -31
  208. package/docs/types/Output.html +0 -6
  209. package/docs/types/Pipeline.html +0 -6
  210. package/docs/types/SolverOptions.html +0 -8
  211. package/docs/types/Update.html +0 -9
  212. package/docs/types/Wrapper.html +0 -8
@@ -0,0 +1,397 @@
1
+ /* The Adams-Bashforth-Moulton predictor-corrector method of order 5 (AB5).
2
+
3
+ Uses the 5-step Adams-Bashforth formula as predictor and the 4-step
4
+ Adams-Moulton formula as corrector in PECE mode (Predict-Evaluate-
5
+ Correct-Evaluate), with Milne's device for local error estimation.
6
+ Bootstrapping is performed using the Runge-Kutta-Fehlberg 4(5) method.
7
+
8
+ References:
9
+ [1] E. Hairer, S.P. Norsett, G. Wanner, "Solving Ordinary Differential
10
+ Equations I: Nonstiff Problems", Springer, 2nd ed., 1993.
11
+ [2] L.F. Shampine, M.K. Gordon, "Computer Solution of Ordinary Differential
12
+ Equations: The Initial Value Problem", W.H. Freeman, 1975.
13
+ */
14
+
15
+ import {ODEs, max, abs, SAFETY, PSHRNK, PSGROW, REDUCE_COEF, GROW_COEF,
16
+ ERR_CONTR, TINY, ERROR_MSG} from './solver-defs';
17
+ import {Callback} from './callbacks/callback-base';
18
+
19
+ // Adams-Bashforth 5-step coefficients (pre-divided by 720)
20
+ // y_{n+1} = y_n + h * (AB0*f_n + AB1*f_{n-1} + AB2*f_{n-2} + AB3*f_{n-3} + AB4*f_{n-4})
21
+ const AB0 = 1901.0 / 720.0;
22
+ const AB1 = -2774.0 / 720.0;
23
+ const AB2 = 2616.0 / 720.0;
24
+ const AB3 = -1274.0 / 720.0;
25
+ const AB4 = 251.0 / 720.0;
26
+
27
+ // Adams-Moulton 4-step coefficients (pre-divided by 720)
28
+ // y_{n+1} = y_n + h * (AM_NEW*f_{n+1} + AM0*f_n + AM1*f_{n-1} + AM2*f_{n-2} + AM3*f_{n-3})
29
+ const AM_NEW = 251.0 / 720.0;
30
+ const AM0 = 646.0 / 720.0;
31
+ const AM1 = -264.0 / 720.0;
32
+ const AM2 = 106.0 / 720.0;
33
+ const AM3 = -19.0 / 720.0;
34
+
35
+ // Milne error estimation coefficient for the AB5-AM4 pair: 2/27 = 38/513
36
+ const MILNE = 2.0 / 27.0;
37
+
38
+ // Number of uniformly-spaced history points required for AB5
39
+ const HIST_LEN = 5;
40
+
41
+ // Fehlberg 4(5) Butcher tableau coefficients (used during bootstrap phase)
42
+ const C2 = 1.0 / 4.0;
43
+ const C3 = 3.0 / 8.0;
44
+ const C4 = 12.0 / 13.0;
45
+ const C6 = 1.0 / 2.0;
46
+
47
+ const A21 = 1.0 / 4.0;
48
+ const A31 = 3.0 / 32.0;
49
+ const A32 = 9.0 / 32.0;
50
+ const A41 = 1932.0 / 2197.0;
51
+ const A42 = -7200.0 / 2197.0;
52
+ const A43 = 7296.0 / 2197.0;
53
+ const A51 = 439.0 / 216.0;
54
+ const A52 = -8.0;
55
+ const A53 = 3680.0 / 513.0;
56
+ const A54 = -845.0 / 4104.0;
57
+ const A61 = -8.0 / 27.0;
58
+ const A62 = 2.0;
59
+ const A63 = -3544.0 / 2565.0;
60
+ const A64 = 1859.0 / 4104.0;
61
+ const A65 = -11.0 / 40.0;
62
+
63
+ const B1 = 25.0 / 216.0;
64
+ const B3 = 1408.0 / 2565.0;
65
+ const B4 = 2197.0 / 4104.0;
66
+ const B5 = -1.0 / 5.0;
67
+
68
+ const RKE1 = 1.0 / 360.0;
69
+ const RKE3 = -128.0 / 4275.0;
70
+ const RKE4 = -2197.0 / 75240.0;
71
+ const RKE5 = 1.0 / 50.0;
72
+ const RKE6 = 2.0 / 55.0;
73
+
74
+ /** Solve initial value problem using the Adams-Bashforth-Moulton predictor-corrector method of order 5
75
+ * @param odes initial value problem for ordinary differential equations
76
+ * @param callback computations control callback
77
+ * @returns solution of the problem
78
+ * @example
79
+ * // Example. Solve the following initial value problem using the AB5 method:
80
+ * // dx/dt = x + y - t
81
+ * // dy/dt = x * y + t
82
+ * // x(0) = 1
83
+ * // y(0) = -1
84
+ * // on [0, 2] with the step 0.01.
85
+ * import { ODEs, ab5 } from 'diff-grok';
86
+ *
87
+ * const task: ODEs = {
88
+ * name: 'Example', // name of your model
89
+ * arg: {
90
+ * name: 't', // name of the argument
91
+ * start: 0, // initial value of the argument
92
+ * finish: 2, // final value of the argument
93
+ * step: 0.01, // solution grid step
94
+ * },
95
+ * initial: [1, -1], // initial values
96
+ * func: (t: number, y: Float64Array, output: Float64Array) => { // right-hand side of the system
97
+ * output[0] = y[0] + y[1] - t; // 1-st equation
98
+ * output[1] = y[0] * y[1] + t; // 2-nd equation
99
+ * },
100
+ * tolerance: 1e-7, // tolerance
101
+ * solutionColNames: ['x', 'y'], // names of solution functions
102
+ * };
103
+ *
104
+ * try {
105
+ * // Solve the problem using the AB5 method
106
+ * const solution = ab5(task);
107
+ *
108
+ * // Print a table with the results
109
+ * console.log(task.arg.name, task.solutionColNames[0], task.solutionColNames[1]);
110
+ * const length = solution[0].length;
111
+ * for (let i = 0; i < length; ++i)
112
+ * console.log(solution[0][i], solution[1][i], solution[2][i]);
113
+ * } catch (err) {
114
+ * console.log('Solver failed: ', err instanceof Error ? err.message : 'Unknown problem!');
115
+ * }
116
+ */
117
+ export function ab5(odes: ODEs, callback?: Callback): Float64Array[] {
118
+ const f = odes.func;
119
+
120
+ // operating variables
121
+ const t0 = odes.arg.start;
122
+ const t1 = odes.arg.finish;
123
+ let h = odes.arg.step;
124
+ const hDataframe = h;
125
+ const hMax = hDataframe * 10;
126
+ const tolerance = odes.tolerance;
127
+
128
+ const rowCount = Math.trunc((t1 - t0) / h) + 1;
129
+ const dim = odes.initial.length;
130
+
131
+ // result arrays
132
+ const tArr = new Float64Array(rowCount);
133
+ const yArrs = Array<Float64Array>(dim);
134
+
135
+ for (let i = 0; i < dim; ++i)
136
+ yArrs[i] = new Float64Array(rowCount);
137
+
138
+ // method routine
139
+ let timeDataframe = t0 + hDataframe;
140
+ let t = t0;
141
+ let tPrev = t0;
142
+ let hNext = 0.0;
143
+ let flag = true;
144
+ let index = 1;
145
+ let errmax = 0;
146
+ let hTemp = 0;
147
+ let tNew = 0;
148
+
149
+ // working buffers
150
+ const y = new Float64Array(odes.initial);
151
+ const yPrev = new Float64Array(odes.initial);
152
+ const dydt = new Float64Array(dim);
153
+ const yScale = new Float64Array(dim);
154
+ const yTemp = new Float64Array(dim);
155
+ const yErr = new Float64Array(dim);
156
+
157
+ // AB5-AM4 history: fBuf[0] = f(t_n, y_n), fBuf[4] = f(t_{n-4}, y_{n-4})
158
+ const fBuf: Float64Array[] = [];
159
+ for (let i = 0; i < HIST_LEN; ++i)
160
+ fBuf[i] = new Float64Array(dim);
161
+ let histCount = 0;
162
+ let lastH = 0;
163
+
164
+ // AB5-AM4 corrector buffers
165
+ const yCorr = new Float64Array(dim);
166
+ const fPred = new Float64Array(dim);
167
+
168
+ // RKF45 stage buffers (bootstrap)
169
+ const k1 = new Float64Array(dim);
170
+ const k2 = new Float64Array(dim);
171
+ const k3 = new Float64Array(dim);
172
+ const k4 = new Float64Array(dim);
173
+ const k5 = new Float64Array(dim);
174
+ const k6 = new Float64Array(dim);
175
+
176
+ // store initial f-value
177
+ f(t, y, fBuf[0]);
178
+ histCount = 1;
179
+
180
+ // 1. SOLUTION AT THE POINT t0
181
+ tArr[0] = t0;
182
+ for (let i = 0; i < dim; ++i)
183
+ yArrs[i][0] = y[i];
184
+
185
+ // 2. COMPUTE NUMERICAL SOLUTION FOR THE POINTS FROM THE INTERVAL (t0, t1)
186
+ while (flag) {
187
+ // compute derivative
188
+ f(t, y, dydt);
189
+
190
+ // check whether to go on computations
191
+ if (callback)
192
+ callback.onIterationStart();
193
+
194
+ // compute scale vector
195
+ for (let i = 0; i < dim; ++i)
196
+ yScale[i] = abs(y[i]) + h * abs(dydt[i]) + TINY;
197
+
198
+ // check end point
199
+ if (t + h > t1) {
200
+ h = t1 - t;
201
+ flag = false;
202
+ }
203
+
204
+ // if step size changed, history is invalid (AB5 needs uniform spacing)
205
+ if (histCount > 1 && h !== lastH) {
206
+ histCount = 1;
207
+ f(t, y, fBuf[0]);
208
+ }
209
+
210
+ // adaptive step loop
211
+ while (true) {
212
+ if (histCount < HIST_LEN) {
213
+ // BOOTSTRAP PHASE: RKF45 single step to build up history
214
+
215
+ // Stage 1: k1 = f(t, y)
216
+ f(t, y, k1);
217
+
218
+ // Stage 2: k2 = f(t + C2*h, y + h*A21*k1)
219
+ for (let i = 0; i < dim; ++i)
220
+ yTemp[i] = y[i] + h * A21 * k1[i];
221
+ f(t + C2 * h, yTemp, k2);
222
+
223
+ // Stage 3: k3 = f(t + C3*h, y + h*(A31*k1 + A32*k2))
224
+ for (let i = 0; i < dim; ++i)
225
+ yTemp[i] = y[i] + h * (A31 * k1[i] + A32 * k2[i]);
226
+ f(t + C3 * h, yTemp, k3);
227
+
228
+ // Stage 4: k4 = f(t + C4*h, y + h*(A41*k1 + A42*k2 + A43*k3))
229
+ for (let i = 0; i < dim; ++i)
230
+ yTemp[i] = y[i] + h * (A41 * k1[i] + A42 * k2[i] + A43 * k3[i]);
231
+ f(t + C4 * h, yTemp, k4);
232
+
233
+ // Stage 5: k5 = f(t + h, y + h*(A51*k1 + A52*k2 + A53*k3 + A54*k4))
234
+ for (let i = 0; i < dim; ++i)
235
+ yTemp[i] = y[i] + h * (A51 * k1[i] + A52 * k2[i] + A53 * k3[i] + A54 * k4[i]);
236
+ f(t + h, yTemp, k5);
237
+
238
+ // Stage 6: k6 = f(t + C6*h, y + h*(A61*k1 + A62*k2 + A63*k3 + A64*k4 + A65*k5))
239
+ for (let i = 0; i < dim; ++i)
240
+ yTemp[i] = y[i] + h * (A61 * k1[i] + A62 * k2[i] + A63 * k3[i] + A64 * k4[i] + A65 * k5[i]);
241
+ f(t + C6 * h, yTemp, k6);
242
+
243
+ // 4th-order solution
244
+ for (let i = 0; i < dim; ++i)
245
+ yTemp[i] = y[i] + h * (B1 * k1[i] + B3 * k3[i] + B4 * k4[i] + B5 * k5[i]);
246
+
247
+ // Error estimate: difference between 4th and 5th order solutions
248
+ for (let i = 0; i < dim; ++i)
249
+ yErr[i] = h * (RKE1 * k1[i] + RKE3 * k3[i] + RKE4 * k4[i] + RKE5 * k5[i] + RKE6 * k6[i]);
250
+
251
+ // estimating error
252
+ errmax = 0;
253
+ for (let i = 0; i < dim; ++i)
254
+ errmax = max(errmax, abs(yErr[i] / yScale[i]));
255
+ errmax /= tolerance;
256
+
257
+ // processing the error obtained
258
+ if (errmax > 1) {
259
+ hTemp = SAFETY * h * errmax**PSHRNK;
260
+ h = max(hTemp, REDUCE_COEF * h);
261
+ tNew = t + h;
262
+ if (tNew == t)
263
+ throw new Error(ERROR_MSG.AB5_FAILS);
264
+ // step size changed, reset history if needed
265
+ if (histCount > 1) {
266
+ histCount = 1;
267
+ f(t, y, fBuf[0]);
268
+ }
269
+ } else {
270
+ // step accepted
271
+ t = t + h;
272
+
273
+ for (let i = 0; i < dim; ++i)
274
+ y[i] = yTemp[i];
275
+
276
+ // shift history and store new f-value
277
+ for (let j = Math.min(histCount, HIST_LEN - 1); j > 0; --j)
278
+ fBuf[j].set(fBuf[j - 1]);
279
+ f(t, y, fBuf[0]);
280
+ histCount++;
281
+ lastH = h;
282
+
283
+ // during bootstrap, keep h constant for uniform spacing
284
+ hNext = h;
285
+ if (hNext > hMax)
286
+ hNext = hMax;
287
+
288
+ break;
289
+ }
290
+ } else {
291
+ // AB5-AM4 PHASE: Predictor-Corrector (PECE)
292
+
293
+ // Predict (Adams-Bashforth 5-step)
294
+ for (let i = 0; i < dim; ++i) {
295
+ yTemp[i] = y[i] + h * (AB0 * fBuf[0][i] + AB1 * fBuf[1][i] +
296
+ AB2 * fBuf[2][i] + AB3 * fBuf[3][i] + AB4 * fBuf[4][i]);
297
+ }
298
+
299
+ // Evaluate f at predicted point
300
+ f(t + h, yTemp, fPred);
301
+
302
+ // Correct (Adams-Moulton 4-step)
303
+ for (let i = 0; i < dim; ++i) {
304
+ yCorr[i] = y[i] + h * (AM_NEW * fPred[i] + AM0 * fBuf[0][i] +
305
+ AM1 * fBuf[1][i] + AM2 * fBuf[2][i] + AM3 * fBuf[3][i]);
306
+ }
307
+
308
+ // Error estimate (Milne's device)
309
+ for (let i = 0; i < dim; ++i)
310
+ yErr[i] = MILNE * (yCorr[i] - yTemp[i]);
311
+
312
+ // estimating error
313
+ errmax = 0;
314
+ for (let i = 0; i < dim; ++i)
315
+ errmax = max(errmax, abs(yErr[i] / yScale[i]));
316
+ errmax /= tolerance;
317
+
318
+ // processing the error obtained
319
+ if (errmax > 1) {
320
+ // step rejected: shrink step and re-bootstrap
321
+ hTemp = SAFETY * h * errmax**PSHRNK;
322
+ h = max(hTemp, REDUCE_COEF * h);
323
+ tNew = t + h;
324
+ if (tNew == t)
325
+ throw new Error(ERROR_MSG.AB5_FAILS);
326
+ histCount = 1;
327
+ f(t, y, fBuf[0]);
328
+ } else {
329
+ if (errmax > ERR_CONTR)
330
+ hNext = SAFETY * h * errmax**PSGROW;
331
+ else
332
+ hNext = GROW_COEF * h;
333
+
334
+ if (hNext > hMax)
335
+ hNext = hMax;
336
+
337
+ t = t + h;
338
+
339
+ for (let i = 0; i < dim; ++i)
340
+ y[i] = yCorr[i];
341
+
342
+ // shift history and store f at corrected point (PECE final evaluate)
343
+ const recycled = fBuf[HIST_LEN - 1];
344
+ for (let j = HIST_LEN - 1; j > 0; --j)
345
+ fBuf[j] = fBuf[j - 1];
346
+ fBuf[0] = recycled;
347
+ f(t, y, fBuf[0]);
348
+ lastH = h;
349
+
350
+ break;
351
+ }
352
+ }
353
+ } // while (true)
354
+
355
+ // compute linearly interpolated results and store them in dataframe
356
+ while (timeDataframe < t) {
357
+ const cLeft = (t - timeDataframe) / (t - tPrev);
358
+ const cRight = 1.0 - cLeft;
359
+
360
+ tArr[index] = timeDataframe;
361
+
362
+ for (let j = 0; j < dim; ++j)
363
+ yArrs[j][index] = cRight * y[j] + cLeft * yPrev[j];
364
+
365
+ timeDataframe += hDataframe;
366
+ ++index;
367
+ }
368
+
369
+ h = hNext;
370
+ tPrev = t;
371
+
372
+ for (let i = 0; i < dim; ++i)
373
+ yPrev[i] = y[i];
374
+ } // while (flag)
375
+
376
+ // perform final callback actions
377
+ if (callback)
378
+ callback.onComputationsCompleted();
379
+
380
+ // 3. solution at the point t1
381
+ tArr[rowCount - 1] = t1;
382
+
383
+ for (let i = 0; i < dim; ++i)
384
+ yArrs[i][rowCount - 1] = y[i];
385
+
386
+ // 4. prepare output
387
+ const solution = Array<Float64Array>(dim + 1);
388
+
389
+ // independent variable
390
+ solution[0] = tArr;
391
+
392
+ // functions
393
+ for (let i = 0; i < dim; ++i)
394
+ solution[i + 1] = yArrs[i];
395
+
396
+ return solution;
397
+ } // ab5
@@ -1,6 +1,12 @@
1
1
  export { mrt } from './mrt-method';
2
2
  export { ros3prw } from './ros3prw-method';
3
3
  export { ros34prw } from './ros34prw-method';
4
+ export { rk4 } from './rk4-method';
5
+ export { ab5 } from './ab5-method';
6
+ export { ab4 } from './ab4-method';
7
+ export { rkdp } from './rkdp-method';
8
+ export { rk3 } from './rk3-method';
9
+ export { lsoda } from './lsoda-method';
4
10
  export { CallbackAction, DEFAULT_OPTIONS } from './solver-defs';
5
11
  export { getCallback } from './callbacks/callback-tools';
6
12
  export { Callback } from './callbacks/callback-base';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,cAAc,CAAC;AACjC,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAC,cAAc,EAAE,eAAe,EAA8B,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,cAAc,CAAC;AACjC,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAC,GAAG,EAAC,MAAM,cAAc,CAAC;AACjC,OAAO,EAAC,GAAG,EAAC,MAAM,cAAc,CAAC;AACjC,OAAO,EAAC,GAAG,EAAC,MAAM,cAAc,CAAC;AACjC,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AACnC,OAAO,EAAC,GAAG,EAAC,MAAM,cAAc,CAAC;AACjC,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAC,cAAc,EAAE,eAAe,EAA8B,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAC"}
@@ -2,6 +2,12 @@ export {ODEs, Func} from './solver-defs';
2
2
  export {mrt} from './mrt-method';
3
3
  export {ros3prw} from './ros3prw-method';
4
4
  export {ros34prw} from './ros34prw-method';
5
+ export {rk4} from './rk4-method';
6
+ export {ab5} from './ab5-method';
7
+ export {ab4} from './ab4-method';
8
+ export {rkdp} from './rkdp-method';
9
+ export {rk3} from './rk3-method';
10
+ export {lsoda} from './lsoda-method';
5
11
  export {CallbackAction, DEFAULT_OPTIONS, SolverOptions, SolverMethod} from './solver-defs';
6
12
  export {getCallback} from './callbacks/callback-tools';
7
13
  export {Callback} from './callbacks/callback-base';
@@ -0,0 +1,246 @@
1
+ // BLAS linear algebra routines
2
+ // All arrays are 1-indexed (element [0] unused), matching the C/Fortran convention.
3
+ /**
4
+ * Compute dy = da * dx + dy
5
+ * Arrays are 1-indexed with stride incx/incy.
6
+ */
7
+ export function daxpy(n, da, dx, incx, dy, incy) {
8
+ if (n < 0 || da === 0.)
9
+ return;
10
+ if (incx !== incy || incx < 1) {
11
+ let ix = 1;
12
+ let iy = 1;
13
+ if (incx < 0)
14
+ ix = (-n + 1) * incx + 1;
15
+ if (incy < 0)
16
+ iy = (-n + 1) * incy + 1;
17
+ for (let i = 1; i <= n; i++) {
18
+ dy[iy] = dy[iy] + da * dx[ix];
19
+ ix += incx;
20
+ iy += incy;
21
+ }
22
+ return;
23
+ }
24
+ if (incx === 1) {
25
+ const m = n % 4;
26
+ if (m !== 0) {
27
+ for (let i = 1; i <= m; i++)
28
+ dy[i] = dy[i] + da * dx[i];
29
+ if (n < 4)
30
+ return;
31
+ }
32
+ for (let i = m + 1; i <= n; i += 4) {
33
+ dy[i] = dy[i] + da * dx[i];
34
+ dy[i + 1] = dy[i + 1] + da * dx[i + 1];
35
+ dy[i + 2] = dy[i + 2] + da * dx[i + 2];
36
+ dy[i + 3] = dy[i + 3] + da * dx[i + 3];
37
+ }
38
+ return;
39
+ }
40
+ for (let i = 1; i <= n * incx; i += incx)
41
+ dy[i] = da * dx[i] + dy[i];
42
+ }
43
+ /**
44
+ * Compute dot product dx . dy
45
+ * Arrays are 1-indexed with stride incx/incy.
46
+ */
47
+ export function ddot(n, dx, incx, dy, incy) {
48
+ let dotprod = 0.;
49
+ if (n <= 0)
50
+ return dotprod;
51
+ if (incx !== incy || incx < 1) {
52
+ let ix = 1;
53
+ let iy = 1;
54
+ if (incx < 0)
55
+ ix = (-n + 1) * incx + 1;
56
+ if (incy < 0)
57
+ iy = (-n + 1) * incy + 1;
58
+ for (let i = 1; i <= n; i++) {
59
+ dotprod += dx[ix] * dy[iy];
60
+ ix += incx;
61
+ iy += incy;
62
+ }
63
+ return dotprod;
64
+ }
65
+ if (incx === 1) {
66
+ for (let i = 1; i <= n; i++)
67
+ dotprod += dx[i] * dy[i];
68
+ return dotprod;
69
+ }
70
+ for (let i = 1; i <= n * incx; i += incx)
71
+ dotprod += dx[i] * dy[i];
72
+ return dotprod;
73
+ }
74
+ /**
75
+ * Scale vector: dx = da * dx
76
+ * Array is 1-indexed with stride incx.
77
+ */
78
+ export function dscal(n, da, dx, incx) {
79
+ if (n <= 0)
80
+ return;
81
+ if (incx !== 1) {
82
+ for (let i = 1; i <= n * incx; i += incx)
83
+ dx[i] = da * dx[i];
84
+ return;
85
+ }
86
+ const m = n % 5;
87
+ if (m !== 0) {
88
+ for (let i = 1; i <= m; i++)
89
+ dx[i] = da * dx[i];
90
+ if (n < 5)
91
+ return;
92
+ }
93
+ for (let i = m + 1; i <= n; i += 5) {
94
+ dx[i] = da * dx[i];
95
+ dx[i + 1] = da * dx[i + 1];
96
+ dx[i + 2] = da * dx[i + 2];
97
+ dx[i + 3] = da * dx[i + 3];
98
+ dx[i + 4] = da * dx[i + 4];
99
+ }
100
+ }
101
+ /**
102
+ * Find index of element with maximum absolute value.
103
+ * Array is 1-indexed. Returns 1-based index (0 if n <= 0).
104
+ */
105
+ export function idamax(n, dx, incx) {
106
+ let xindex = 0;
107
+ if (n <= 0)
108
+ return xindex;
109
+ xindex = 1;
110
+ if (n <= 1 || incx <= 0)
111
+ return xindex;
112
+ if (incx !== 1) {
113
+ let dmax = Math.abs(dx[1]);
114
+ let ii = 2;
115
+ for (let i = 1 + incx; i <= n * incx; i += incx) {
116
+ const xmag = Math.abs(dx[i]);
117
+ if (xmag > dmax) {
118
+ xindex = ii;
119
+ dmax = xmag;
120
+ }
121
+ ii++;
122
+ }
123
+ return xindex;
124
+ }
125
+ let dmax = Math.abs(dx[1]);
126
+ for (let i = 2; i <= n; i++) {
127
+ const xmag = Math.abs(dx[i]);
128
+ if (xmag > dmax) {
129
+ xindex = i;
130
+ dmax = xmag;
131
+ }
132
+ }
133
+ return xindex;
134
+ }
135
+ /**
136
+ * LU factorization by Gaussian elimination with partial pivoting.
137
+ * a: 2D matrix (a[i][j], 1-indexed rows and columns)
138
+ * n: matrix dimension
139
+ * ipvt: pivot indices output (1-indexed)
140
+ * Returns info: 0 = normal, k = U[k][k] == 0 (singular).
141
+ */
142
+ export function dgefa(a, n, ipvt) {
143
+ let info = 0;
144
+ for (let k = 1; k <= n - 1; k++) {
145
+ // Find pivot index. a[k] + k - 1 in C => subarray from index k
146
+ const j = idamax(n - k + 1, a[k].subarray(k - 1), 1) + k - 1;
147
+ ipvt[k] = j;
148
+ if (a[k][j] === 0.) {
149
+ info = k;
150
+ continue;
151
+ }
152
+ // Interchange if necessary
153
+ if (j !== k) {
154
+ const t = a[k][j];
155
+ a[k][j] = a[k][k];
156
+ a[k][k] = t;
157
+ }
158
+ // Compute multipliers
159
+ const t = -1. / a[k][k];
160
+ dscal(n - k, t, a[k].subarray(k), 1);
161
+ // Column elimination with row indexing
162
+ for (let i = k + 1; i <= n; i++) {
163
+ const t2 = a[i][j];
164
+ if (j !== k) {
165
+ a[i][j] = a[i][k];
166
+ a[i][k] = t2;
167
+ }
168
+ daxpy(n - k, t2, a[k].subarray(k), 1, a[i].subarray(k), 1);
169
+ }
170
+ }
171
+ ipvt[n] = n;
172
+ if (a[n][n] === 0.)
173
+ info = n;
174
+ return info;
175
+ }
176
+ /**
177
+ * Solve linear system using LU factors from dgefa.
178
+ * a: LU factored matrix (1-indexed)
179
+ * n: dimension
180
+ * ipvt: pivot indices (1-indexed)
181
+ * b: right-hand side on input, solution on output (1-indexed)
182
+ * job: 0 = solve A*x=b, nonzero = solve A^T*x=b
183
+ */
184
+ export function dgesl(a, n, ipvt, b, job) {
185
+ if (job === 0) {
186
+ // Solve L * y = b
187
+ for (let k = 1; k <= n; k++) {
188
+ const t = ddot(k - 1, a[k], 1, b, 1);
189
+ b[k] = (b[k] - t) / a[k][k];
190
+ }
191
+ // Solve U * x = y
192
+ for (let k = n - 1; k >= 1; k--) {
193
+ b[k] = b[k] + ddot(n - k, a[k].subarray(k), 1, b.subarray(k), 1);
194
+ const j = ipvt[k];
195
+ if (j !== k) {
196
+ const t = b[j];
197
+ b[j] = b[k];
198
+ b[k] = t;
199
+ }
200
+ }
201
+ return;
202
+ }
203
+ // Solve Transpose(U) * y = b
204
+ for (let k = 1; k <= n - 1; k++) {
205
+ const j = ipvt[k];
206
+ const t = b[j];
207
+ if (j !== k) {
208
+ b[j] = b[k];
209
+ b[k] = t;
210
+ }
211
+ daxpy(n - k, t, a[k].subarray(k), 1, b.subarray(k), 1);
212
+ }
213
+ // Solve Transpose(L) * x = y
214
+ for (let k = n; k >= 1; k--) {
215
+ b[k] = b[k] / a[k][k];
216
+ const t = -b[k];
217
+ daxpy(k - 1, t, a[k], 1, b, 1);
218
+ }
219
+ }
220
+ /**
221
+ * Weighted max-norm: max(i=1..n) |v[i]| * w[i]
222
+ * Arrays are 1-indexed.
223
+ */
224
+ export function vmnorm(n, v, w) {
225
+ let vm = 0.;
226
+ for (let i = 1; i <= n; i++)
227
+ vm = Math.max(vm, Math.abs(v[i]) * w[i]);
228
+ return vm;
229
+ }
230
+ /**
231
+ * Weighted matrix norm consistent with vmnorm.
232
+ * fnorm = max(i=1..n) ( w[i] * sum(j=1..n) |a[i][j]| / w[j] )
233
+ * a is 2D (1-indexed), w is 1-indexed.
234
+ */
235
+ export function fnorm(n, a, w) {
236
+ let an = 0.;
237
+ for (let i = 1; i <= n; i++) {
238
+ let sum = 0.;
239
+ const ap1 = a[i];
240
+ for (let j = 1; j <= n; j++)
241
+ sum += Math.abs(ap1[j]) / w[j];
242
+ an = Math.max(an, sum * w[i]);
243
+ }
244
+ return an;
245
+ }
246
+ //# sourceMappingURL=blas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blas.js","sourceRoot":"","sources":["blas.ts"],"names":[],"mappings":"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"}