diff-grok 1.0.9 → 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 (200) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +22 -0
  5. package/.github/workflows/deploy-docs.yml +15 -0
  6. package/CLAUDE.md +98 -0
  7. package/CONTRIBUTING.md +74 -0
  8. package/README.MD +272 -18
  9. package/images/E5.png +0 -0
  10. package/images/HIRES.png +0 -0
  11. package/images/OREGO.png +0 -0
  12. package/images/POLL-full.png +0 -0
  13. package/images/POLL.png +0 -0
  14. package/images/ROBER.png +0 -0
  15. package/images/VDP0L.png +0 -0
  16. package/images/VDPOL.png +0 -0
  17. package/index.js +2 -2
  18. package/index.js.map +1 -1
  19. package/index.ts +7 -5
  20. package/jest.config.js +1 -0
  21. package/package.json +2 -1
  22. package/src/examples/bioreactor.js +125 -0
  23. package/src/examples/bioreactor.js.map +1 -0
  24. package/src/examples/bioreactor.ts +132 -0
  25. package/src/examples/check-methods.js +23 -9
  26. package/src/examples/check-methods.js.map +1 -1
  27. package/src/examples/check-methods.ts +28 -9
  28. package/src/examples/corr-probs.js +3 -1
  29. package/src/examples/corr-probs.js.map +1 -1
  30. package/src/examples/corr-probs.ts +7 -3
  31. package/src/examples/cyclic-model.js +3 -1
  32. package/src/examples/cyclic-model.js.map +1 -1
  33. package/src/examples/cyclic-model.ts +3 -1
  34. package/src/examples/e5.js +6 -0
  35. package/src/examples/e5.js.map +1 -1
  36. package/src/examples/e5.ts +7 -0
  37. package/src/examples/hires.js +10 -0
  38. package/src/examples/hires.js.map +1 -1
  39. package/src/examples/hires.ts +11 -0
  40. package/src/examples/index.js +21 -7
  41. package/src/examples/index.js.map +1 -1
  42. package/src/examples/index.ts +23 -7
  43. package/src/examples/orego.js +5 -0
  44. package/src/examples/orego.js.map +1 -1
  45. package/src/examples/orego.ts +6 -0
  46. package/src/examples/pollution.js +22 -0
  47. package/src/examples/pollution.js.map +1 -1
  48. package/src/examples/pollution.ts +23 -0
  49. package/src/examples/print-benchmark.js +581 -0
  50. package/src/examples/print-benchmark.js.map +1 -0
  51. package/src/examples/print-benchmark.ts +594 -0
  52. package/src/examples/robertson.js +6 -1
  53. package/src/examples/robertson.js.map +1 -1
  54. package/src/examples/robertson.ts +7 -1
  55. package/src/examples/scripting.js +1 -1
  56. package/src/examples/scripting.js.map +1 -1
  57. package/src/examples/scripting.ts +1 -1
  58. package/src/examples/vdpol.js +4 -0
  59. package/src/examples/vdpol.js.map +1 -1
  60. package/src/examples/vdpol.ts +5 -0
  61. package/src/pipeline/basic-pipeline-creator.js +96 -1
  62. package/src/pipeline/basic-pipeline-creator.js.map +1 -1
  63. package/src/pipeline/basic-pipeline-creator.ts +97 -1
  64. package/src/pipeline/loops-pipeline-creator.js +115 -2
  65. package/src/pipeline/loops-pipeline-creator.js.map +1 -1
  66. package/src/pipeline/loops-pipeline-creator.ts +116 -2
  67. package/src/pipeline/output.js +7 -2
  68. package/src/pipeline/output.js.map +1 -1
  69. package/src/pipeline/output.ts +7 -2
  70. package/src/pipeline/pipeline-creator.js.map +1 -1
  71. package/src/pipeline/pipeline-creator.ts +4 -0
  72. package/src/pipeline/pipeline.js +193 -2
  73. package/src/pipeline/pipeline.js.map +1 -1
  74. package/src/pipeline/pipeline.ts +206 -4
  75. package/src/pipeline/updates-pipeline-creator.js +130 -2
  76. package/src/pipeline/updates-pipeline-creator.js.map +1 -1
  77. package/src/pipeline/updates-pipeline-creator.ts +131 -2
  78. package/src/scripting-tools/constants.js +18 -4
  79. package/src/scripting-tools/constants.js.map +1 -1
  80. package/src/scripting-tools/constants.ts +22 -4
  81. package/src/scripting-tools/index.js.map +1 -1
  82. package/src/scripting-tools/index.ts +3 -2
  83. package/src/scripting-tools/model-error.js +3 -1
  84. package/src/scripting-tools/model-error.js.map +1 -1
  85. package/src/scripting-tools/model-error.ts +3 -1
  86. package/src/scripting-tools/scripting-tools.js +139 -9
  87. package/src/scripting-tools/scripting-tools.js.map +1 -1
  88. package/src/scripting-tools/scripting-tools.ts +228 -21
  89. package/src/solver-tools/ab4-method.js +332 -0
  90. package/src/solver-tools/ab4-method.js.map +1 -0
  91. package/src/solver-tools/ab4-method.ts +395 -0
  92. package/src/solver-tools/ab5-method.js +334 -0
  93. package/src/solver-tools/ab5-method.js.map +1 -0
  94. package/src/solver-tools/ab5-method.ts +397 -0
  95. package/src/solver-tools/callbacks/callback-base.js +2 -0
  96. package/src/solver-tools/callbacks/callback-base.js.map +1 -1
  97. package/src/solver-tools/callbacks/callback-base.ts +4 -0
  98. package/src/solver-tools/callbacks/callback-tools.js +3 -1
  99. package/src/solver-tools/callbacks/callback-tools.js.map +1 -1
  100. package/src/solver-tools/callbacks/callback-tools.ts +3 -1
  101. package/src/solver-tools/callbacks/iter-checker-callback.js +4 -0
  102. package/src/solver-tools/callbacks/iter-checker-callback.js.map +1 -1
  103. package/src/solver-tools/callbacks/iter-checker-callback.ts +4 -0
  104. package/src/solver-tools/callbacks/time-checker-callback.js +4 -0
  105. package/src/solver-tools/callbacks/time-checker-callback.js.map +1 -1
  106. package/src/solver-tools/callbacks/time-checker-callback.ts +4 -0
  107. package/src/solver-tools/index.js +9 -0
  108. package/src/solver-tools/index.js.map +1 -1
  109. package/src/solver-tools/index.ts +9 -0
  110. package/src/solver-tools/lsoda/blas.js +246 -0
  111. package/src/solver-tools/lsoda/blas.js.map +1 -0
  112. package/src/solver-tools/lsoda/blas.ts +267 -0
  113. package/src/solver-tools/lsoda/cfode.js +73 -0
  114. package/src/solver-tools/lsoda/cfode.js.map +1 -0
  115. package/src/solver-tools/lsoda/cfode.ts +83 -0
  116. package/src/solver-tools/lsoda/common.js +94 -0
  117. package/src/solver-tools/lsoda/common.js.map +1 -0
  118. package/src/solver-tools/lsoda/common.ts +135 -0
  119. package/src/solver-tools/lsoda/corfailure.js +25 -0
  120. package/src/solver-tools/lsoda/corfailure.js.map +1 -0
  121. package/src/solver-tools/lsoda/corfailure.ts +30 -0
  122. package/src/solver-tools/lsoda/correction.js +101 -0
  123. package/src/solver-tools/lsoda/correction.js.map +1 -0
  124. package/src/solver-tools/lsoda/correction.ts +119 -0
  125. package/src/solver-tools/lsoda/dense.js +110 -0
  126. package/src/solver-tools/lsoda/dense.js.map +1 -0
  127. package/src/solver-tools/lsoda/dense.ts +129 -0
  128. package/src/solver-tools/lsoda/index.js +4 -0
  129. package/src/solver-tools/lsoda/index.js.map +1 -0
  130. package/src/solver-tools/lsoda/index.ts +5 -0
  131. package/src/solver-tools/lsoda/intdy.js +43 -0
  132. package/src/solver-tools/lsoda/intdy.js.map +1 -0
  133. package/src/solver-tools/lsoda/intdy.ts +50 -0
  134. package/src/solver-tools/lsoda/lsoda.js +567 -0
  135. package/src/solver-tools/lsoda/lsoda.js.map +1 -0
  136. package/src/solver-tools/lsoda/lsoda.ts +632 -0
  137. package/src/solver-tools/lsoda/methodswitch.js +97 -0
  138. package/src/solver-tools/lsoda/methodswitch.js.map +1 -0
  139. package/src/solver-tools/lsoda/methodswitch.ts +107 -0
  140. package/src/solver-tools/lsoda/orderswitch.js +86 -0
  141. package/src/solver-tools/lsoda/orderswitch.js.map +1 -0
  142. package/src/solver-tools/lsoda/orderswitch.ts +95 -0
  143. package/src/solver-tools/lsoda/prja.js +43 -0
  144. package/src/solver-tools/lsoda/prja.js.map +1 -0
  145. package/src/solver-tools/lsoda/prja.ts +49 -0
  146. package/src/solver-tools/lsoda/scaleh.js +30 -0
  147. package/src/solver-tools/lsoda/scaleh.js.map +1 -0
  148. package/src/solver-tools/lsoda/scaleh.ts +33 -0
  149. package/src/solver-tools/lsoda/solsy.js +14 -0
  150. package/src/solver-tools/lsoda/solsy.js.map +1 -0
  151. package/src/solver-tools/lsoda/solsy.ts +18 -0
  152. package/src/solver-tools/lsoda/stoda.js +259 -0
  153. package/src/solver-tools/lsoda/stoda.js.map +1 -0
  154. package/src/solver-tools/lsoda/stoda.ts +286 -0
  155. package/src/solver-tools/lsoda-method.js +120 -0
  156. package/src/solver-tools/lsoda-method.js.map +1 -0
  157. package/src/solver-tools/lsoda-method.ts +136 -0
  158. package/src/solver-tools/mrt-method.js +121 -19
  159. package/src/solver-tools/mrt-method.js.map +1 -1
  160. package/src/solver-tools/mrt-method.ts +151 -22
  161. package/src/solver-tools/rk3-method.js +210 -0
  162. package/src/solver-tools/rk3-method.js.map +1 -0
  163. package/src/solver-tools/rk3-method.ts +257 -0
  164. package/src/solver-tools/rk4-method.js +236 -0
  165. package/src/solver-tools/rk4-method.js.map +1 -0
  166. package/src/solver-tools/rk4-method.ts +286 -0
  167. package/src/solver-tools/rkdp-method.js +247 -0
  168. package/src/solver-tools/rkdp-method.js.map +1 -0
  169. package/src/solver-tools/rkdp-method.ts +300 -0
  170. package/src/solver-tools/ros34prw-method.js +40 -2
  171. package/src/solver-tools/ros34prw-method.js.map +1 -1
  172. package/src/solver-tools/ros34prw-method.ts +40 -2
  173. package/src/solver-tools/ros3prw-method.js +40 -2
  174. package/src/solver-tools/ros3prw-method.js.map +1 -1
  175. package/src/solver-tools/ros3prw-method.ts +40 -2
  176. package/src/solver-tools/solver-defs.js +15 -3
  177. package/src/solver-tools/solver-defs.js.map +1 -1
  178. package/src/solver-tools/solver-defs.ts +91 -7
  179. package/src/tests/correctness.test.js +6 -4
  180. package/src/tests/correctness.test.js.map +1 -1
  181. package/src/tests/correctness.test.ts +6 -4
  182. package/src/tests/lsoda-lib-correctness.test.js +223 -0
  183. package/src/tests/lsoda-lib-correctness.test.js.map +1 -0
  184. package/src/tests/lsoda-lib-correctness.test.ts +283 -0
  185. package/src/tests/lsoda-lib-performance.test.js +95 -0
  186. package/src/tests/lsoda-lib-performance.test.js.map +1 -0
  187. package/src/tests/lsoda-lib-performance.test.ts +126 -0
  188. package/src/tests/performance.test.js +10 -8
  189. package/src/tests/performance.test.js.map +1 -1
  190. package/src/tests/performance.test.ts +10 -8
  191. package/src/tests/test-defs.js +14 -1
  192. package/src/tests/test-defs.js.map +1 -1
  193. package/src/tests/test-defs.ts +15 -1
  194. package/src/worker-tools/scripting.js +95 -1
  195. package/src/worker-tools/scripting.js.map +1 -1
  196. package/src/worker-tools/scripting.ts +104 -2
  197. package/src/worker-tools/solving.js +18 -2
  198. package/src/worker-tools/solving.js.map +1 -1
  199. package/src/worker-tools/solving.ts +25 -2
  200. package/typedoc.json +8 -0
