python---插值

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坐标(自变量值)
tcksplrep返回的长度为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确实很小。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值