2015-03-12 3 views
0

Я использую правило трапеции для вычисления интеграла функции между 0 и бесконечностью. Я могу вычислить значение интеграла для заданного значения N, и теперь я пытаюсь перебрать N от двух до заданного значения, но это не сработает. Он продолжает вычислять значение интеграла, когда N равно 2 и повторяется вместо нового значения N. Проблема заключается в цикле for в main(), я думаю.Численное интегрирование с использованием правила трапеции в C

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

double f(double x) { 
double a; 
    a =1/((1+x)*pow(x,0.5)); 
    return a;} 

double tra(double upper, double lower, int N) { 
double sum, step, integral,lowest; 
    step=(upper-lower)/(N-1); 
    lower=lower+step; 

    if(lower==0) { 
     lowest=DBL_EPSILON;} 
    else { 
    lowest=lower;} 

    while(lower<upper) { 
     sum=sum+f(lower); 
     lower=lower+step;} 

integral=step*(sum+(f(upper)/2)+(f(lowest)/2)); 
sum=0; 
return integral;} 


main() { 
int N; 
double upper=DBL_EPSILON*2, lower=0, total=0; 
for(N=2;N<20000;N+=100) { /*Here im trying to loop N so that the  integral is calculated for increasing values of N*/ 

    while(upper<FLT_MAX) { 
     total=total+tra(upper, lower, N); 
     lower=upper; 
     upper=upper*2;} 
     printf("Integral is %.10f\n", total); 
} 
} 
+0

Может быть, вы ищете внутри внутреннего 'while' петля, которая работает по тому же' n'? –

+0

Извините, я не уверен, что вы имеете в виду? – Charlie

+0

Вы знаете, что у вас есть вложенный цикл while в цикле 'for', не так ли? –

ответ

2

Я предлагаю вам переместить переменную инициализацию в пределах for цикла, как это:

int main(void) { 
    int N; 
    double upper, lower, total; 
    for(N=2;N<20000;N+=100) { 
     upper = DBL_EPSILON*2; 
     lower = 0; 
     total = 0; 
     while(upper<FLT_MAX) { 
      total=total+tra(upper, lower, N); 
      lower=upper; 
      upper=upper*2; 
     } 
     printf("Integral is %.10f\n", total); 
    } 
    return 0; 
}