• 締切済み

オイラー法

区間[0,10]においてh=0.01としオイラー法を用いてとけ。また誤差も出せ。 y'=3x^2-x^3-x^6+(2x^3+1)y-y^2 y(0)=0.5 なんですけどa=3くらいから値がおかしくなりa=10の時には誤差ですぎます。誤差がでないようにするにはどこを直せばいいのか教えてください。 おねがいします。 #include<stdio.h> #include<math.h> double h=0.01; double x0=0.5; main(void) { int a; double euler(int a); double gosa; for(a=1;a<=10;a++) gosa=shin(a)-euler(a); printf("%d %f %f\n",a,euler(a),gosa); } double shin(double a) { double y; y=a*a*a+1.0/(1.0+exp(-a)); return y; } double f(double t,double x){ double y; y = 3.0*t*t-t*t*t-t*t*t*t*t*t+(2.0*t*t*t+1.0)*x-x*x; return y; } /* Euler Function */ double euler(int a){// x0:Initial Value double T,nx,x; // Initial Value x = x0; // Euler Method for(T = 0.0;T < a;T += h){ nx = x + h*f(T,x); x = nx; }

みんなの回答

  • A-Tanaka
  • ベストアンサー率44% (88/196)
回答No.1

こんにちは。 オイラー法というより、これは誤差関数式の問題ですね。 for(T = 0.0;T < a;T += h){ nx = x + h*f(T,x); x = nx; } の式において、ステップを与えるのが、初期に与えられたパラメータに依存しますよね? つまり、この初期に与えられたパラメータを、更に小さくしてみてください。 つまり、h=0.001とかh=0.001にしてみればよいかと思います。 付記)デジタル方式の計算機を用いた数値計算においては、誤差計算を行う場合には求めたい値よりも小さなステップで計算を行うことが重要です。たまたま手元に、Numerical Recipes in Cの原書があるのですが、ここでも誤差や計算式の安定性についての記述があります。このような点を参考にして計算を行ってみてください。 なお、大きな数値を取り扱う場合には、誤差が許容される場合もあります。例をあげますと、宇宙の年齢は137億年±2億年という世界になりますが、この計算において1年とかいうステップは・・・誤差の範囲になります。

vcxsdfrew
質問者

お礼

ありがとうございます

関連するQ&A