【问题标题】:Python: Integration of InterpolationPython:插值的集成
【发布时间】:2012-08-27 00:15:40
【问题描述】:

我有一些我无法解决的问题:

#! /usr/bin/env python
import numpy as np
from scipy.interpolate import UnivariateSpline
from scipy.integrate import quad
import pylab as pl

x = ([0,10,20,30,40,50,60,70,...,4550,4560])
y = ([0,0,0,0,0,0,0,3,2,3,2,1,2,1,2,...,8,6,5,7,11,6,7,10,6,5,8,13,6,8,8,3])
s = UnivariateSpline(x, y, k=5, s=5)
xs = np.linspace(0, 4560, 4560)
ys = s(xs)

这是我对一些数据进行插值的代码。 另外,我绘制了这个函数。

但现在我想整合它(从零到无穷大)。

我试过了

results = integrate.quad(ys, 0, 99999)

但它没有工作。

您能给我一些提示(或解决方案)吗?谢谢

【问题讨论】:

  • 您不需要在列表周围加上括号,x = [0,10,...,4560] 完全可以接受。

标签: python numpy integration scipy interpolation


【解决方案1】:

正如 Pierre GM 所说,您必须为 quad 提供一个函数(我认为您也可以使用 np.inf 作为上限,尽管在这里它并不重要,因为样条曲线无论如何都会很快变为 0)。然而,你想要的是:

s.integral(0, np.inf)

由于这是一条样条线,UnivariateSpline 对象已经实现了一个应该更好更快的积分。

【讨论】:

  • 好的,谢谢你的解释。但是这个函数的返回值是多少呢?如何将其转换为使用“plot()”显示的函数?
  • 嗯,我猜你想绘制反导数,不确定是否有一个很好的方法可以做到这一点,而不是为很多 val 计算 s.integral(0, val)。
  • 如果我想在 C 中做同样的事情怎么办?有办法吗?
【解决方案2】:

根据quad 的文档,您需要提供一个函数作为第一个参数,然后是积分范围的下限和上限,以及您的函数的一些额外参数(在您的 shell 中键入 help(quad)更多信息。

您传递了一个数组作为第一个参数 (ys),这就是它不起作用的原因。您可能想尝试以下方法:

results = quad(s, xs[0], xs[-1])

results = quad(s, 0, 9999)

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 2015-03-23
    • 2021-09-30
    • 2023-03-11
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多