python插值与拟合 |
您所在的位置:网站首页 › 拟合函数的选择原则 › python插值与拟合 |
由这张图我们粗略的了解插值和拟合:下面正式介绍。 一维插值一维插值就是在已知互不相同的观测点
注意:插值方法一般用于插值区间内部点的函数值估计或者预测,当大于预测区间时,通常我们也可以进行短期的预测,对于中长区是不可取的。这也就告诉我们插值方法可以对数据中缺失的数据进行填补。 多项式插值
对于上面多项式系数通常可以用三种方法;待定系数法,拉格朗日插值,牛顿插值。 这里我们介绍前两种方法,因为根据克莱姆法则方程的解唯一,所以三种插值方法的计算结果相同,掌握一种即可。 待定系数法将已知的函数点和函数值代入多项式中:得到 我们将其写成矩阵的形式: 于是我们根据举证乘法可以得到这个系数的解:记系数矩阵为A,所以有 引入几个例题; 已知函数的6个观测点,求插值函数 (1) 我们可以看出多项式中的X矩阵是一个标椎的范德蒙矩阵,所以我们使用numpy库里的内置函数构造一个范德蒙矩阵——vander (2)我们在numpy中求逆函数的标准函数是np.linalg.inv() (3)函数polyval(A,[m,n...]),A输入多项式系数值,列表中包含需要预测的函数点。 拉格朗日插值原理不具体介绍,这里直接介绍在python的方法。还是以上面的例子为例。 import numpy as np from scipy.interpolate import lagrange x0=np.arange(1,7) y=np.array([16,18,21,17,15,12]) a=lagrange(x0,y) print(a) yh=np.polyval(a,[1.5,2.6]) print(yh)输出以后的系数和用待定系数法求得的结果是一样的,预测方法也相同的。 但是我们在实际问题中很少使用多项式插值,因为多项式插值随着次数的增高,会产生龙格现象。(龙格现象指的是随着插值的次数增加,也就是插值点的增加,插值结果越偏离原函数。),所以我们通常使用分段线性插值和三次样条插值。 分段线性插值和三次样条插值分段线性插值:简单来说就是每两个相邻的节点用直线相连,如此形成的一条直线就是分段线性插值函数,记作 三次样条插值:分段线性插值在连接点处的光滑程度不高,于是我们重新定义一个函数 (2) 具备这两个条件就称 话不多说直接上例题,原理我们稍作了解具体还是了解代码运作 先介绍我们使用的函数,scipy.interpolate模块有一维插值函数interp1d,二维插值函数interp2d. interp1d基本的调用格式为interp1d(x,y,kind='linear'),kind取值是方法为字符串,指明了插值方法,默认为分段线性插值,'zero','slinear','quadratic','cubic'分别指的是0阶,一阶,二阶,三阶样条插值。 在区间[0,10]上取等间距1000个点 (1)对于进行插值的interp1d函数,我们已经介绍过,学会使用即可。 (2)对于有具体函数形式的方程,我们使用从 scipy.integrate导入的函数quad进行定积分处理,使用形式如下 quad(fun,n,m),fun中是具体的函数,剩余两个参数指的是从n到m的积分区域。对于使用插值预测的函数,我们通常使用numpy给出的函数trapz函数,trapz(y,x)函数中y指的是使用积分区域预测出的插值,x指的是积分区域。(通常x需要有多个插值点) 例题2 已知温度为T,T=[700,720,740,760,780] ,过热蒸汽体积的变化V=[0.0977,0.1218,0.1406,0.1551,0.1664],分别采用分段线性插值和三次样条插值求解T=[750,770]的体积变化,并在一个图形中画出这两个函数。 from scipy.interpolate import interp1d import pylab as plt import numpy as np T=np.array([700,720,740,760,780]) V=np.array([0.0977,0.1218,0.1406,0.1551,0.1664]) s3=interp1d(T,V,'cubic') s=interp1d(T,V) x=[750,770] y1=s3(x);print('三次样条预测=',y1) y2=s(x);print('分段线性插值=',y2) x=np.linspace(700,780,81) y3=s3(x);y4=s(x) plt.rc('font',family='SimHei') plt.plot(x,y3,'*-',label='三次样条插值') plt.plot(x,y4,'-',label='分段线性插值') plt.legend() plt.show()plt.rc('font',family='SimHei')这个语句做用是使中文能够正常显示,而plt.legend()是为了让标签显示,如果不明白可以去掉这个语句在查看图形。 二维插值二维插值问题描述如下:给定的 二维插值常见的分为两种:网格节点插值和散乱数据插值 网格节点插值:用于规则矩形网格点插值情形。散乱数据插值:用于一般数据点,尤其是数据点杂乱无章的情况。 在python中对于网格节点插值我们使用interp2d函数,而对于散乱数据插值我们使用griddata函数,这两个函数均来自scipy.interpolate中,由于通常我们使用二维插值较少,所以再此不过多介绍。 拟合已知一组二维数据,即平面上的n个点 前面介绍了残差的概念,为了使 通常,拟合函数是自变量 给定一个线性无关的函数系
对于给定的线性无关函数系 值得注意的是拟合函数的选择非常重要,如果能根据问题的机理分析出变量之间的函数关系,那么只需要估计出相应参数即可,但是大多我们无法分析出问题的函数关系,所以最好先做出数据的散点图然后选择使用什么样的拟合函数。 一般来说数据分布接近曲线,适宜选用线性函数 例题1: 利用下面的数据,根据最小二乘法建立p和q的之间的检验 这里是将数据条件写成矩阵进行求解的, 当我们拟合的函数形式为多项式时,我们可以使用polyfit函数进行拟合,调用格式为polyfit(x,y,n),拟合n次多项式,返回的系数从高次到低次幂。 以刚才的例题为例 import numpy as np T=np.arange(8) y=np.array([27.0,26.8,26.5,26.3,26.1,25.7,25.3,24.8]) a=np.polyfit(T,y,1) print(a)得到的结果和上面代码的结果几乎相同。 非线性拟合在python中一般我们使用scipy.optimize模块中的函数curve_fit,leastsq,least_squares等函数。这里我们介绍curve_fit()函数的用法。 调用格式为curve_fit(func,xdata,ydata),func为拟合的函数,xdata是自变量观测值,ydata是函数的观测值。会返回两个参数,第一个参数是拟合参数,第二个参数是数据的协方差矩阵。 例题,使用下面的数据拟合函数 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |