我已经在Python中完成了一些工作,但是对scipy还是陌生的。我正在尝试使用interpolate库中的方法来提出一个近似一组数据的函数。

我查找了一些示例以开始使用,并可以在Python(x,y)中获得以下示例代码:

import numpy as np
from scipy.interpolate import interp1d, Rbf
import pylab as P

# show the plot (empty for now)
P.clf()
P.show()

# generate random input data
original_data = np.linspace(0, 1, 10)

# random noise to be added to the data
noise = (np.random.random(10)*2 - 1) * 1e-1

# calculate f(x)=sin(2*PI*x)+noise
f_original_data = np.sin(2 * np.pi * original_data) + noise

# create interpolator
rbf_interp = Rbf(original_data, f_original_data, function='gaussian')

# Create new sample data (for input), calculate f(x)
#using different interpolation methods
new_sample_data = np.linspace(0, 1, 50)
rbf_new_sample_data    = rbf_interp(new_sample_data)

# draw all results to compare
P.plot(original_data, f_original_data, 'o', ms=6, label='f_original_data')
P.plot(new_sample_data, rbf_new_sample_data, label='Rbf interp')
P.legend()

该图显示如下:

现在,是否有任何方法可以获取表示Rbf创建的插值函数的多项式表达式(即,创建为rbf_interp的方法)?

或者,如果Rbf无法做到这一点,也欢迎使用其他插值方法,其他库甚至是其他工具的任何建议。

最佳答案

RBF使用您要求的任何函数,它当然是全局模型,所以是的,有一个函数结果,但是当然,您可能不喜欢它是正确的,因为它是许多高斯的总和。你得到了:

 rbf.nodes   # the factors for each of the RBF (probably gaussians)
 rbf.xi      # the centers.
 rbf.epsilon # the width of the gaussian, but remember that the Norm plays a role too

因此,使用这些东西,您可以计算距离(使用rbf.xi,然后将距离和rbf.nodesrbf.epsilon中的因子插入高斯(或要求使用的任何函数)中(可以检查__call___call_norm的python代码)。

因此,您得到了类似于sum(rbf.nodes[i] * gaussian(rbf.epsilon, sqrt((rbf.xi - center)**2)) for i, center in enumerate(rbf.nodes))的代码来提供一些有趣的一半代码/公式,RBFs函数写在文档中,但是您也可以检查python代码。

关于python - 获取由scipy创建的插值函数的公式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12600989/

10-09 06:32