2015-10-14 62 views
3

該代碼使用辛普森法則來計算X * SIN(X)與(1,2)邊界的積分。我遇到的問題是,它的實際價值非常接近。即使有999次迭代,它仍然沒有達到要求。雖然我有一個單獨的程序,它使用梯形法則來處理同樣的事情,並且它在1000次迭代後恰好達到了這一點。它應該打的一點是「1.440422」辛普森規則錯誤

是什麼應該發生的事情對辛普森的規則?或者我的代碼有問題嗎?

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
double f(double x); 
int main() 
{ 
    double x,result,y,z,h,s1,s2; 
    s1 = 0; 
    s2 = 0; 
    int i,n; 
    printf("\nHow many points to you want it evaluated at (odd number)? And what are the bounds? lower bound,upper bound >\n"); 
    scanf("%d %lf,%lf",&n,&y,&z); 
    h = (z-y)/n; 
    result = 0; 
    if(n%2!=0) 
    { 
     for(i=0;i<n;i++) 
    { 
     if(i%2==0) 
     { 
      s1 = s1+f(y+i*h); 
     } 
     else 
     { 
      s2 = s2+f(y+i*h); 
     } 
    } 
     result = (h/3)*(f(y)+f(z)+4*s2+2*s1); 
     printf("\nThe value is %lf with %d interations\n",result,i); 
    } 
    else 
    { 
     printf("\n The number of points has to be odd, try again\n"); 
    } 
} 


double f(double x) 
{ 
    return(x*sin(x)); 
} 
+0

歡迎近似的世界和浮點運算。如果您使用近似公式,則會得到近似結果。這可能是一種僥倖,這個梯形法則最終會以'正確'的正確答案結束。 –

+0

是的,那令我困惑的部分是我認爲辛普森的近似值比梯形誤差更小。但我想這可能只是我正在使用的功能而已。謝謝 – user3908631

+1

在99999次迭代中,我得到了你需要的值'1.440422'。一些函數比其他函數更快地收斂,例如有幾種方法可以計算'pi',但並非全部都有用。 –

回答

3

您看到的問題可能是因爲用於讀取數字的格式字符串。

scanf("%d %lf,%lf",&n,&y,&z); 
     // ^^^ Is the , there on purpose? 

嘗試移除,從格式字符串,看看問題是否會消失。

它不能強調 - 總是檢查返回值scanf

if (scanf("%d %lf %lf", &n, &y, &z) != 3) 
{ 
    // Deal with error. 
} 

爲了確保數字閱讀是準確的,添加回聲輸入回stdout線。

printf("n: %d, y: %lf, z: %lf\n", n, y, z); 

我注意到幾個錯誤,在你的代碼:

  1. 間隔h是不正確的。由於您使用的是n分,因此有n-1間隔。因此,h必須是:

    h = (z-y)/(n-1); 
    
  2. 既然你要添加在最後陳述f(y)f(z),循環必須是:

    // Not good to use for(i=0;i<n;i++) 
    for(i=1;i<n-1;i++) 
    { 
    

隨着這些補丁,我得到輸出1.440422使用n = 1001

+0

scanf中的逗號表示當您輸入用逗號分隔它們的值時。但我仍然嘗試過,並沒有奏效。並用printf檢查出它的值是正確的。 – user3908631

+0

謝謝你,這些修復是一個更好的近似。 – user3908631

+0

@ user3908631,我很高興能夠提供幫助。 –