2015-03-17 1 views
1

Я пытаюсь интегрировать функцию 1/((1+x^2)x^0.5) между 0 и бесконечностью, используя правило трапеции.Интеграция через правило трапеции в C

Мне нужно найти значение N, которое дает максимальную точность при использовании двойного поплавка, которое я сделал, запустив программу с возрастающими значениями N до тех пор, пока не будет разницы между итогами, заданными последовательными значениями N. Однако я застрял в бесконечном цикле.

Благодаря

Бет

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

double inter(double x, double h, double y, double N, double total) 
{ 
     h=(y-x)/(N-1); 
     total= total +0.5*(1/((1+pow(x,2))*sqrt(x))); 
     x=x+h; 

    while (x<y) 
     { 
     total=total+(1/((1+pow(x,2))*sqrt(x))); 
     x=x+h; 
     //printf("t - %lf \n", total); 
     //printf("x - %lf \n", x); 
     } 
    total= total +0.5*(1/((1+pow(x,2))*sqrt(x))); 
    total=total*h; 
    return total; 
} 

main() 
{ 
    double x,y,total,h,c,d,f,N, finish; 
    x=DBL_EPSILON; 
    y=331; 
    total=0; 
    N=0.5; 
    c=inter(x,h,y,N,total); 
    d=0; 
    finish=0; 

while(finish==0) 
{ 
    d=inter(x,h,y,N,total); 
    if(d==c) 
    { 
     finish=1; 
    } 
    else 
    { 
     c=d; 
     d=0; 
     h++; 
     printf("%lf/n", h); 
    } 
}  

printf("%lf\n", d); 
} 
+0

Возможно ли, что 'h = (y-x)/(N-1)' в конечном итоге устанавливает «h» в ноль, а условие цикла «x Codor

+1

@ Codor h также может стать настолько маленьким, что x = x + h не изменяет x из-за неточностей с плавающей запятой – samgak

ответ

0

В вашей iter() функции, h отрицательна, что приводит к x идти отрицательным. sqrt() отрицательного номера возвращается NaN. Кроме того, поскольку h отрицательный, x продолжает уменьшаться, поэтому всегда меньше, чем y, что является причиной бесконечного цикла.

h отрицательный, потому что знаменатель (N-1) выходит на -0.5 (N передается как 0,5).

0

double h не был инициализирован. Вы передаете его как аргумент функции, который затем перезаписывает его для использования в качестве локальной переменной. Однако в основном цикле вы увеличиваете h (используя оператор ++, который будет лучше, чем h+=1), а затем передать его функции снова, но он не имеет никакого эффекта, так как h все еще записан в функции.

Как точка техники, вы используете double finish в качестве булева. Это должно быть int finish.

 Смежные вопросы

  • Нет связанных вопросов^_^