読者です 読者をやめる 読者になる 読者になる

Hope is a Dream. Dream is a Hope.

非公開ふぃふぃ工房ブログ

↓LINE登録はこちら↓

定期的につぶやいてます. 記事に興味を持って頂いたかたや、Line Botを使ってみたいかたは試しに登録どうぞ

友だち追加

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

数値計算 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");