一次元振動方程式をjavascriptで解いてみる
ふと
物理シミュレーションをしたくなったので、やってみたメモ。
概要
ちょっと疲れたので、方程式については割愛です。すいません。
後日ちゃんと書きます。
結果
上が変位。 下が強制力。
なぜか変位のグラフに二つの振動数の調和振動っぽい波形になっている。
予想では、位相がずれただけの波形になるはずと思っているのだが..
と。
いまのところ、微分の離散化がまずかったのかもしれないと考えている。
今回はテストのため、風上差分をとっていて、ルンゲクッタとかを使ってない。
んー。
汎用ソフトばっかりつかってると中身が分からなくていかんなー。
と。勉強になりました。
また挑戦します。
var IC_m = 1; var IC_c = -0.8; var IC_k = 10; var IC_dt = 0.001; //[s] var A = IC_m*(1 /IC_dt /IC_dt); var B = IC_c*(1 /IC_dt); var C = IC_k; var P = A+B+C; var Q = (-2)*A+(-1)*B; var R = A; var cont=[IC_m, IC_c, IC_k, A, B, C, P, Q, R]; console.log(cont); var MAXTIMESTEP=2000; var BC_ofset =3 var force = function (step) { // body... var AMP = 10000; var CYCLE = 0.1; var value =0; value = AMP*Math.sin(2*Math.PI*(1/CYCLE) * IC_dt*(step - BC_ofset)); return value; } // Initiarize Result ary var result = new Array(MAXTIMESTEP); for (var i = 0; i < result.length; i++) {result[i]=0;}; // Solve function var solver = function (step) { var mem = Q*result[step-1] + R*result[step-2] + (-1)*force(step); // console.log("mem = "+mem); var value = (-1)*(1/P)*mem; return value; } // Solve for (var i = 0; i < MAXTIMESTEP; i++) { // result[i] = solver(i); var mem; // = Q*result[i-1] + R*result[i-2] + (-1)*force(i); if(i < 2){ mem = (-1)*force(i); }else{ mem = Q*result[i-1] + R*result[i-2] + (-1)*force(i); } result[i] = (-1)*(1/P)*mem; } console.log(result); // RESULT Graph $("#debug").append('<div id="graph-test1" width="900" height="400"></div>'); plotUserGraph(result, "graph-test1"); // FORCE Graph var force_ary=[]; for (var i = 0; i < MAXTIMESTEP; i++) { force_ary.push(force(i)); } $("#debug").append('<div id="graph-test2" width="900" height="400"></div>'); plotUserGraph(force_ary, "graph-test2");