2016-11-04 5 views
-1

私は台形ルールを使ってCの曲線の下のエリアを解くプログラムを書くことを試みてきました。問題は、私のロジックは大丈夫だと思う、私はアルゴリズムを何度も見直して、私はまだエラーを見つけることができないということです。Riemann Sum、Cの台形ルール

これは私の教授によって割り当てられたものであり、私たちが配列を使用することを望んでいないので、あなたは何も見えません。

func、a、p、q、errをスキャンします。ここで、funcは使用される関数です(関数#1または#2ですが、#1は完了しました)。最初のx、qは最後のx、errは誤差のマージンです。

プログラムは、間隔を分割し、エリアの最後の計算までの領域を計算します - 私たちはただ計算し、総面積は10^-ERR

EDIT未満等しい:私はいくつかの変更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を二重にしないでください。

最適な実装は、中間点の合計

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

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

を使用しています。

そして台形和

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

再帰T(0)=(f(p)+f(q))/2

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

を満たします。積分近似はもちろんT(k)*(q-p)/2^kです。

+0

ありがとうございました!私はこれらの変更を加えたので、すぐに私はより適切な出力を得るために近づいています – Marelisse

関連する問題