@@ -0,0 +1,136 @@
1
+ /* LSODA library wrapper method.
2
+
3
+ Wraps the variable-order Nordsieck-based LSODA solver into the standard SolverMethod interface.
4
+ Automatically switches between Adams (non-stiff) and BDF (stiff) methods.
5
+
6
+ References:
7
+ [1] Hindmarsh, A.C. "ODEPACK, A Systematized Collection of ODE Solvers."
8
+ [2] Petzold, L.R. "Automatic Selection of Methods for Solving Stiff and Nonstiff
9
+ Systems of Ordinary Differential Equations."
10
+ */
11
+
12
+ import {ODEs, ERROR_MSG} from './solver-defs';
13
+ import {Callback} from './callbacks/callback-base';
14
+ import {Lsoda} from './lsoda';
15
+
16
+ /** Wraps an ODEs func into the OdeFunction signature compatible with Lsoda (returns 0). */
17
+ function wrapFunc(f: ODEs['func']): (t: number, y: Float64Array, ydot: Float64Array) => number {
18
+ return (t, y, ydot) => {
19
+ f(t, y, ydot);
20
+ return 0;
21
+ };
22
+ }
23
+
24
+ /** Solve initial value problem using the LSODA library method
25
+ * @param odes initial value problem for ordinary differential equations
26
+ * @param callback computations control callback
27
+ * @returns solution of the problem
28
+ * @example
29
+ * // Example. Solve the following initial value problem using the LSODA method:
30
+ * // dx/dt = x + y - t
31
+ * // dy/dt = x * y + t
32
+ * // x(0) = 1
33
+ * // y(0) = -1
34
+ * // on [0, 2] with the step 0.01.
35
+ * import { ODEs, lsoda } from 'diff-grok';
36
+ *
37
+ * const task: ODEs = {
38
+ * name: 'Example', // name of your model
39
+ * arg: {
40
+ * name: 't', // name of the argument
41
+ * start: 0, // initial value of the argument
42
+ * finish: 2, // final value of the argument
43
+ * step: 0.01, // solution grid step
44
+ * },
45
+ * initial: [1, -1], // initial values
46
+ * func: (t: number, y: Float64Array, output: Float64Array) => { // right-hand side of the system
47
+ * output[0] = y[0] + y[1] - t; // 1-st equation
48
+ * output[1] = y[0] * y[1] + t; // 2-nd equation
49
+ * },
50
+ * tolerance: 1e-7, // tolerance
51
+ * solutionColNames: ['x', 'y'], // names of solution functions
52
+ * };
53
+ *
54
+ * try {
55
+ * // Solve the problem using the LSODA method
56
+ * const solution = lsoda(task);
57
+ *
58
+ * // Print a table with the results
59
+ * console.log(task.arg.name, task.solutionColNames[0], task.solutionColNames[1]);
60
+ * const length = solution[0].length;
61
+ * for (let i = 0; i < length; ++i)
62
+ * console.log(solution[0][i], solution[1][i], solution[2][i]);
63
+ * } catch (err) {
64
+ * console.log('Solver failed: ', err instanceof Error ? err.message : 'Unknown problem!');
65
+ * }
66
+ */
67
+ export function lsoda(odes: ODEs, callback?: Callback): Float64Array[] {
68
+ // 1. Extract problem parameters
69
+ const t0 = odes.arg.start;
70
+ const t1 = odes.arg.finish;
71
+ const step = odes.arg.step;
72
+ const tolerance = odes.tolerance;
73
+ const dim = odes.initial.length;
74
+ const mxstep = 50000;
75
+
76
+ // 2. Create LSODA solver with dense output enabled
77
+ const rtol = new Float64Array(dim).fill(tolerance);
78
+ const atol = new Float64Array(dim).fill(tolerance);
79
+
80
+ const solver = new Lsoda(wrapFunc(odes.func), dim, {
81
+ rtol, atol, itask: 1, dense: true, mxstep,
82
+ });
83
+
84
+ // 3. Integrate through checkpoints, collecting Nordsieck snapshots for dense output.
85
+ // Checkpoints are spaced coarsely (up to 1000) so the solver handles adaptive
86
+ // stepping internally; mxstep per call stays within bounds.
87
+ if (callback)
88
+ callback.onIterationStart();
89
+
90
+ let y: ArrayLike<number> = [...odes.initial];
91
+ let t = t0;
92
+
93
+ // Warmup: a tiny initial step bootstraps the BDF method for extremely stiff problems
94
+ const warmupTout = t0 + Math.min(step, 1.0) * 1e-5;
95
+ if (warmupTout > t0 && warmupTout < t1) {
96
+ const wr = solver.solve(y, t, warmupTout);
97
+ y = wr.y;
98
+ t = wr.t;
99
+ if (solver.state <= 0)
100
+ throw new Error(ERROR_MSG.LSODA_FAILS);
101
+ }
102
+
103
+ const gridPoints = Math.trunc((t1 - t0) / step) + 1;
104
+ const numCheckpoints = Math.min(gridPoints, 1000);
105
+ const cpStep = (t1 - t0) / numCheckpoints;
106
+
107
+ for (let i = 1; i <= numCheckpoints; i++) {
108
+ const tout = (i < numCheckpoints) ? t0 + i * cpStep : t1;
109
+ const result = solver.solve(y, t, tout);
110
+ y = result.y;
111
+ t = result.t;
112
+
113
+ if (solver.state <= 0)
114
+ throw new Error(ERROR_MSG.LSODA_FAILS);
115
+ }
116
+
117
+ // 4. Use dense output to interpolate on the uniform output grid
118
+ const dense = solver.getDenseOutput();
119
+ const grid = dense.solveOnGrid(t0, t1, step);
120
+
121
+ if (callback)
122
+ callback.onComputationsCompleted();
123
+
124
+ // 5. Return solution: [tArr, y0Arr, y1Arr, ...]
125
+ const rowCount = grid.t.length;
126
+ const solution = Array<Float64Array>(dim + 1);
127
+ solution[0] = grid.t;
128
+ for (let i = 0; i < dim; ++i)
129
+ solution[i + 1] = grid.y[i];
130
+
131
+ // Patch last y values with the exact endpoint from the solver
132
+ for (let i = 0; i < dim; ++i)
133
+ solution[i + 1][rowCount - 1] = y[i];
134
+
135
+ return solution;
136
+ } // lsoda
@@ -4,15 +4,116 @@
4
4
  [1] https://doi.org/10.1137/S1064827594276424
