質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

6936閲覧

微分方程式をc言語でオイラー法とルンゲクッタ法(4次)で実装したのですが、ルンゲクッタ法の方が精度がよくなってしまいます。

kttt

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/09 06:12

編集2020/08/09 06:13

微分方程式をc言語でオイラー法とルンゲクッタ法(4次)で実装したのですが、オイラー法ルンゲクッタ法の方が精度がよくなってしまいます。本来ならルンゲクッタ法(4次)の方が精度がよくなるはずです。どこかコードにおかしなところがあるか見て欲しいです。

微分方程式は dy/dx=x^2-y,y(0)=2です。

オイラー法のコード

c

1# include <stdio.h> 2int main() 3{ 4double x=0; 5double dx; 6double y=2; 7double dy; 8printf("刻み幅の値を入力してください h="); 9scanf("%lf", &dx); 10printf("%lf %lf\n", x, y); 11for (x=dx; x<=1; x=x+dx) 12 { 13 dy=(x*x-y)*dx; 14 y=y+dy; 15 printf("%lf %lf\n", x, y); 16 } 17} 18

ルンゲクッタ法のコード

c

1# include <stdio.h> 2int main() 3{ 4double x=0; 5double dx; 6double y=2; 7double y1, y2, y3; 8double k1, k2, k3, k4; 9double dy; 10printf("刻み幅の値を入力してください h="); 11scanf("%lf", &dx); 12printf("%lf %lf\n", x, y); 13for (x=dx; x<=1; x=x+dx) 14{ 15k1=x*x-y; 16y1=y+k1*dx/2; 17k2=x*x-y1; 18y2=y+k2*dx/2; 19k3=x*x-y2; 20y3=y+k3*dx; 21k4=x*x-y3; 22dy = dx*(k1 + 2*k2 + 2*k3 + k4)/6; 23y=y+dy; 24printf("%lf %lf\n", x, y); 25} 26}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/08/09 06:22

タイトルが直ってないです
guest

回答1

0

https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%B3%E3%82%B2%EF%BC%9D%E3%82%AF%E3%83%83%E3%82%BF%E6%B3%95 を読みました

0.01の刻み幅で1.000000000132 ぐらいの精度が出ます

c

1for (; x<=1; ) 2{ 3k1=x*x-y; 4y1=y+k1*dx/2; 5 6x += dx/2; 7k2=x*x-y1; 8y2=y+k2*dx/2; 9 10k3=x*x-y2; 11y3=y+k3*dx; 12 13x += dx/2; 14k4=x*x-y3; 15 16dy = dx*(k1 + 2*k2 + 2*k3 + k4)/6; 17y=y+dy; 18}

変更点は以下です。

  • x が0から始まっていなかったので、0から始めるようにしました
  • k2, k3, k4に与えるxの値が間違っていました(刻み幅/2を加えていない)。

あと、刻み幅では無く、ループ回数を引数とすると良いです。(doubleの場合、x==1の判定が怪しくなりがちなので避けるべきです。「浮動小数点 同値比較」でググってください)

投稿2020/08/09 11:35

編集2020/08/09 11:39
maai

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問