代码之家  ›  专栏  ›  技术社区  ›  Chris Thompson

C++中的集成(数学)

  •  7
  • Chris Thompson  · 技术社区  · 14 年前

    我正在寻找一个库来查找给定的一组随机数据(而不是函数)在C++中的积分(或者C,但最好是C++)。有 another question asking about integration in C 但答案更多地讨论了如何整合一个函数(我认为…)。我知道这可以通过计算从开始到结束每对点之间的直线段下的面积来完成,但是如果已经完成了,我宁愿不重新发明轮子。如果这是一个副本,我会提前道歉;我进行了相当广泛的搜索,但没有任何效果。我的数学没有我想要的那么强,所以完全有可能我用错了术语。

    提前感谢您的帮助!

    克里斯

    编辑: 万一有人感兴趣,我觉得自己像个白痴。甚至添加了一堆OO抽象来让我的其他代码更容易使用,这可能是30行代码。这是3年后任何一种数学都会对你做的……谢谢所有的帮助!

    5 回复  |  直到 14 年前
        1
  •  13
  •   Andreas Rejbrand    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+…
        2
  •  12
  •   Ahmed Kotb    14 年前

    我今天刚参加了数字考试。) 我有3条规则给你

    梯形规则:

    积分=H/2*(Y0+2Y1+2Y2+2Y3…….+YN)

    中点规则:

    积分=h*(y0.5+y1.5+y2.5+……Y(N-0.5)

    Y0.5是指X0和X1之间点的Y值。

    辛普森规则:

    积分=H/3*(Y0+4Y1+2Y2+4Y3+2Y4…….+YN)

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

    这些是很容易应用的…你也可以阅读更多关于高斯求积的内容。

    参考文献:

        3
  •  2
  •   Hans Passant    14 年前

    当然,很简单。只需对数据点形成的梯形区域求和即可。你不能让事情变得更复杂。找一个库来做这件事是毫无意义的,您只需编写代码,将数据转换成库需要的格式。自己计算它的代码会更少。

        4
  •  1
  •   user97370    14 年前

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

    你可以把这些加起来计算整个面积。

        5
  •  1
  •   duffymo    14 年前

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