用python实现分段函数_分段插值法原理及Python实现
插值、预测、拟合是三个十分相近的概念。
(1)插值一般要求插值函数经过所有的样本点,形成复杂的插值函数。
插值有两大基本思路:
思路1:已知n个样本点,基于样本数据计算出唯一的插值函数f(x),使得f(x)经过每个样本点,再根据f(x)计算新的x-new对应的y值(即插值)。当获得f(x)后,可以对任意x进行插值计算。
这样的f(x)自然十分贴合样本点,但是往往函数次数十分高,即产生的f(x)是高次多项式,容易产生龙格现象,即边缘点的插值结果与样本点差异较大。
思路2:分段插值。插值结果仅取决于周围少数2个、3个点。最终形成复杂的分段函数。不过分段插值局限性比较明显,即新的x只能介于样本点的x区间内。如,已知样本点x的取值范围为【0,10】,则我们不能使用分段插值法计算x = 11的插值y。
(2)拟合方法指根据样本点形成一个拟合函数f(x),拟合函数不一定经过所有的样本点,它要求拟合值与实际值之间的误差之和最小,即总体误差最小即可。可以基于获得的拟合函数f(x)预测新的任意x对应的y。
1.分段一次插值法(也称:分段线性插值法)【常用~】
计算点xi的插值时,只用到左(Xi-1)右(Xi+1)的两个点,因此计算效率较高。
python代码示例:
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
import numpy as np
import math
#arange()函数用于生成一组数,包括起始值,不包括终点值,默认间隔为1,生成的数格式为array.
x = np.arange(0, 10)
y = [math.exp(i) for i in x]
f = interp1d(x, y,kind = linear)
x_new = np.arange(1,8,2)#以2为间隔,生成[1,7]之间的数组。
y_new = f(x_new) #使用函数根据x_new进行插值
plt.plot(x, y, b-, x_new, y_new, ro)#原始点为蓝色线条,插值点为红色圆点
结果:
2.分段二次插值法
以每三个相邻的点为一个子区间(即区间段),由于三点即可确定一个二次函数图像和对应的函数表达式f(x),因此,可以计算x_new对应的插值y_new。
python代码参考:分段二次插值--用Python进行数值计算 - 行行无别语只道早还乡 - 博客园www.cnblogs.com
由于二次插值法容易出现尖点,并不常用。
3.分段三次埃米尔特插值法【常用~】
python示例:
from scipy.interpolate import PchipInterpolator as PCHIP
#PCHIP stands for Piecewise Cubic Hermite Interpolating Polynomial
x = [1,2,3,4,5,6]
y = [-1,-1,0,1,1,1]
pchip = PCHIP(x,y)
x_new = [2.5,3.5,4.5]
y_new = pchip.__call__(x_new)
print(y_new)
import matplotlib.pyplot as plt
#同时执行两个plot,才能将两个图绘制到一个图上
plt.plot(x_new, y_new, ro)#插值点为红色圆点
plt.plot(x, y, b-)#原始点为蓝色线条
参考:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com数学建模--插值算法(SciPy实现)_ddjhpxs的博客-博客_分段三次埃尔米特插值 scipy有内置吗blog..net