0

コードをビルドして実行すると、正しく動作しないことがわかります。本からのこの質問 (C での問題解決とプログラム設計)。2 つの方程式を与え、曲線の下の近似領域を見つけたいと考えています。呼び出しトラップを追加します。 n の値は 2、4、8、16、32、64、128 です。

私のコードの出力は負で -nan です。方程式は次のとおりです。

g(x) = x^2sinx (a = 0, b = 3.14159)
h(x) = sqrt(4-pow(x.2)) ( a =-2, b=2);

コードは次のとおりです。

#include <stdio.h>
#include <math.h>
void trap(double a,double b, int n, double *areag, double *areah);
double g(double x);
double h(double x);   
int main(void)
{
    double  areag = 0.0, areah = 0.0;
    double a1 = 0, b1 = 10;
    int n;
    for(n=2;n<=128;n*=2){
        trap(a1, b1, n, &areag, &areah);
        printf("%f %f\n", areag, areah);
    }
    return(0);
}

double g(double x){
    return(pow(x,2)*sin(x));
}
double h(double x){
    return(sqrt(4-pow(x,2)));
}
void trap(double a,double b, int n, double *areag, double *areah){
    int i, l;
    *areag = (b-a)/2*n * ( g(a) + g(b));
    for(i = 1; i<=n-1;i++)
        *areag += 2*g(i);
    *areah = (b-a)/2*n * ( h(a) + h(b));    
    for(l=1;l<=n-1;l++)
        *areah += 2*h(i);
}
4

1 に答える 1

2

どのように動作するかを説明していないため、何を意図しているのかわかりませんが、この部分は負の数の平方根を取っています:

sqrt(4-pow(x,2))

ああ、それがあなたが統合したい機能であることがわかりました。問題は、広い範囲で統合するのではなく、統合の範囲を細かく分割する必要があることです。試す

*areah += 2*h( (double) i / n);
于 2011-04-23T18:48:23.837 に答える