問題のコードはここにあります:
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は、トリガーするのに数十万回の反復が必要になるように十分に小さくする必要があります。
オイラー法を使用する必要があると仮定します。なぜそのような仮定をとるように言うのか知りたい場合は、状態依存ノイズを伴う確率微分方程式があります。