0

問題のコードはここにあります:

function k = whileloop(odefun,args)
    ...
    while (sign(costheta) == originalsign)
        y=y(:) + odefun(0,y(:),vars,param)*(dt); % Line 4
        costheta = dot(y-normpt,normvec);
        k = k + 1;
    end
    ...
end

明確にするために、odefunは私のmファイルであるF1.mです。このwhileループを含む関数に渡します。のようなものwhileloop(@F1,args)です。上記のコードブロックの4行目は、オイラー法です。

whileループを使用している理由は、点「normpt」で定義された平面と平面に垂直なベクトル「normvec」を横切るベクトル「y」でトリガーしたいためです。

劇的にスピードアップするこのコードへの簡単な変更はありますか?代わりに(速度を上げるために)mexファイルを作成する方法を学ぶ必要がありますか?

編集:

これは、テストを試みることができるものの例で急いで試みたものです。私はこれをデバッグしていません。それはあなたにアイデアを与えることです:

%Save the following 3 lines in an m-file named "F1.m"
function ydot = F1(placeholder1,y,placeholder2,placeholder3)
    ydot = y/10;
end

%Run the following:
dt = 1.5e-12 %I do not know about this. You will have to experiment.
y0 = [.1,.1,.1];
normpt = [3,3,3];
normvec = [1,1,1];
originalsign = sign(dot(y0-normpt,normvec));
costheta = originalsign;
y = y0;
k = 0;
while (sign(costheta) == originalsign)
    y=y(:) + F1(0,y(:),0,0)*(dt); % Line 4
    costheta = dot(y-normpt,normvec);
    k = k + 1;
end
disp(k);

dtは、トリガーするのに数十万回の反復が必要になるように十分に小さくする必要があります。

オイラー法を使用する必要があると仮定します。なぜそのような仮定をとるように言うのか知りたい場合は、状態依存ノイズを伴う確率微分方程式があります。

4

1 に答える 1

2

私はあなたの実際の ODE 統合に焦点を当てます。実行するステップが少ないほど、ループの実行速度が速くなります。実際の統合方法を最適化した後、符号チェックの速度についてのみ心配します。

一次陽オイラー法を使用しているようです。高次の積分器または陰解法を試しましたか? 多くの場合、時間ステップを大幅に増やすことができます。

于 2012-06-26T17:40:39.013 に答える