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

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

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

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

Q&A

1回答

2942閲覧

C言語でexp(x)を微分方程式で書く

RyotaSano

総合スコア8

C

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

0グッド

0クリップ

投稿2017/08/08 08:47

C言語でexp(x)を微分方程式で書けという問題で行き詰ってます。

オイラー法で書くことはできたのですが、それ以外の修正オイラー法、ルンゲクッタ法の書き方がいまいちわかりません。

以下にオイラー法のコードを書いてるのでそれから修正方法を教えていただけると助かります。

#include <stdio.h>
#include <math.h>
double F(double x) // これは、f(x)の微分値 f'(x)
{
return exp(x);
}

double euler(double x0, double xn, double y0, int n, int modulo)
{
int i;
double x, y, h;

x = x0; y = y0; h = (xn - x0)/n;
for (i = 1; i <= n; i++) {
y += F(x) * h;
x = x0 + i * h;
if(i % modulo == 0)
printf("%-10f %-20.15f\n", x, y);
}
return y;
}

int main(void)
{
double x0=0.0; // x の初期値
double xn=1.0; // x の最終値
double y0=1.0; // y の初期値
int n= 655360; // 10分割
int modulo=65536; // 区間番号がmodulo つまり 65536=2^16 の倍数のときに途中経過を印字

printf(" %-12s %-20s\n", " x", " y = f(x) "); // %-12s は文字列を12桁の幅の中に左寄せで印字する指定
euler(x0, xn, y0, n, modulo);

return 0;
}

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

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

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

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

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

guest

回答1

0

質問者さんのオイラー法を用いた解き方も間違っている可能性があります。

やりたいことは、恐らく、exp(0.0)=1.0であることと、y'=exp(x)=yであることから、
exp(1.0)の近似値を計算することだと思います。

オイラー法では、次のようになります。但し以下のものはWindowsの電卓の計算結果です。
exp(0.0) = 1.0
exp(0.1)の近似値 = exp(0.0) + 0.1 * exp(0.0) = 1.1
exp(0.2)の近似値 = exp(0.1)の近似値 + 0.1 * exp(0.1)の近似値 = 1.21
exp(0.3)の近似値 = 1.331
exp(0.4)の近似値 = 1.4641
exp(0.5)の近似値 = 1.61051
exp(0.6)の近似値 = 1.7711561
exp(0.7)の近似値 = 1.9487171
exp(0.8)の近似値 = 2.14358881
exp(0.9)の近似値 = 2.357947691
exp(1.0)の近似値 = 2.5937424601

exp(1.0)の実際の値は約2.718なので、誤差は0.124となります。
hを小さくするか、より高次の近似アルゴリズム(修正オイラー法、ルンゲクッタ法)を
用いることで、この誤差を小さくすることができるはずです。

参考までに、確認用に作った私のjavascript(Node.js)のプログラムを載せておきます。

javascript

1const COUNT = 1000; 2 3e = 1.0; 4h = 1.0 / COUNT; 5for (i = 1; i <= COUNT; i++) { 6 e += h * e; 7} 8 9console.log(e);

投稿2017/08/09 12:57

anndonut

総合スコア667

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問