2016-11-04 185 views
-1

我一直在嘗試編寫一個程序,通過使用梯形法則解決C中曲線下的區域。問題是,我認爲我的邏輯是好的,我已經多次檢查算法,並且我仍然無法找到錯誤。Riemann Sum,梯形法則C

在這是我的教授分配的東西,他不希望我們使用數組,這就是爲什麼你不會看到任何。它會掃描func,a,p,q,err,其中func是將被使用的函數(函數#1或#2,但我只完成了#1),a是常量,p是最初的x,q是最終的x,err是錯誤的邊際,我認爲。

程序將劃分區間和計算面積,直至區的最後計算 - 我們只計算總面積等於小於10^-ERR

編輯:我做了一個感謝一些改動以LutzL

#include<stdio.h> 
#include<math.h> 

double F1(double x,double a){ 
    double f1=0.0; 
    f1=(sqrt(a-pow(x,2))); 
    return f1; 
} 

int main(){ 
    double a=0.0,p=0.0,q=0.0,h=0.0,x=0.0,err=0; 
    int func=3,n=2; 
    double power=0.0,T=0.0; 
    double sum=0.0,last=0.0,difference=1.0; 

    scanf("%d",&func); 

    while(func!=0){ 
     n=2; 
     scanf("%lf%lf%lf%lf",&a,&p,&q,&err); 
     power=pow(10.0,-err); 
     h=(q-p)/n; 

     if(func==1){ 
      difference=1.0; 
      while(difference>=power){ 
       h=(q-p)/n; 
       sum=0.0; 
       for(x=p+h;x<=q-h;x++){ 
        sum+=(2*F1(x,a)); 
       } 
       T=(h/2)*(F1(p,a)+F1(q,a)+sum); 
       if(difference==1.0){ 
        difference=T; 
       }else{ 
        difference=last-T; 
       } 
       last=T; 
       n++; 
       } 
     } 
    printf("%.5lf\n",T); 
    scanf("%d",&func); 
    } 
return 0; 
} 

錯誤是當我輸入1,4,-2,1,9。它應該輸出5.05481,而是輸出4.59808。

+2

它應該做什麼?什麼是錯誤/問題? –

+1

問題是什麼?什麼是錯誤?你的實現沒有那麼有用,因爲你擁有主方法中的所有代碼,而不是可以在多個地方調用的函數。 – duffymo

+0

您需要在每次嘗試之間將'sum'重置爲'0'。 –

回答

1

sum應該將參數的函數值從p+h添加到p+(n-1)*h=q-h,即n-1函數值。目前,您添加了n函數值。

您不會在循環內雙擊n

最好的實現使用中點資金

M(k)= f(p+h/2)+f(p+3h/2)+...+f(p+(2n-1)*h/2) 

其中n=2^k, h=(q-p)/2^k

然後梯形總結

T(k)=0.5*f(p)+f(p+h)+...+f(p+(n-1)*h)+0.5*f(q) 

滿足遞推

T(k+1) = T(k) + M(k) 

T(0)=(f(p)+f(q))/2。積分近似值當然是T(k)*(q-p)/2^k

+0

非常感謝你!我做了這些改變,現在我更接近得到正確的輸出 – Marelisse