5
5
  [2] https://doi.org/10.1016/S0898-1221(00)00175-9
6
6
  */
7
- import { max, abs, SAFETY, PSHRNK, PSGROW, REDUCE_COEF, GROW_COEF, ERR_CONTR, TINY, EPS, tDerivative, jacobian, ERROR_MSG } from './solver-defs';
7
+ import { max, min, abs, SAFETY, TINY, EPS, tDerivative, jacobian, ERROR_MSG } from './solver-defs';
8
8
  import { luDecomp, luSolve, solve1d2d } from './lin-alg-tools';
9
9
  // Quantities used in Rosenbrock method (see [1], [2] for more details)
10
10
  const D = 1.0 - Math.sqrt(2.0) / 2.0;
11
11
  const E32 = 6.0 + Math.sqrt(2.0);
12
- /** Solve initial value problem the modified Rosenbrock triple (MRT) method [1, 2]
12
+ const TWO_D = 2.0 * D;
13
+ const ONE_MINUS_2D = 1.0 - TWO_D;
14
+ // Adaptive step size control bounds (see MRT.md, Section 6)
15
+ const ALPHA_MAX = 5;
16
+ const ALPHA_MIN = 0.2;
17
+ /** Compute the initial step size using the Hairer-Norsett-Wanner algorithm.
18
+ * @param t0 initial time
19
+ * @param y0 initial state vector
20
+ * @param f right-hand side function
21
+ * @param tol scalar tolerance (plays the role of rtol)
22
+ * @param dim dimension of the system
23
+ * @param p order of the method (p = 2 for MRT)
24
+ * @param tEnd end of the integration interval (used to cap h0)
25
+ * @returns estimated initial step size
26
+ */
27
+ function initialStepSize(t0, y0, f, tol, dim, p, tEnd) {
28
+ const f0 = new Float64Array(dim);
29
+ const f1 = new Float64Array(dim);
30
+ const y1 = new Float64Array(dim);
31
+ const sc = new Float64Array(dim);
32
+ // Step 1: scale vector (sc[i] = |y0[i]| + TINY)
33
+ for (let i = 0; i < dim; ++i)
34
+ sc[i] = Math.abs(y0[i]) + TINY;
35
+ // Step 2: evaluate the right-hand side at the initial point
36
+ f(t0, y0, f0);
37
+ // Step 3: compute scaled norms d0 = ||y0/sc||, d1 = ||f0/sc||
38
+ let d0 = 0.0;
39
+ let d1 = 0.0;
40
+ for (let i = 0; i < dim; ++i) {
41
+ d0 = Math.max(d0, Math.abs(y0[i]) / sc[i]);
42
+ d1 = Math.max(d1, Math.abs(f0[i]) / sc[i]);
43
+ }
44
+ // Step 4: first guess
45
+ let h0;
46
+ if (d0 < 1e-5 || d1 < 1e-5)
47
+ h0 = 1e-6;
48
+ else
49
+ h0 = 0.01 * d0 / d1;
50
+ // Cap h0 to the integration interval
51
+ h0 = Math.min(h0, Math.abs(tEnd - t0));
52
+ // Step 5: explicit Euler probe to estimate the second derivative
53
+ for (let i = 0; i < dim; ++i)
54
+ y1[i] = y0[i] + h0 * f0[i];
55
+ f(t0 + h0, y1, f1);
56
+ let d2 = 0.0;
57
+ for (let i = 0; i < dim; ++i)
58
+ d2 = Math.max(d2, Math.abs(f1[i] - f0[i]) / sc[i]);
59
+ d2 /= h0;
60
+ // Step 6: refine using the method order
61
+ // h1 = (tol / max(d1, d2))^(1/(p+1))
62
+ const maxD = Math.max(d1, d2);
63
+ let h1;
64
+ if (maxD <= 1e-15)
65
+ h1 = Math.max(1e-6, h0 * 1e-3);
66
+ else
67
+ h1 = Math.pow(tol / maxD, 1.0 / (p + 1));
68
+ // Step 7: final initial step size
69
+ h0 = Math.min(100.0 * h0, h1);
70
+ // Safety: clip to the integration interval
71
+ h0 = Math.min(h0, Math.abs(tEnd - t0));
72
+ return h0;
73
+ }
74
+ /** Solve initial value problem the modified Rosenbrock triple (MRT) method
13
75
  * @param odes initial value problem for ordinary differential equations
14
76
  * @param callback computations control callback
15
77
  * @returns solution of the problem
78
+ * @example
79
+ * // Example. Solve the following initial value problem using the MRT 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, mrt } 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 MRT method
106
+ * const solution = mrt(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
+ * ```
16
117
  */
