2017-04-03 11 views
1

いくつかの積分方法を検討しています。私は長方形の統合方法(すなわち、オイラーの方法)に遭遇しました。私が読んでいる本によると、実際のアルゴリズムは長方形積分法でこのパーセント誤差を計算するには

enter image description here

コード自明です。この例では、dxdt=cos(t)の初期値はx(0)=0です。分析解はx=sin(t)です。私たちは、t=1で誤差を計算することができますし、実際、著者は次の表にそれを提供しています。

enter image description here

問題は、私の次のコードでは、誤差は9.1%であるということですが、上記の表では、エラーを実際に2.6である。私は間違いを犯しましたか?

#include <iostream> 
#include <cmath> 

int main() 
{ 
    double x(0.0), dxdt, t(0.0), T(0.1), stopTime(1.0); 

    for (; t <= stopTime; t += T){ 
     dxdt = cos(t); 
      x += dxdt*T; 

      if (t > 0.9) 
      std::cout << "Time: " << t << " Error: " << fabs((x - sin(t)) /sin(t))*100.0 << std::endl; 
    } 

    return 0; 
} 

答えて

1

は、あなたはそれが出力中tに価値を保持し、xx(t+T)の近似値に更新されている間、ループ変数tだけループの最後にインクリメントされることを考慮に入れる必要があります。この時間の不一致により、abs(sin(t+T)/sin(t)-1)の追加の相対誤差が生じ、これはt=1, T=0.1については約5.91 %です。

また、ループの正確な数を計算することによって、または

while (t < stopTime-0.5*T){ 
    dxdt = cos(t); 
     x += dxdt*T; 
     t += T; 

    if (t > stopTime -2.5*T) 
     std::cout << "Time: " << t << " Error: " << fabs((x - sin(t)) /sin(t))*100.0 << std::endl; 

} 
+0

パーフェクトのように、との手順です不平等で境界を選択することで、どちらか、tインクリメントで丸め誤差の下でループを安定させる必要があります。ありがとうございました。 – CroCo

関連する問題