2 Scipy一维插值方法
=============
2.1 直接法——splrep&splev
(1)参数
#求取一维曲线的 B-spline 插值,
给定一组数据点 (x[i],y[i])(x[i],y[i])(x[i],y[i]),确定在区间xb≤x≤xe 上 k 次的光滑样条逼近。
scipy.interpolate.splrep(x, y, w=None, xb=None, xe=None, k=3, task=0, s=None, t=None, full_output=0, per=0, quiet=1)
#求取 N 维曲线的 B-spline 插值
scipy.interpolate.splprep(x, w=None, u=None, ub=None, ue=None, k=3, task=0, s=None, t=None, full_output=0, nest=None, per=0, quiet=1)
其中,x 和 y 是点的横纵坐标,xb 和 xe 是间隔,k 为样条拟合度,建议使用三次样条(cubic splines),通常 1≤k≤5
接下来介绍 scipy.interpolate 里面两大杀器:splrep 和 splev。两个函数名称都是以 spl 开头,全称 spline (样条),可以理解这两个函数都和样条有关。不同的是,两个函数名称以 rep 和 ev 结尾。splrep 和 splev 像是组合拳 (one two punch):
*前者将 x, y 和插值方式转换成「样条对象」
*tck后者利用它在 xnew 上生成 ynew,把 x 和 tck 丢进 splev 函数,我们可以插出在 x 点对应的值 iy。
(2)案例
(3)代码实现 (包含画图的模板库)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import interpolate
import matplotlib as mpl
mpl.rcParams[“font.sans-serif”] = [“SimHei”]
mpl.rcParams[“axes.unicode_minus”] = False
Import data
file = pd.read_excel(‘Three moment method.xlsx’, header=None, names=[‘x’, ‘value’])
data = pd.DataFrame(file)
数组切片
x = data[‘x’] # Take the first column of data
y = data[‘value’] # Take the second column of data
Spline interpolation of correlation functions in SciPy Library
tck = interpolate.splrep(x, y) # (t,c,k)包含节点向量、B样条曲线系数和样条曲线阶数的元组。
xx = np.linspace(min(x), max(x), 200)
yy = interpolate.splev(xx, tck, der=0)
x1, x2 = -0.02, 2.56
y1 = interpolate.splev(x1, tck, der=0)
y2 = interpolate.splev(x2, tck, der=0)
print(‘When x = -0.02, the value of Y is:’, y1)
print(‘When x = 2.56, the value of Y is:’, y2)
print(yy)
plt.figure(‘cubic spline’)
plt.plot(x, y, ‘ro’, xx, yy, ‘b’)
plt.legend([‘true’, ‘cubic spline’])
plt.xlabel(‘X’)
plt.ylabel(‘Y’)
plt.grid(True)
plt.title(‘Three moment method of cubic spline interpolation’)
Save picture
plt.savefig(‘out2.png’, dpi=600)
Set the resolution at which you want to save the picture
plt.show()
#===画图方法,论文改字体