2008年6月4日 星期三

使用 C 語言做『梯型法則』積分運算

Standard
『梯型法則 Trapezoidal Rule』是積分方法的基本定理之一,從高中到大學的數學課程中都有提到,碰到工程這種需要大量求值的領域,我們就必需將這些積分方法寫成程式。

詳細程式碼:

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

double my_eq_orig(double x)
{
return 0.2 + 25*x - 200*pow(x, 2) + 675*pow(x, 3) - 900*pow(x, 4) + 400*pow(x, 5);
}

double my_eq(double x)
{
return -400 + 4050*x - 10800*pow(x, 2) + 8000*pow(x,3);
}

double integrate_trapezoidal(double (*fx)(double), int n, double a, double b)
{
int i;
double h;
double x = a;
double s = 0;

h = (b - a) / n;
for (i=1;i<=n-1;i++) {
x += h;
s = s + fx(x);
}

return h * ((fx(a) + fx(b)) / 2 + s);
}

void main(void)
{
/* real */
double real = integrate_trapezoidal(my_eq_orig, 100, 0, 0.8);
/* n = 1 */
double real_i = integrate_trapezoidal(my_eq_orig, 1, 0, 0.8);
/* average */
double fa = integrate_trapezoidal(my_eq, 100, 0, 0.8) / 0.8;

printf("real value:\n%lf\n\n", real);
printf("I:\n%lf\n\n", real_i);
printf("f(x)\'\' average:\n%lf\n\n", fa);
printf("Error:\n%lf\n", -(fa * pow(0.8, 3))/12);
}


後記

這又是一個數值運算的小作業,只不過寫成可重複利用的 function 罷了。