17
118
  export function mrt(odes, callback) {
18
119
  /** right-hand side of the IVP solved */
@@ -20,13 +121,15 @@ export function mrt(odes, callback) {
20
121
  // operating variables
21
122
  const t0 = odes.arg.start;
22
123
  const t1 = odes.arg.finish;
23
- let h = odes.arg.step;
24
- const hDataframe = h;
124
+ const hDataframe = odes.arg.step;
25
125
  const tolerance = odes.tolerance;
26
- /** number of solution dataframe rows */
27
- const rowCount = Math.trunc((t1 - t0) / h) + 1;
28
126
  /** dimension of the problem */
29
127
  const dim = odes.initial.length;
128
+ // compute the initial step size automatically
129
+ let h = initialStepSize(t0, new Float64Array(odes.initial), f, tolerance, dim, 2, t1);
130
+ //console.log(`MRT, the problem "${odes.name}", grid step: ${hDataframe}, initial step size: ${h}.`);
131
+ /** number of solution dataframe rows */
132
+ const rowCount = Math.trunc((t1 - t0) / hDataframe) + 1;
30
133
  const dimSquared = dim * dim;
31
134
  /** independent variable values */
32
135
  const tArr = new Float64Array(rowCount);
@@ -42,7 +145,6 @@ export function mrt(odes, callback) {
42
145
  let flag = true;
43
146
  let index = 1;
44
147
  let errmax = 0;
45
- let hTemp = 0;
46
148
  let tNew = 0;
47
149
  // 0 BUFFERS & TEMP STRUCTURES
48
150
  /** identity matrix */
@@ -156,32 +258,32 @@ export function mrt(odes, callback) {
156
258
  for (let i = 0; i < dim; ++i)
157
259
  errmax = max(errmax, abs(yErr[i] / yScale[i]));
158
260
  errmax /= tolerance;
159
- // processing the error obtained
261
+ // adaptive step size control (see MRT.md, Section 6)
160
262
  if (errmax > 1) {
161
- hTemp = SAFETY * h * Math.pow(errmax, PSHRNK);
162
- h = max(hTemp, REDUCE_COEF * h);
263
+ // step rejected: reduce step size, but not below ALPHA_MIN factor
264
+ h = h * max(ALPHA_MIN, SAFETY * Math.pow(errmax, (-1 / 3)));
163
265
  tNew = t + h;
164
266
  if (tNew == t)
165
267
  throw new Error(ERROR_MSG.MRT_FAILS);
166
268
  }
167
269
  else {
168
- if (errmax > ERR_CONTR)
169
- hNext = SAFETY * h * Math.pow(errmax, PSGROW);
170
- else
171
- hNext = GROW_COEF * h;
270
+ // step accepted: grow step size, but not above ALPHA_MAX factor
271
+ hNext = h * min(ALPHA_MAX, SAFETY * Math.pow(errmax, (-1 / 3)));
172
272
  t = t + h;
173
273
  for (let i = 0; i < dim; ++i)
174
274
  y[i] = yTemp[i];
175
275
  break;
176
276
  }
177
277
  } // while (true)
178
- // compute lineraly interpolated results and store them in dataframe
278
+ // compute dense output using Shampine-Reichelt continuous extension
279
+ const hStep = t - tPrev;
179
280
  while (timeDataframe < t) {
180
- const cLeft = (t - timeDataframe) / (t - tPrev);
181
- const cRight = 1.0 - cLeft;
281
+ const s = (timeDataframe - tPrev) / hStep;
282
+ const b1 = s * (1.0 - s) / ONE_MINUS_2D;
283
+ const b2 = s * (s - TWO_D) / ONE_MINUS_2D;
182
284
  tArr[index] = timeDataframe;
183
285
  for (let j = 0; j < dim; ++j)
184
- yArrs[j][index] = cRight * y[j] + cLeft * yPrev[j];
286
+ yArrs[j][index] = yPrev[j] + hStep * (b1 * k1[j] + b2 * k2[j]);
185
287
  timeDataframe += hDataframe;
186
288
  ++index;
187
289
  }
@@ -198,7 +300,7 @@ export function mrt(odes, callback) {
198
300
  for (let i = 0; i < dim; ++i)
199
301
  yArrs[i][rowCount - 1] = y[i];
200
302
  // 4. prepare output
201
- const solution = Array(dim);
303
+ const solution = Array(dim + 1);
202
304
  // independent variable
203
305
  solution[0] = tArr;
204
306
  // functions
@@ -1 +1 @@
1
- {"version":3,"file":"mrt-method.js","sourceRoot":"","sources":["mrt-method.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mrt-method.js","sourceRoot":"","sources":["mrt-method.ts"],"names":[],"mappings":"AAAA;;;;;EAKE;AAEF,OAAO,EAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAC,MAAM,eAAe,CAAC;AAEvG,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE7D,uEAAuE;AACvE,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACrC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AACtB,MAAM,YAAY,GAAG,GAAG,GAAG,KAAK,CAAC;AAEjC,4DAA4D;AAC5D,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB;;;;;;;;;GASG;AACH,SAAS,eAAe,CACtB,EAAU,EACV,EAAgB,EAChB,CAA0D,EAC1D,GAAW,EACX,GAAW,EACX,CAAS,EACT,IAAY;IAEZ,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAEjC,gDAAgD;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1B,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEjC,4DAA4D;IAC5D,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEd,8DAA8D;IAC9D,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,GAAG,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,sBAAsB;IACtB,IAAI,EAAU,CAAC;IAEf,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI;QACxB,EAAE,GAAG,IAAI,CAAC;;QAEV,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;IAEtB,qCAAqC;IACrC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAEvC,iEAAiE;IACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1B,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7B,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEnB,IAAI,EAAE,GAAG,GAAG,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,EAAE,IAAI,EAAE,CAAC;IAET,wCAAwC;IACxC,uCAAuC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,EAAU,CAAC;IAEf,IAAI,IAAI,IAAI,KAAK;QACf,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;;QAE/B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE3C,kCAAkC;IAClC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAE9B,2CAA2C;IAC3C,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAEvC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CE;AACF,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,QAAmB;IACjD,wCAAwC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IACpB,sBAAsB;IACtB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAEjC,+BAA+B;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAEhC,8CAA8C;IAC9C,IAAI,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtF,qGAAqG;IAErG,wCAAwC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,CAAC;IAE7B,kCAAkC;IAClC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IAExC,gCAAgC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAe,GAAG,CAAC,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IAExC,iBAAiB;IACjB,IAAI,aAAa,GAAG,EAAE,GAAG,UAAU,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,8BAA8B;IAE9B,sBAAsB;IACtB,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAEtC,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAEnC,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC;IAExB,8BAA8B;IAC9B,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErB,0EAA0E;IAC1E,OAAO,IAAI,EAAE,CAAC;QACZ,qBAAqB;QACrB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAEd,sCAAsC;QACtC,IAAI,QAAQ;YACV,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAE9B,uBAAuB;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAElD,kBAAkB;QAClB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YACf,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACX,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;QAED,yDAAyD;QACzD,8DAA8D;QAC9D,OAAO,IAAI,EAAE,CAAC;YACZ,sDAAsD;YACtD,8BAA8B;YAC9B,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC7C,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEf,wBAAwB;YAExB,gBAAgB;YAChB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAEZ,gCAAgC;YAChC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC;gBACjC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAE1B,2BAA2B;YAC3B,IAAI,OAAO;gBACT,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAEzB,iDAAiD;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAE5B,IAAI,OAAO;gBACT,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;gBAErC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAE1B,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC;YAElB,2BAA2B;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAEnC,6BAA6B;YAC7B,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAEzB,uDAAuD;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,OAAO;gBACT,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;gBAErC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAExB,gCAAgC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9B,uBAAuB;YACvB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAEpB,qFAAqF;YACrF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAE5E,IAAI,OAAO;gBACT,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;gBAErC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAE1B,uCAAuC;YACvC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;YAEpD,mBAAmB;YACnB,MAAM,GAAG,CAAC,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,IAAI,SAAS,CAAC;YAEpB,qDAAqD;YACrD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,kEAAkE;gBAClE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAA,MAAM,EAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,CAAC,CAAC;gBACpD,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;gBACb,IAAI,IAAI,IAAI,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,gEAAgE;gBAChE,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAA,MAAM,EAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,CAAC,CAAC;gBACxD,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;oBAC1B,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAElB,MAAM;YACR,CAAC;QACH,CAAC,CAAC,eAAe;QAEjB,oEAAoE;QACpE,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,OAAO,aAAa,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;YAC1C,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;YACxC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,YAAY,CAAC;YAE1C,IAAI,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC;YAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjE,aAAa,IAAI,UAAU,CAAC;YAC5B,EAAE,KAAK,CAAC;QACV,CAAC;QAED,CAAC,GAAG,KAAK,CAAC;QACV,KAAK,GAAG,CAAC,CAAC;QAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,eAAe;IAEjB,iCAAiC;IACjC,IAAI,QAAQ;QACV,QAAQ,CAAC,uBAAuB,EAAE,CAAC;IAErC,8BAA8B;IAC9B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhC,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAe,GAAG,GAAG,CAAC,CAAC,CAAC;IAE9C,uBAAuB;IACvB,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEnB,YAAY;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE7B,OAAO,QAAQ,CAAC;IAChB,8BAA8B;AAChC,CAAC,CAAC,MAAM"}
@@ -5,36 +5,166 @@
5
5
  [2] https://doi.org/10.1016/S0898-1221(00)00175-9
6
6
  */
7
7
 
8
- import {ODEs, max, abs, SAFETY, PSHRNK, PSGROW, REDUCE_COEF, GROW_COEF,
9
- ERR_CONTR, TINY, EPS, tDerivative, jacobian, ERROR_MSG} from './solver-defs';
8
+ import {ODEs, max, min, abs, SAFETY, TINY, EPS, tDerivative, jacobian, ERROR_MSG} from './solver-defs';
10
9
  import {Callback} from './callbacks/callback-base';
11
10
  import {luDecomp, luSolve, solve1d2d} from './lin-alg-tools';
12
11
 
13
12
  // Quantities used in Rosenbrock method (see [1], [2] for more details)
14
13
  const D = 1.0 - Math.sqrt(2.0) / 2.0;
15
14
  const E32 = 6.0 + Math.sqrt(2.0);
15
+ const TWO_D = 2.0 * D;
16
+ const ONE_MINUS_2D = 1.0 - TWO_D;
17
+
18
+ // Adaptive step size control bounds (see MRT.md, Section 6)
19
+ const ALPHA_MAX = 5;
20
+ const ALPHA_MIN = 0.2;
21
+
22
+ /** Compute the initial step size using the Hairer-Norsett-Wanner algorithm.
23
+ * @param t0 initial time
24
+ * @param y0 initial state vector
25
+ * @param f right-hand side function
26
+ * @param tol scalar tolerance (plays the role of rtol)
27
+ * @param dim dimension of the system
28
+ * @param p order of the method (p = 2 for MRT)
29
+ * @param tEnd end of the integration interval (used to cap h0)
30
+ * @returns estimated initial step size
31
+ */
32
+ function initialStepSize(
33
+ t0: number,
34
+ y0: Float64Array,
35
+ f: (t: number, y: Float64Array, out: Float64Array) => void,
36
+ tol: number,
37
+ dim: number,
38
+ p: number,
39
+ tEnd: number,
40
+ ): number {
41
+ const f0 = new Float64Array(dim);
42
+ const f1 = new Float64Array(dim);
43
+ const y1 = new Float64Array(dim);
44
+ const sc = new Float64Array(dim);
45
+
46
+ // Step 1: scale vector (sc[i] = |y0[i]| + TINY)
47
+ for (let i = 0; i < dim; ++i)
48
+ sc[i] = Math.abs(y0[i]) + TINY;
49
+
50
+ // Step 2: evaluate the right-hand side at the initial point
51
+ f(t0, y0, f0);
52
+
53
+ // Step 3: compute scaled norms d0 = ||y0/sc||, d1 = ||f0/sc||
54
+ let d0 = 0.0;
55
+ let d1 = 0.0;
56
+
57
+ for (let i = 0; i < dim; ++i) {
58
+ d0 = Math.max(d0, Math.abs(y0[i]) / sc[i]);
59
+ d1 = Math.max(d1, Math.abs(f0[i]) / sc[i]);
60
+ }
61
+
62
+ // Step 4: first guess
63
+ let h0: number;
64
+
65
+ if (d0 < 1e-5 || d1 < 1e-5)
66
+ h0 = 1e-6;
67
+ else
68
+ h0 = 0.01 * d0 / d1;
69
+
70
+ // Cap h0 to the integration interval
71
+ h0 = Math.min(h0, Math.abs(tEnd - t0));
72
+
73
+ // Step 5: explicit Euler probe to estimate the second derivative
74
+ for (let i = 0; i < dim; ++i)
75
+ y1[i] = y0[i] + h0 * f0[i];
76
+
77
+ f(t0 + h0, y1, f1);
78
+
79
+ let d2 = 0.0;
16
80
 
17
- /** Solve initial value problem the modified Rosenbrock triple (MRT) method [1, 2]
81
+ for (let i = 0; i < dim; ++i)
82
+ d2 = Math.max(d2, Math.abs(f1[i] - f0[i]) / sc[i]);
83
+
84
+ d2 /= h0;
85
+
86
+ // Step 6: refine using the method order
87
+ // h1 = (tol / max(d1, d2))^(1/(p+1))
88
+ const maxD = Math.max(d1, d2);
89
+ let h1: number;
90
+
91
+ if (maxD <= 1e-15)
92
+ h1 = Math.max(1e-6, h0 * 1e-3);
93
+ else
94
+ h1 = Math.pow(tol / maxD, 1.0 / (p + 1));
95
+
96
+ // Step 7: final initial step size
97
+ h0 = Math.min(100.0 * h0, h1);
98
+
99
+ // Safety: clip to the integration interval
100
+ h0 = Math.min(h0, Math.abs(tEnd - t0));
101
+
102
+ return h0;
103
+ }
104
+
105
+ /** Solve initial value problem the modified Rosenbrock triple (MRT) method
18
106
  * @param odes initial value problem for ordinary differential equations
19
107
  * @param callback computations control callback
20
108
  * @returns solution of the problem
109
+ * @example
110
+ * // Example. Solve the following initial value problem using the MRT method:
111
+ * // dx/dt = x + y - t
112
+ * // dy/dt = x * y + t
113
+ * // x(0) = 1
114
+ * // y(0) = -1
115
+ * // on [0, 2] with the step 0.01.
116
+ * import { ODEs, mrt } from 'diff-grok';
117
+ *
118
+ * const task: ODEs = {
119
+ * name: 'Example', // name of your model
120
+ * arg: {
121
+ * name: 't', // name of the argument
122
+ * start: 0, // initial value of the argument
123
+ * finish: 2, // final value of the argument
124
+ * step: 0.01, // solution grid step
125
+ * },
126
+ * initial: [1, -1], // initial values
127
+ * func: (t: number, y: Float64Array, output: Float64Array) => { // right-hand side of the system
128
+ * output[0] = y[0] + y[1] - t; // 1-st equation
129
+ * output[1] = y[0] * y[1] + t; // 2-nd equation
130
+ * },
131
+ * tolerance: 1e-7, // tolerance
132
+ * solutionColNames: ['x', 'y'], // names of solution functions
133
+ * };
134
+ *
135
+ * try {
136
+ * // Solve the problem using the MRT method
137
+ * const solution = mrt(task);
138
+ *
139
+ * // Print a table with the results
140
+ * console.log(task.arg.name, task.solutionColNames[0], task.solutionColNames[1]);
141
+ * const length = solution[0].length;
142
+ * for (let i = 0; i < length; ++i)
143
+ * console.log(solution[0][i], solution[1][i], solution[2][i]);
144
+ * } catch (err) {
145
+ * console.log('Solver failed: ', err instanceof Error ? err.message : 'Unknown problem!');
146
+ * }
147
+ * ```
21
148
  */
22
149
  export function mrt(odes: ODEs, callback?: Callback): Float64Array[] {
23
150
  /** right-hand side of the IVP solved */
24
151
  const f = odes.func;
25
-
26
152
  // operating variables
27
153
  const t0 = odes.arg.start;
28
154
  const t1 = odes.arg.finish;
29
- let h = odes.arg.step;
30
- const hDataframe = h;
155
+ const hDataframe = odes.arg.step;
31
156
  const tolerance = odes.tolerance;
32
157
 
33
- /** number of solution dataframe rows */
34
- const rowCount = Math.trunc((t1 - t0) / h) + 1;
35
-
36
158
  /** dimension of the problem */
37
159
  const dim = odes.initial.length;
160
+
161
+ // compute the initial step size automatically
162
+ let h = initialStepSize(t0, new Float64Array(odes.initial), f, tolerance, dim, 2, t1);
163
+
164
+ //console.log(`MRT, the problem "${odes.name}", grid step: ${hDataframe}, initial step size: ${h}.`);
165
+
166
+ /** number of solution dataframe rows */
167
+ const rowCount = Math.trunc((t1 - t0) / hDataframe) + 1;
38
168
  const dimSquared = dim * dim;
39
169
 
40
170
  /** independent variable values */
@@ -54,7 +184,6 @@ export function mrt(odes: ODEs, callback?: Callback): Float64Array[] {
54
184
  let flag = true;
55
185
  let index = 1;
56
186
  let errmax = 0;
57
- let hTemp = 0;
58
187
  let tNew = 0;
59
188
 
60
189
  // 0 BUFFERS & TEMP STRUCTURES
@@ -202,18 +331,16 @@ export function mrt(odes: ODEs, callback?: Callback): Float64Array[] {
202
331
  errmax = max(errmax, abs(yErr[i] / yScale[i]));
203
332
  errmax /= tolerance;
204
333
 
205
- // processing the error obtained
334
+ // adaptive step size control (see MRT.md, Section 6)
206
335
  if (errmax > 1) {
207
- hTemp = SAFETY * h * errmax**PSHRNK;
208
- h = max(hTemp, REDUCE_COEF * h);
336
+ // step rejected: reduce step size, but not below ALPHA_MIN factor
337
+ h = h * max(ALPHA_MIN, SAFETY * errmax ** (-1 / 3));
209
338
  tNew = t + h;
210
339
  if (tNew == t)
211
340
  throw new Error(ERROR_MSG.MRT_FAILS);
212
341
  } else {
213
- if (errmax > ERR_CONTR)
214
- hNext = SAFETY * h * errmax**PSGROW;
215
- else
216
- hNext = GROW_COEF * h;
342
+ // step accepted: grow step size, but not above ALPHA_MAX factor
343
+ hNext = h * min(ALPHA_MAX, SAFETY * errmax ** (-1 / 3));
217
344
  t = t + h;
218
345
 
219
346
  for (let i = 0; i < dim; ++i)
@@ -223,15 +350,17 @@ export function mrt(odes: ODEs, callback?: Callback): Float64Array[] {
223
350
  }
224
351
  } // while (true)
225
352
 
226
- // compute lineraly interpolated results and store them in dataframe
353
+ // compute dense output using Shampine-Reichelt continuous extension
354
+ const hStep = t - tPrev;
227
355
  while (timeDataframe < t) {
228
- const cLeft = (t - timeDataframe) / (t - tPrev);
229
- const cRight = 1.0 - cLeft;
356
+ const s = (timeDataframe - tPrev) / hStep;
357
+ const b1 = s * (1.0 - s) / ONE_MINUS_2D;
358
+ const b2 = s * (s - TWO_D) / ONE_MINUS_2D;
230
359
 
231
360
  tArr[index] = timeDataframe;
232
361
 
233
362
  for (let j = 0; j < dim; ++j)
234
- yArrs[j][index] = cRight * y[j] + cLeft * yPrev[j];
363
+ yArrs[j][index] = yPrev[j] + hStep * (b1 * k1[j] + b2 * k2[j]);
235
364
 
236
365
  timeDataframe += hDataframe;
237
366
  ++index;
@@ -255,7 +384,7 @@ export function mrt(odes: ODEs, callback?: Callback): Float64Array[] {
255
384
  yArrs[i][rowCount - 1] = y[i];
256
385
 
257
386
  // 4. prepare output
258
- const solution = Array<Float64Array>(dim);
387
+ const solution = Array<Float64Array>(dim + 1);
259
388
 
260
389
  // independent variable
261
390
  solution[0] = tArr;