2011-12-18 52 views
1

我完全陷入了困境,我不知道从哪里开始。以n间隔集成a和b之间的函数

我必须整合与n个间隔a和b之间的函数C.

我只有函数定义:

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

请向我们展示您在寻求帮助之前尝试过的方法。这是作业吗?如果是,请添加标签。 – dasblinkenlight 2011-12-18 15:54:16

+1

尝试使用C语言中的数字食谱(它可以免费获得),用于众多集成实现。 – Omar 2011-12-18 15:55:15

+2

当'double'合适时,不要使用'float'。 – pmg 2011-12-18 15:57:54

回答

6

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

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

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

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

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

EDIT:梯形方法使用每一个子区间,它表示是基于所述子区间和向上延伸(或向下取决于f()符号),直到其垂直侧越过曲线的梯形的面积的表达式。这两个交点是它们与一条直线相连(这是近似由于f()在点之间可能不是直的)。

+0

我忘了提及我需要使用梯形方法。 – TheTime 2011-12-18 16:10:54

+0

我在每次迭代中添加了对应使用什么特定表达式的描述。我会让你自己推导出这个公式。 – 2011-12-18 16:19:28

+0

找到答案,为您的提示! – TheTime 2011-12-18 17:37:16

相关问题