splrep函数参数:
参数 | 描述 |
---|---|
x | (有序)x坐标(自变量值) |
y | (按x排序)y坐标(因变量值) |
w | 应用到y坐标的权重 |
xb,xe | 拟合区间,如果设置为None则区间为[x[0],[-1]] |
k | 样条拟合顺序(1<=k<=5) |
s | 平滑因子 |
full_output | 如果为真,返回附加输出 |
quiet | 如果为真,抑制消息 |
splev函数参数
参数 | 描述 |
---|---|
x | (有序)x坐标(自变量值) |
tck | splrep返回的长度为3的序列(节点,系数,阶数) |
der | 导数的阶(0为元函数,1为一阶导数) |
ext | 如果x不在节点序列中时的行为(0外推,1返回0,2引发ValueError异常) |
import numpy as np
import scipy.interpolate as spi
import matplotlib.pyplot as plt
x = np.linspace(-2 * np.pi, 2 * np.pi, 25)
def f(x):
return np.sin(x) + 0.5 * x
ipo = spi.splrep(x, f(x), k=1)
iy = spi.splev(x, ipo)
plt.figure()
plt.plot(x, f(x), 'b', label='f(x)')
plt.plot(x, iy, 'r.', label='interpolation')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()
np.allclose(f(x),iy)
# 输出为 True
a=[1,2,3]
b=[1,2,3]
c=[1,2,4]
print(np.allclose(a,b)) # 输出为 True
print(np.allclose(a,c)) # 输出为 False
# 样条插值在金融学中往往用于估算未包含在原始观测点中的自变量数据点的因变量值。
# 为此,我们选择一个更小的区间,仔细观察一次样条插入的值:
xd = np.linspace(1.0, 3.0, 50)
iyd = spi.splev(xd, ipo)
plt.figure()
plt.plot(xd, f(xd), 'b', label='f(x)')
plt.plot(xd, iyd, 'r.', label='interpolation')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()
# 插值函数确实线性地在两个观测点之间插值。 对于某些应用, 这可能不够精确。
# 此外, 很明显函数在原始数据点上不是连续可微分的一一这是另一个不足
# 这次使用三次样条插值:
ipo = spi.splrep(x, f(x), k=3)
iyd = spi.splev(xd, ipo)
plt.figure()
plt.plot(xd, f(xd), 'b', label='f(x)')
plt.plot(xd, iyd, 'r.', label='interpolation')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()
print(np.allclose(f(xd), iyd))
# False
print(np.sum((f(xd)-iyd)**2)/len(xd))
# 1.1349319851436252e-08
# 从数值上看, 这种插值并不完美,但是MSE确实很小。