function MoL(description) {
let { a, b, A, B, D, k, T, f, u0, n } = description;
let dx = (b - a) / n;
let init = d3.range(n + 1).map((i) => u0(a + i * dx));
function F(v, t) {
return v.map(function (x, i) {
let xi = a + i * dx;
if (i == 0) {
return A;
} else if (i == n) {
return B;
} else if (i == 1) {
return (D * (v[2] - 2 * v[1] + A)) / dx ** 2 + k * v[1] + f(xi);
} else if (i == n - 1) {
return (
(D * (B - 2 * v[n - 1] + v[n - 2])) / dx ** 2 + k * v[n - 1] + f(xi)
);
} else {
return (
(D * (v[i + 1] - 2 * v[i] + v[i - 1])) / dx ** 2 + k * v[i] + f(xi)
);
}
});
}
let solutions = rk4(F, init, 0, 0, T, D * T * n ** 2);
let ymin = d3.min(solutions[0]);
let ymax = d3.max(solutions[0]);
solutions = solutions.map((s, m) =>
s.map(function (y, i) {
if (i == 0 && m > 0) {
return [a, A];
} else if (i == n && m > 0) {
return [b, B];
} else {
return [a + i * dx, y];
}
})
);
let yrange = ymax - ymin;
solutions.ymin = ymin - 0.5 * yrange;
solutions.ymax = ymax + 0.5 * yrange;
return solutions;
}