hw4 (no graphics)

Euler's method

by YouTingKuo

JavaScript

var m = 1, k = 5, c = .0;
var x = [], x2 = [];

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;
    }
  */
  /*
  //Midpoint Method
  	var f = deriv(x);
  	for(var i = 0; i < n; i++)
      	x2[i] = x[i] + f[i] * (dt/2);
  	f = deriv(x2);
  	for(var i = 0; i < n; i++)
      	x[i] += f[i] * dt;
  */
    var f = deriv(x);
    for(var i = 0; i < n; i++) {
        k1 = f[i];
        
        var t = [];
        t[0] = x[0] + 0.5*dt;
        t[1] = x[1] + 0.5*k1*dt;
        var f2 = deriv(t);
        k2 = f2[i];
        
        t[0] = x[0] + 0.5*dt;
        t[1] = x[1] + 0.5*k2*dt;
        var f3 = deriv(t);
        k3 = f3[i];
        
        t[0] = x[0] + dt;
        t[1] = x[1] + k3*dt;
        var f4 = deriv(t);
        k4 = f4[i];
        
        x[i] += (k1+2*k2+2*k3+k4)*dt/6;
    }
}

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

function animate() {
    requestAnimationFrame(animate);
	var dt = 0.01;
    ODESolver (x,dt); 
    console.log (x[0]);
}