ご覧いただきありがとうございます。
ルンゲクッタ法を用いて
dq/dt=p dp/dt=-q p0=1 q0=0
を解きたいです。
現在、ウェブサイトでルンゲクッタ法の解き方を自分で調べて書いてみたのですが、明らかにおかしな値(sin,cos の値になっていない)になっています。
参考にしたところに書いてあったのは
d^2y/dx^2=f(x,y,y') を解くのに y'=p とおいて dp1=h*f(x,y,p) dy1=h*p dp2=h*f(x+h/2,y+dy1/2,p+dp1/2) dy2=h*(p+dp1/2) dp3=h*f(x+h/2,y+dy2/2,p+dp2/2) dy3=h*f(p+dp2/2) dp4=h*f(x+h,y+dy3,p+dp3) dy4=h*(p+dp3)
で私の場合
y=q,x=t,y'=p,f(x,y,y')=-q
と置き換えました。
こう置き換えた場合、p,qがtの関数であるはずなのにうまくtでパラメータ表示できていないのですが、どう改善すればいいのでしょうか。
c
1double runge(double q0, double p0, double t0, double tn, int n) 2{ 3 int i; 4 double q, p, t, h, dq1, dq2, dq3, dq4, dp1, dp2, dp3, dp4; 5 q = q0; 6 p = p0; 7 t = t0; 8 h = (tn - t0) /n; 9 10 11 for ( i=1; i <= n ; i++){ 12 13 dp1 = -q; 14 dq1 = p; 15 dp2 = -(q+dq1/2); 16 dq2 = p + dp1/2; 17 dp3 = -(q + dq2/2); 18 dq3 = p+dp2/2; 19 dp4 = -(q + dq3); 20 dq4 = p+ dp3; 21 q += (dq1 + 2 * dq2 + 2 * dq3 + dq4)*(h/6.0); 22 t = t0 + i*h; 23 printf("q(%f)=%f\n", t, q); 24 p += (dp1 + 2 * dp2 + 2 * dp3 + dp4)*(h/6.0); 25 printf("p(%f)=%f\n", t, p);
forの外でtに値を代入しているのにforのすぐ下でまたtに違う値を代入していますね。
多分ループ1回分ずれてるんじゃないかな?
Objective-C は C とは別の言語なので、C のタグを使ってください。 https://teratail.com/tags/C
> 明らかにおかしな値になっています
って言うけど,じゃあ「正しい値」っていくつなんですか? っていうのを示さないと伝わらないのでは.
で,それはそれとして,pを更新する処理が無いように見えますが.
ご指摘ありがとうございます。
pについてはコピーミスです。
区間幅 h が各勾配値の計算にも現れねばならないと思うのですが,どうなのでしょう?

回答1件
あなたの回答
tips
プレビュー