1

我完全坚持这一点,我不知道从哪里开始。

我必须在 C 中以 n 间隔在 a 和 b 之间集成一个函数。

我只有函数定义:

float funcintegrate(float (*f)(float x), float a, float b, int n);

我需要使用梯形方法。

编辑 :

谢谢大家的提示。我现在有了答案!

使用梯形方法(或规则)对区间 [a, b] 中的函数进行数值积分:

float funcintegrate(float (*f)(float x), float a, float b, int n);

int i;
double x;
double k = (b - a) / n;
double s = 0.5 * (f(a) + f(b));

    for (i = 1; i < n; i++) {
         x = a + k * i;
         s = s + f(x);
    }

return s * k;

}
4

1 回答 1

6

您的funcintegrate()函数应该基本上将[a, b]区间划分为n子区间,计算f()所有子区间端点的值,然后使用它们为每个子区间计算某个表达式的值,最后将该表达式的所有值相加。

在每次迭代中计算的子表达式取决于您选择的特定数值积分方法,并会影响性能和精度的权衡。

在最简单的情况下,表达式是f()端点之一的值乘以子区间长度的乘积。这对应于曲线下字段的“条形图近似”。这是非常不准确的,一旦你成功实现它,你应该尝试更复杂的方法。

这两篇维基百科文章很好地描述了许多不同的方法,每个方法都共享我上面描述的一般算法:欧拉方法龙格库塔方法

我还建议阅读“C 中的数值食谱”中的相关章节。

编辑:梯形方法对每个子区间使用一个表达式,该表达式表示梯形的区域,该区域基于子区间并向上(或向下取决于 的符号f())延伸,直到其垂直边穿过曲线。这两个交点与一条直线相连(这是进行近似的地方,因为f()两点之间可能不是直线)。

于 2011-12-18T16:07:21.940 回答