Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

一次元振動方程式をjavascriptで解いてみる

ふと

物理シミュレーションをしたくなったので、やってみたメモ。

概要

ちょっと疲れたので、方程式については割愛です。すいません。
後日ちゃんと書きます。

結果

f:id:hope_is_dream:20140515225147p:plain

上が変位。 下が強制力。

なぜか変位のグラフに二つの振動数の調和振動っぽい波形になっている。

予想では、位相がずれただけの波形になるはずと思っているのだが..

と。

いまのところ、微分の離散化がまずかったのかもしれないと考えている。

今回はテストのため、風上差分をとっていて、ルンゲクッタとかを使ってない。

んー。

汎用ソフトばっかりつかってると中身が分からなくていかんなー。

と。勉強になりました。

また挑戦します。

   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");