2017-04-03 71 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

你需要考慮的是,雖然x更新爲x(t+T)近似,循環變量t將只在循環的最後遞增,因此保留它的輸出過程中的價值t。這次的不匹配引入了另外的相對誤差abs(sin(t+T)/sin(t)-1),其對於t=1, T=0.1約爲5.91 %

你也應該在t遞增,無論是通過計算循環的確切數量或在不平等如在

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

完美的選擇範圍在中間的步驟進行循環下舍入誤差穩定。謝謝。 – CroCo