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]);
}