【问题标题】:Numeric integration in numpynumpy 中的数值积分
【发布时间】:2017-09-02 04:41:41
【问题描述】:

我想做一些非常简单的事情,但我无法在numpy 的深处找到它。我想对由其值给出的函数进行数值连续积分(not 由其公式!)。这意味着我只需要一个包含输入数组开头总和的数组。示例:

输入:

[ 4, 3, 5, 8 ]

输出:

[ 4, 7, 12, 20 ]  # [ sum(i[0:1]), sum(i[0:2]), sum(i[0:3]), sum(i[0:4]) ]

听起来很简单,所以我希望这一定很容易使用我目前无法找到的一些 numpy 功能。

我发现了像scipy.integrate.quad() 这样的东西,但它似乎在给定的范围内(从 a 到 b)集成,并返回单个值。我需要一个数组作为输出。

【问题讨论】:

  • 这种集成如何?
  • 输出是产生输入值的函数的 stemfunction 的值。
  • 啊,明白了。对于未来的读者:here 是干函数的样子。然后我们使用黎曼和。
  • 数值积分是在给定域和函数的情况下逼近积分的过程。由于您已经有了可用的 stemfunction,所以这个问题与数值积分无关。
  • @NicoSchlömer 你错了。我没有可用的stemfunction;我想在这个过程中创建它。我的意思是它的价值观,而不是它的公式。因此整合。但随心所欲。

标签: python arrays numpy numerical-integration


【解决方案1】:

你正在寻找numpy.cumsum:

   >>> numpy.cumsum([ 4, 3, 5, 8 ])
   array([ 4,  7, 12, 20])

【讨论】:

  • 那个名字。
【解决方案2】:

您只需要numpy.cumsum()

import numpy as np
a = np.array([ 4, 3, 5, 8 ])
print np.cumsum(a) # prints [ 4  7 12 20]

【讨论】:

    【解决方案3】:

    您可以使用quadpy (pip install quadpy),这是我的一个项目,与scipy.integrate.quad() 相比,它进行矢量化计算。为它提供多个区间,并获取这些区间内的所有积分值。

    import numpy
    import quadpy
    
    a = 0.0
    b = 3.0
    h = 1.0e-2
    n = int((b-a) / h)
    
    x0 = numpy.linspace(a, b, num=n, endpoint=False)
    x1 = x0 + h
    intervals = numpy.stack([x0, x1])
    
    vals = quadpy.line_segment.integrate(
            lambda x: numpy.sin(x),
            intervals,
            quadpy.line_segment.GaussLegendre(5)
            )
    
    res = numpy.cumsum(vals)
    
    import matplotlib.pyplot as plt
    plt.plot(x1, numpy.sin(x1), label='f')
    plt.plot(x1, res, label='F')
    plt.legend()
    plt.show()
    

    【讨论】:

    • 不错!但实际上我只是有一堆数字我想不断总结(现在我知道np.cumsum() 做到了。然而,有人发现我的措辞(数值积分)如此误导,以至于他从根本上改写了我的问题最后它看起来像是我在寻找函数。我解开了那个(在我看来太严格的)变化。我猜你的答案是在那段时间给出的。
    • @Nico 你不能只编辑一个问题,让它允许你写一个答案,其主要目标似乎是推广你的软件。
    • @ImportanceOfBeingErnest 感谢您的回复。这个问题非常不清楚,特别是它与数值积分的关系;请参阅原始帖子下方的讨论。从I don't have the stemfunction available; I want to create it in the process. [...],我了解到问题确实与此有关。我继续相应地编辑帖子,经过一些修补后给出了答案,即创建反衍生物的答案。我确实使用了我编写的包,但我看不出它有什么问题。
    【解决方案4】:

    您不需要numpy 来获取输出。使用标准 itertools 我们得到以下结果:

    from itertools import accumulate
    
    a = [4, 3, 5, 8]
    *b, = accumulate(a)
    print(b) 
    
    # [4, 7, 12, 20]
    

    【讨论】:

    • 出于性能原因,我使用numpy。我正在总结数百万个样本。否则itertools 方法当然是可行的。
    猜你喜欢
    • 2021-02-21
    • 2015-11-27
    • 1970-01-01
    • 2022-10-05
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多