hw4 (no graphics)

Euler's method

by 蔡 育曄

JavaScript

var m = 1, k = 5, c = 0.51;
var x = [],x2 = [], x3 = [];

init();
animate();

function deriv (x) {
	var ff = [];
    ff.push (x[1]);                  // x_dot = v;
    ff.push (-(c*x[1] + k*x[0])/m);  // v_dot = 1/m *(-cx_dot -kx)
    return ff;
}

function ODESolver(x, dt) {
    var n = x.length;

    // Euler's method
    var f = deriv(x);
    for (var i = 0; i < n; i++) {
        x[i] += f[i] * dt;
    }
}

function doMidPoint(x2, dt) {
	// predictor:
  let ff = deriv (x2)
  let predict = [];
  predict.push (x2[0] + ff[0] * dt/2)
  predict.push (x2[1] + ff[1] * dt/2)
  
  let ffp = deriv (predict);
  x2[0] += ffp[0]*dt
  x2[1] += ffp[1]*dt

}

function doRK4(x3,dt) {
	let k1 = [];
  k1 = deriv (x3);
  
  let k2 = [], y2 = [];
  y2.push(x3[0] + k1[0]*dt/2);
  y2.push(x3[1] + k1[1]*dt/2);
  k2 = deriv (y2);
  
  let k3 = [], y3 = [];
  y3.push(x3[0] + k2[0]*dt/2);
  y3.push(x3[1] + k2[1]*dt/2);
  k3 = deriv (y3);
  
  let k4 = [], y4 = [];
  y4.push(x3[0] + k3[0]*dt);
  y4.push(x3[1] + k3[1]*dt);
	k4 = deriv (y4);
  
  x3[0] = x3[0] + (k1[0] + 2*k2[0] + 2*k3[0] + k4[0])/6*dt;
  x3[1] = x3[1] + (k1[1] + 2*k2[1] + 2*k3[1] + k4[1])/6*dt;

}

function init() {	
    // INITIIALIZE ODE
    x.push (20);
    x.push (0);
    x2.push (20);
    x2.push (0);
    x3.push (20);
    x3.push (0);
}

function animate() {
    requestAnimationFrame(animate);
	var dt = 0.01;
    ODESolver (x,dt);
    console.log ('Euler: '+ x[0]);
    doMidPoint(x2, dt);
    console.log ('Mid Point: ' + x2[0]);
    doRK4(x3,dt);
    console.log ('RK4: ' + x3[0]);
}