Python: 插值的集成

3

我有一些问题无法解决:

#! /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] 是完全可以接受的。 - huon
2个回答

3
根据quad文档,您需要将一个函数作为第一个参数,后跟积分范围的下限和上限,以及一些额外的参数传递给函数(在shell中键入 help(quad) 以获取更多信息)。
您传递了一个数组作为第一个参数(ys),这就是为什么它不起作用的原因。您可以尝试类似以下的操作:
results = quad(s, xs[0], xs[-1])

或者

results = quad(s, 0, 9999)

3

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

s.integral(0, np.inf)

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


好的,谢谢你的解释。但是这个函数的返回值是什么?我如何将其转换为一个能够用"plot()"显示的函数? - beacher_pille88
嗯,我猜你想要绘制反导数,但我不确定除了计算很多值的s.integral(0, val)之外是否有更好的方法。 - seberg
如果我想在C语言中做完全相同的事情怎么办?有没有办法这样做? - beacher_pille88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接