python的scipy实现插值

本文通过一个具体的正弦函数示例介绍了如何使用Python的Scipy库进行一维线性和三次样条插值,并展示了插值后的曲线图表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插值对于一些时间序列的问题可能比较有用。

Show the code directly:

import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import interp1d

x=np.linspace(0,10*np.pi,num=20)
y=np.sin(x)
f1=interp1d(x,y,kind='linear')#线性插值
f2=interp1d(x,y,kind='cubic')#三次样条插值
x_pred=np.linspace(0,10*np.pi,num=1000)
y1=f1(x_pred)
y2=f2(x_pred)
plt.plot(x_pred,y1,'r',label='linear')
plt.plot(x_pred,y2,'b--',label='cubic')
plt.legend()
plt.show()

官网上有更详细的参数使用:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.interp1d.html

### SciPy库中的插值方法 #### 一维插值 在一维情况下,`scipy.interpolate`模块提供了多种方式进行数据插值。对于简单的线性或更高阶多项式的插值需求,可以使用`interp1d`类来构建一个可调用的对象,这个对象可以根据输入的数据点进行插值计算[^2]。 下面是一个具体的一维插值例子: ```python import numpy as np from scipy.interpolate import interp1d import matplotlib.pyplot as plt # 已知离散数据点 x = np.array([0, 1, 2, 3, 4]) y = np.array([0, 1, 4, 9, 16]) # 构建不同类型的插值器 f_linear = interp1d(x, y, kind='linear') f_cubic = interp1d(x, y, kind='cubic') # 新的查询位置 x_new = np.linspace(0, 4, num=50) # 计算新位置处的插值结果 y_linear = f_linear(x_new) y_cubic = f_cubic(x_new) plt.figure(figsize=(8, 6)) plt.plot(x, y, 'o', label="原始数据", markersize=10) plt.plot(x_new, y_linear, '-', label="线性插值") plt.plot(x_new, y_cubic, '--', label="三次样条插值") plt.legend() plt.show() ``` 这段代码展示了如何利用`interp1d`来进行线性和三次样条两种方式的一维插值,并通过图表直观比较两者的效果。 #### 样条插值 除了上述提到的方式外,还可以采用更平滑的样条曲线来进行插值处理。这里展示了一个基于B-splines(基底样条)的例子,它能够提供更加光滑的结果[^1]。 ```python import numpy as np from scipy.interpolate import make_interp_spline import matplotlib.pyplot as plt # 原始数据点 x = np.array([0, 1, 2, 3, 4]) y = np.array([0, 1, 4, 9, 16]) # 创建样条插值函数 spl = make_interp_spline(x, y) # 插值得到的新坐标集合 x_new = np.linspace(0, 4, num=50) y_new = spl(x_new) print("原始数据点:\n", y) print("\n插值后的Y轴数值:\n", y_new[:10], "...") # 只打印前十个作为示例 plt.figure(figsize=(8, 6)) plt.scatter(x, y, color='red', s=50, zorder=5) # 绘制原有点 plt.plot(x_new, y_new, 'b-', lw=2) # 绘制插值后的线条 plt.title('B-Spline Interpolation Example') plt.xlabel('X Axis') plt.ylabel('Y Axis') plt.grid(True) plt.show() ``` 在这个案例中,选择了五个已知的数据点并应用了`make_interp_spline()`函数生成了一条经过这些点并且尽可能保持连续性的样条曲线。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值