9

我正在寻找一个库来查找 C++(或 C,但最好是 C++)中给定的一组随机数据(而不是函数)的积分。还有另一个问题是关于 C 中的集成,但答案更多地讨论了如何集成一个函数(我认为......)。我知道这可以简单地通过计算从开始到结束的每对点之间的线段下的面积来完成,但如果这已经完成,我宁愿不重新发明轮子。如果这是重复的,我提前道歉;我进行了相当广泛的搜索,但无济于事。我的数学没有我想要的那么强大,所以我完全有可能使用了错误的术语。

提前感谢您的帮助!

克里斯

编辑:如果有人感兴趣,我觉得自己像个白痴。即使添加了一堆 OO 抽象以使我的其他代码更易于使用,那也可能是 30 行代码。这就是远离任何数学的 3 年对你的影响……感谢所有的帮助!

4

5 回答 5

14

这是微不足道的。如果点是 (x0, y0), (x1, y1), ..., (xN, yN),并且这些点的顺序是 x0 <= x1 <= ... <= xN,那么积分是

  • y0 * (x1 - x0) + y1 * (x2 - x1) + ...

不使用插值(对矩形区域求和),以及

  • (y0 + y1)/2 * (x1 - x0) + (y1 + y2)/2 * (x2 - x1) + ...

使用线性插值(梯形求和区域)。

如果您的数据是 y0, y1, ..., yN 并且相应的 x 值假定为 0, 1, ..., N,则问题特别简单。然后您得到

  • y0 + y1 + ...

不使用插值(对矩形区域求和),以及

  • (y0 + y1)/2 + (y1 + y2)/2 + ...

使用线性插值(梯形求和区域)。

当然,使用一些简单的代数,可以简化梯形公式。例如,在最后一种情况下,你得到

  • y0/2 + y1 + y2 + ...
于 2010-06-05T21:33:32.850 回答
13

我今天刚刚参加了我的数字考试 :) 我为你准备了 3 条规则

梯形规则:

积分 = h/2 * ( y0 + 2y1 + 2y2 + 2y3 ....... + yn)

中点规则:

积分 = h * ( y0.5 + y1.5 + y2.5 + .... y(n-0.5) )

y0.5 表示 y 在 x0 和 x1 之间的值

辛普森法则:

积分 = h/3 * ( y0 + 4y1 + 2y2 + 4y3 + 2y4 ....... + yn)

其中 h 是您采取的步骤,通常是很小的数字(但不会太小以避免舍入误差),而 n 是您采取的周期数

这些很容易应用……您还可以阅读有关高斯正交的更多信息

参考 :

于 2010-06-05T21:49:18.803 回答
2

是的,当然,就是这么简单。只需将您拥有的数据点形成的梯形面积相加即可。你不能让它比这更复杂。寻找一个库来做这件事是毫无意义的,你只需编写代码将数据转换成库需要的格式。自己计算将减少代码。

于 2010-06-05T21:31:53.833 回答
1

给定点 (x0, y0), (x1, y1) 梯形下的面积是 (x1 - x0) * (y0 + y1) / 2。

您可以通过总结这些来计算整个区域。

于 2010-06-05T21:34:24.173 回答
1

您的“随机数据”由一组 (x,y) 对组成。在开始积分之前,您必须确保将这些对排序到一个列表中,其中 x 的值单调增加。一旦你有了它,梯形积分就足够了。(又名辛普森规则)。

于 2010-06-05T21:35:07.163 回答