Вопрос о трапециевидном правиле

#c #math #equation

#c #математика #уравнение

Вопрос:

Если вы соберете и запустите код, вы увидите, что он не работает должным образом.Этот вопрос из книги (решение проблем и разработка программ на 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, amp;areag, amp;areah);
        printf("%f %fn", 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);
}
  

Комментарии:

1. Разве вы не должны оценивать g и h в a (i/n)*(b-a) , где i=0,...,n , то есть в точках, расположенных на равном расстоянии между a и b ?

Ответ №1:

Я не уверен, что подразумевается, потому что вы не объяснили, как это должно работать, но в этой части извлекается квадратный корень из отрицательных чисел:

 sqrt(4-pow(x,2))
  

А, теперь я вижу, что это та функция, которую вы хотите интегрировать. Проблема в том, что вам нужно разделить диапазон интеграции на небольшие части, а не интегрировать в более широком диапазоне. Попробуйте

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

Комментарии:

1. Я думаю, что в моей реализации алгоритма есть какая-то проблема. Поскольку вывод неверен … Potatoswatter, спасибо

2. А также *areah = 2 * h ( (double) l / n); изменится i —> l