dポイントプレゼントキャンペーン実施中!

二階微分方程式をルンゲクッタで解くプログラムを作っているのですが、上手く合成関数が定義できず、上手く行きません。途中までプログラムを作ったので、見ていただけませんか??

問題
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

A 回答 (4件)

えっと, 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] もそれらしい値を使うよう注意する必要があります.

この回答への補足

一応、教えてくれた通り訂正しました。ですがまだ上手く行きません。tのおき方が悪いんでしょうか?? 

訂正プログラムhttp://12lien.web.fc2.com/base2.txt

補足日時:2006/10/08 16:38
    • good
    • 0

どううまくいかないのか教えていただきたいところですが、少なくとも


x[i+1] = y[i+1] + 1.0 / 6.0 * ( j1 + 2.0 * j2 + 2.0 * j3 + j4);

y[i+1]じゃなくてx[i]では?
    • good
    • 0

間違えました。

気にしないでください。
    • good
    • 0

微分方程式を記述している関数で引数の受け取っているところが配列になっていないのは大丈夫なのでしょうか?



>double FUN(double t, double y,double x){
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!