在n和b之间集成a和b之间的函数

时间:2011-12-18 15:51:50

标签: c function integrate intervals

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

我必须在a和b之间集成一个函数,在C中有n个区间。

我只有函数定义:

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;

}

1 个答案:

答案 0 :(得分:6)

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

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

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

这两篇维基百科文章很好地描述了许多不同的方法,每种方法都分享了我上面描述的一般算法:Euler methodRunge-Kutta methods

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

编辑:梯形方法为每个子区间使用一个表达式,该表达式表示基于子区间的梯形区域并向上(或向下取决于f()的符号)直到它的垂直边与曲线交叉。两个交叉点是用直线连接的(这是近似的位置,因为f()在点之间可能不是直的)。