簡體   English   中英

C ++中的復合辛普森規則中的錯誤

[英]Errors in Composite Simpson's Rule in C++

我正在編寫一個使用復合Simpson規則在C ++中近似積分的小程序。 似乎可行,但是當我為不同數量的間隔計算積分時(因此for循環),出現了一些錯誤,因為它似乎是完全隨機的。 這是我的代碼。

#include <iostream>
#include <cmath>

double f(double x)
{
    double y = x;
    return y;
}

int main()
{
    for(double n=1; n<20; n+=1)
    {
        double a = 1;
        double b = 4;
        double d = (b-a)/n;
        double i = a;
        double area = 0;
        while(i<b)
        {
            double j = i + d;
            area += (d/6) * ( f(i) + 4*f((i+j)/2) + f(j) );
            i = i + d;
        }
        std::cout << "Order " << n << " : " << area << std::endl;
    }
    return 0;
}

輸出如下。

Order 1 : 7.5
Order 2 : 7.5
Order 3 : 7.5
Order 4 : 7.5
Order 5 : 7.5
Order 6 : 7.5
Order 7 : 9.30612
Order 8 : 7.5
Order 9 : 7.5
Order 10 : 8.745
Order 11 : 8.6281
Order 12 : 7.5
Order 13 : 7.5
Order 14 : 7.5
Order 15 : 7.5
Order 16 : 7.5
Order 17 : 8.22145
Order 18 : 8.18056
Order 19 : 7.5

我認為這可能與變量類型或存儲問題有關,盡管我不知道問題出在哪里。 任何幫助表示贊賞。

這可能是由浮點數比較引起的。 在這種情況下,對於計算機而言, 4.0<4.0可能是正確的,這會使循環進行一次太多。

要解決此問題,可以使用epsilon比較數字:

#define EPS 1e-8
if(a<b-EPS){...} // this is analogous to < operator for ints
if(a<b+EPS){...} // this is analogous to <= operator for ints

另一種選擇是在使用整數控制循環的同時即時生成i變量:

for(int k=0;k<n;k++){
    double i=a+(b-a)*k/n;
    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM