Linear Algebra - Ordinary Differential Equations

Overview


Linear Algebra can be used to numerically solve ordinary differential equations. Consider the following sample equation
{% d^2x(t)/ dt^2 = a(t,x) \times dx(t)/dt + b(t,x) \times x(t) %}
with a set of boundary conditions
{% x(0) = x_0 \\ dx(0)/dt = x_1 \\ d^2 x(0)/dt^2 = x_2 %}
The key to modeling this equation would be to re-express the equation as a set of linear algebra equations. First, we form the following vector.
{% \begin{bmatrix} \ddot{x}(t+1) \\ \dot{x}(t+1) \\ x(t+1) \\ \end{bmatrix} %}
Then we express the differential equation as
{% \begin{bmatrix} \ddot{x}(t+1) \\ \dot{x}(t+1) \\ x(t+1) \\ \end{bmatrix} = \begin{bmatrix} 0 & a(t,x) & b(t,x) \\ \Delta t & 1 & 0\\ 0 & \Delta t & 1 \\ \end{bmatrix} \begin{bmatrix} \ddot{x}(t) \\ \dot{x}(t) \\ x(t) \\ \end{bmatrix} %}

Implementation


The following code utilizes the linear algebra library to simulate the evolution of the second order differential equation
{% \frac{d^x(t)}{dt^2} = -x(t) %}

let la =  await import('/lib/linear-algebra/v1.0.0/linear-algebra.mjs');

let k = 1;
let dt = 0.01;
let x0=1;
let x1=0;
let x2=0;;
let t = 0;
let a = (t, vector) =>0;
let b = (t, vector)=>-1;

let vector = [[x2],[x1],[x0]];

let mult = [[0,a(t, vector[2][0]),b(t, vector[2][0])],[dt, 1, 0],[0, dt, 1]];
let data = [];

for(let i=0;i<1000;i++){ 
  vector=la.multiply(mult, vector);
  data.push({t:t, x:vector[2][0]});
  mult=[[0,a(t, vector[2][0]),b(t, vector[2][0])],[dt, 1, 0],[0, dt, 1]];
  t+=dt;
}
					
Try it!

Contents