我完全坚持,我不知道从哪里开始。
我必须在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;
}
答案 0 :(得分:6)
您的funcintegrate()
函数基本上应将[a, b]
区间划分为n
个子区间,计算所有子区间端点上的f()
值,然后使用它们计算值每个子区间的某个表达式,最后将该表达式的所有值相加。
每次迭代计算的子表达式取决于您选择的特定数值积分方法,并影响性能和准确性权衡。
在最简单的情况下,表达式是其中一个端点的f()
值乘以子区间长度的乘积。这对应于曲线下场的“条形图近似”。这是非常不准确的,一旦你成功实现它,你应该尝试更复杂的方法。
这两篇维基百科文章很好地描述了许多不同的方法,每种方法都分享了我上面描述的一般算法:Euler method,Runge-Kutta methods。
我还建议阅读“C中的数字食谱”中的相关章节。
编辑:梯形方法为每个子区间使用一个表达式,该表达式表示基于子区间的梯形区域并向上(或向下取决于f()
的符号)直到它的垂直边与曲线交叉。两个交叉点是用直线连接的(这是近似的位置,因为f()
在点之间可能不是直的)。