【问题标题】:Integration (math) in C++C++ 中的积分(数学)
【发布时间】:2010-06-05 21:25:11
【问题描述】:

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

提前感谢您的帮助!

克里斯

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

【问题讨论】:

  • 这个任务只需要几行代码。你确定搜索它会更快吗?
  • @Andrey 你还没有看到我的 C++ 技能 ;-)
  • 这是开始提升他们的好时机!

标签: c++ math calculus


【解决方案1】:

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

  • 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】:

    我今天刚刚参加了我的数字考试 :) 和 我为你准备了 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 是你的周期数

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

    参考:

    【讨论】:

    • 考试是否涵盖了哪些规则在什么情况下最合适?重要的。输入是:随机数据。
    • 我们使用 h 作为常数 ...在前 2 个规则中,您可以得到每两个 x (delta x) 之间的差异,因为在这 2 个示例中,您只需得到 (rectangle或梯形)...在第三个(辛普森)中,我不确定这是否可以轻松完成...但是还有另一种解决方案...。我们可以从给定的点使用拉格朗日插值来获得最佳函数表示点,然后用固定的 h 值进行整数运算...我应该将其添加到答案中吗???
    • 辛普森规则对 3 个点使用拉格朗日插值法,因此它给出了高达三阶多项式的精确结果。事实上,辛普森法则的误差与函数在区间某点的四阶导数成正比。
    • 这个答案很好,因为我认为辛普森的规则比其他方法更受欢迎(甚至可以使用更高阶的规则)。然而,答案并不完整。偶数和奇数 n 情况的处理方式不同,实现必须同时处理 n = 0、1、2 或 3 的特殊情况。
    【解决方案3】:

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

    【讨论】:

    • 而且他可能会学到一些关于整合交易的好东西。
    【解决方案4】:

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

    您可以通过将这些相加来计算整个面积。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我相信辛普森的规则集成了二次样条。梯形规则更简单。 +1 注意排序的重要性,但如果你走这条路,你应该提到检查数据是否代表一个函数(即没有重复的独立坐标)的问题。
      猜你喜欢
      • 2021-01-13
      • 2018-04-20
      • 2021-12-25
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多