• ベストアンサー

【C言語】二階微分方程式をルンゲクッタで解く解き方が…

二階微分方程式をルンゲクッタで解くプログラムを作っているのですが、上手く合成関数が定義できず、上手く行きません。途中までプログラムを作ったので、見ていただけませんか?? 問題 http://12lien.web.fc2.com/q.jpg (PC環境Windows でX on windows 3 コンパイラはgcc )   プログラム⇒http://12lien.web.fc2.com/base.txt プログラム中ではdx/dt = Y, x = X とおきました。 オネガイシマスm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えっと, 2階微分方程式 d^2x /dt^2 = f(dx/dt, x) を Runge-Kutta で数値的に解くために dx/dt = y とおいて連立 1階微分方程式d(y, x)/dt = (f(y, x), y) を解きにいってるんですよね? 少なくとも, プログラム上で dy/dt を計算する関数 FUN に x を渡さないとダメですし, dx/dt を計算する関数は不要 (単に y を返すだけだし, それなら関数を呼ぶ必要はない) です. でどうするかなんですが, まず dy/dt を計算する関数 double FUN(double t, double y, double x) { ここで t, x, y を使って dy/dt を計算する } を作ります. そして, 実際に Runge-Kutta で解く関数では 1ステップずつ「これを呼出して y[i] を逐次計算⇒その情報を基にx[i] を計算」を繰り返すことになります. 挙げられたプログラムでは 2重ループになってるけど, これは無駄です. 大雑把には for (i = 0; i < 1000; ++i) { FUN を 4回呼出して t, x[i-1], y[i-1] から y[i] と x[i] を計算 } という感じ. なお, FUN の 2回目以降の呼出しのときに x[i] もそれらしい値を使うよう注意する必要があります.

SUPERSTAR2005
質問者

補足

一応、教えてくれた通り訂正しました。ですがまだ上手く行きません。tのおき方が悪いんでしょうか??  訂正プログラムhttp://12lien.web.fc2.com/base2.txt

その他の回答 (3)

  • swimeye
  • ベストアンサー率0% (0/3)
回答No.4

どううまくいかないのか教えていただきたいところですが、少なくとも x[i+1] = y[i+1] + 1.0 / 6.0 * ( j1 + 2.0 * j2 + 2.0 * j3 + j4); は y[i+1]じゃなくてx[i]では?

回答No.3

間違えました。気にしないでください。

回答No.2

微分方程式を記述している関数で引数の受け取っているところが配列になっていないのは大丈夫なのでしょうか? >double FUN(double t, double y,double x){