2011-04-23 65 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