2011-04-23 66 views
0

如果您构建并运行代码,您会发现它无法正常工作。本书中的问题(C中的问题解决和程序设计)。它给出了2个方程,并且希望找到下方的近似区域一个曲线。并且添加具有值为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); 
} 
+0

您不应该在'a +(i/n)*(ba)'处评估'g'和'h',其中'i = 0,...,n',即'a'和'b'之间的等距点? – Aniko 2011-04-23 18:53:55

回答

2

我不知道发生了什么打算,因为你没有解释它是如何工作的,但是这部分走的是负数的平方根:

sqrt(4-pow(x,2)) 

啊,现在我明白了这是你想要整合的功能。问题是你需要将整合的范围分成小块,而不是在更广的范围内进行整合。请尝试

*areah += 2*h((double) i/n); 
+0

我想,我的算法的执行有一些问题。因为输出不是真的... Potatoswatter,谢谢 – mustafaSarialp 2011-04-23 19:00:30

+0

而且* areah + = 2 * h((double)l/n);将改变 i ---> l – mustafaSarialp 2011-04-23 19:18:29