1 | "use strict";
|
2 | var __assign = (this && this.__assign) || function () {
|
3 | __assign = Object.assign || function(t) {
|
4 | for (var s, i = 1, n = arguments.length; i < n; i++) {
|
5 | s = arguments[i];
|
6 | for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
7 | t[p] = s[p];
|
8 | }
|
9 | return t;
|
10 | };
|
11 | return __assign.apply(this, arguments);
|
12 | };
|
13 | var __spreadArrays = (this && this.__spreadArrays) || function () {
|
14 | for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
15 | for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
16 | for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
17 | r[k] = a[j];
|
18 | return r;
|
19 | };
|
20 | Object.defineProperty(exports, "__esModule", { value: true });
|
21 | exports._scalarMult = function (scalar, vector) { return vector.map(function (x) { return scalar * x; }); };
|
22 | exports._vectorAdd = function (a, b) { return a.map(function (x, i) { return x + b[i]; }); };
|
23 | exports.UndependentVariableError = new Error('The destination of the undependent variable has to be greater than its start');
|
24 | exports.StepSizeDivisibilityError = new Error('The range has to be an divisible by the step size');
|
25 | function default_1(ODE, initialCondition, range, stepSize) {
|
26 | if (stepSize === void 0) { stepSize = 1; }
|
27 | var t0 = range[0], tn = range[1];
|
28 | var _return;
|
29 | if (tn > t0) {
|
30 | var steps = (tn - t0) / stepSize;
|
31 | var args = {
|
32 | equation: ODE,
|
33 | start: t0,
|
34 | stepSize: stepSize,
|
35 | steps: steps,
|
36 | };
|
37 | if (Number.isInteger(steps)) {
|
38 | if (typeof initialCondition === 'object' && initialCondition.length > 1) {
|
39 | _return = rungeKuttaMulti(__assign(__assign({}, args), { initialCondition: initialCondition }));
|
40 | }
|
41 | else {
|
42 | var _initialCondition = void 0;
|
43 | if (typeof initialCondition === 'object') {
|
44 | _initialCondition = initialCondition[0];
|
45 | }
|
46 | else {
|
47 | _initialCondition = initialCondition;
|
48 | }
|
49 | _return = rungeKutta1d(__assign(__assign({}, args), { initialCondition: _initialCondition }));
|
50 | }
|
51 | return _return;
|
52 | }
|
53 | throw exports.StepSizeDivisibilityError;
|
54 | }
|
55 | throw exports.UndependentVariableError;
|
56 | }
|
57 | exports.default = default_1;
|
58 | var rungeKutta1d = function (args) {
|
59 | var equation = args.equation, initialCondition = args.initialCondition, start = args.start, stepSize = args.stepSize, steps = args.steps;
|
60 | var f = equation;
|
61 | var n = steps;
|
62 | var h = stepSize;
|
63 | var y = __spreadArrays([initialCondition], new Array(n).fill(0));
|
64 | var t = start;
|
65 | var i = 0;
|
66 | var k1, k2, k3, k4;
|
67 | while (i < n) {
|
68 | k1 = f(t, y[i]);
|
69 | k2 = f(t + (.5 * h), y[i] + (.5 * h * k1));
|
70 | k3 = f(t + (.5 * h), y[i] + (.5 * h * k2));
|
71 | k4 = f(t + h, y[i] + (h * k3));
|
72 | y[i + 1] = y[i] + (h * (k1 + (2 * k2) + (2 * k3) + k4) / 6);
|
73 | t += h;
|
74 | i++;
|
75 | }
|
76 | return y;
|
77 | };
|
78 | var rungeKuttaMulti = function (args) {
|
79 | var equation = args.equation, initialCondition = args.initialCondition, start = args.start, stepSize = args.stepSize, steps = args.steps;
|
80 | var f = equation;
|
81 | var n = steps;
|
82 | var h = stepSize;
|
83 | var y = [initialCondition];
|
84 | var m = initialCondition.length;
|
85 | var t = start;
|
86 | var i = 0;
|
87 | var k1, k2, k3, k4;
|
88 | while (i < n) {
|
89 | var yNext = [];
|
90 | k1 = f(t, y[i]);
|
91 | k2 = f(t + (.5 * h), exports._vectorAdd(y[i], exports._scalarMult(.5 * h, k1)));
|
92 | k3 = f(t + (.5 * h), exports._vectorAdd(y[i], exports._scalarMult(.5 * h, k2)));
|
93 | k4 = f(t + h, exports._vectorAdd(y[i], exports._scalarMult(h, k3)));
|
94 | for (var k = 0; k < m; k++) {
|
95 | yNext.push(y[i][k] + (h * (k1[k] + (2 * k2[k]) + (2 * k3[k]) + k4[k]) / 6));
|
96 | }
|
97 | y.push(yNext);
|
98 | t += h;
|
99 | i++;
|
100 | }
|
101 | return y;
|
102 | };
|
103 |
|
\ | No newline at end of file |