一定の時間ステップでメソッドを実装するとしますdt>0
。方程式を時間まで統合したい場合はT>0
、時間の離散化を検討します
tt = 0:dt:T;
速度を上げるために、ソリューションベクトルを事前に割り当てたほうがよいでしょう。
yy=zeros(1,length(tt));
yy
生成するソリューションの最初の時間近似が含まれます(つまり、表記法をほとんど乱用せずに、
yy(1)==y_r(t=0)
と
yy(end)==y_r(t=T) + global error,
ここで、関数y_r=y_r(t)
は私たちの本当の解決策です)。
おそらく、通常の形式の1次常微分方程式があります。
dy_r / dt = f(y_r;t)
および初期データム
y_r(t=0)=y_0
(つまり、コーシー問題があります)。したがって、最初に解ベクトルを初期化する必要があります
yy(1) = y_0;
そうすれば、将来の解決策を見つけることができます。
N = length(tt);
for t = 2 : N // we should look at future times, thus we start from 2
// NOTE: this is first order explicit Euler scheme.
yy(t) = yy(t-1) + dt*f(yy(t-1),t);
end
終わったね。これで、解をプロットできます。
plot(tt,yy);
ここで重要なのは、 1次精度に満足していますか?
このスキームを使用して、たとえばハミルトニアン問題(単純な調和振動子など)を解くと、システムに人工的な励起が与えられると考えてください(適切には、正しいハミルトニアン軌道からのドリフトを見ることができます)。一言で言えば、少し時間が経つと、ソリューションは完全に人工的なものになります。
実際、実際の問題を解くときは、問題と物理学を注意深く検討し、適切な数値スキームを選択して方程式を解く必要があります。間もなく、ルンゲ・クッタ法などのより正確なスキームを実装するように求められるでしょう(信頼性は高くなりますが、少なくとも元の形式では少しだけです)。