ここから本文です

二階の常微分方程式のルンゲクッタ法による解法について

kei********さん

2020/2/913:01:00

二階の常微分方程式のルンゲクッタ法による解法について

x''=-sin xという単振動の運動方程式の近似解をルンゲクッタ法を用いて求めようとしているのですが、一階の常微分方程式からどう発展させればよいか悩んでいます

c言語でのプログラムがわかる方、よろしくお願いします

閲覧数:
21
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

sxs********さん

2020/2/1516:17:35

次のように微係数評価関数を定義します。
void derivativeEvaluations() {
drvs(1) =-sin(ordn(2));
drvs(2) = ordn(1);
}

drvs配列には微係数を入れます。
ordn配列には積分結果を入れます。

この問題では、
drvs(1) = x''
drvs(2) = x''を積分した結果のx'
ordn(1) = x''を積分した結果のx'
ordn(2) = x'を積分した結果のx

次に、ルンゲクッタ法を微係数の個数(2個)だけforループで回すように積分関数を定義します。
void integrations() {
for (i = 0; i = n; i++) { //n=1 積分個数-1
temp(i) = ordn(i); //前回値を保存
}
/* 1段目 */
for (i = 0; i = n; i++) {
k1(i) = drvs(i); //前回値を使う
}
/* 2段目 */
for (i = 0; i = n; i++) {
ordn(i) = temp(i) + 0.5*h*k1(i);
}
t = t + 0.5*h;
derivativeEvaluations();
for (i = 0; i = n; i++) {
k2(i) = drvs(i);
}
/* 3段目 */
for (i = 0; i = n; i++) {
ordn(i) = temp(i) + 0.5*h*k2(i);
}
derivativeEvaluations();
for (i = 0; i = n; i++) {
k3(i) = drvs(i);
}
/* 4段目 */
for (i = 0; i = n; i++) {
ordn(i) = temp(i) + h*k3(i);
}
t = t + 0.5*h;
derivativeEvaluations();
for (i = 0; i = n; i++) {
k4(i) = drvs(i);
}
/* t+h時点の積分値に更新 */
for (i = 0; i = n; i++) {
ordn(i) = temp(i) + (h/6.0)*(k1(i)+2.0*k2(i)+2.0*k3(i)+k4(i));
}
derivativeEvaluations();// t+h時点の微係数に更新
}


上記の積分関数integrations()は、微係数評価関数derivativeEvaluations()の内容を変更するだけで、汎用的に使用できるよう、下記は関数の外で定義します。
drvs:微係数
ordn:積分値
n:積分個数-1

この回答は投票によってベストアンサーに選ばれました!

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる