插值与拟合
Posted 阿杜&eason
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插值与拟合相关的知识,希望对你有一定的参考价值。
1.插值 -->求过已知有限个数据点的近似函数
1)拉格朗日多项式插值 -->n个插值点不同时确定了一个唯一的n次多项式
构造n次拉格朗日插值多项式(不使用解方程n个约束来求解待定系数)
2)牛顿插值
使用差商概念来构造牛顿插值公式(计算量小,余项与拉格朗日余项相等),当节点之差为常数时,使用差分来代替差商构造牛顿向前插值公式
3)分段线性插值 -->高次插值存在震荡缺陷,采用低次分段函数(线性函数)
y=interp1(x0,y0,x,‘method‘) -->method可取nearest(最近项插值)、linear(线性)、spline(逐段三次样条插值)、cublic(保凹凸性3次插值)
4)Hermite插值 -->插值函数不仅要求节点处与函数同值,同时要有相同一阶、二阶导数
5)样条插值 -->对插值函数的光滑性要求较高(样条函数代替线性函数,一般采用二次、三次样条插值)
a.二次样条插值函数
两类问题:已知函数值与边界处导数值;已知节点导数值及边界点函数值
b.三次样条插值函数
三类问题:已知端点一阶导(完备三次样条插值函数);端点二阶导已知;两端点一二阶导相等 -->满足n+3个约束条件
pp=csape(x0,y0,conds),y=ppval(pp,x) -->conds指定插值的边界条件:complete,not-a-knot(非扭结条件)、second、periodic、variational(设置边界的二阶导数值为0,0)
clc,clear x0=[0,3,5,7,9,11,12,13,14,15]; y0=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6]; x=0:0.1:15; y1=lagrange(x0,y0,x); y2=interp1(x0,y0,x); y3=interp1(x0,y0,x,‘spline‘); pp1=csape(x0,y0); y4=ppval(pp1,x); pp2=csape(x0,y0,‘second‘); y5=ppval(pp2,x); fprintf(‘比较一下不同茶之方法和边界条件的结果:\n‘) fprintf(‘x y1 y2 y3 y4 y5\n‘) xianshi=[x‘,y1‘,y2‘,y3‘,y4‘,y5‘]; fprintf(‘%f\t%f\t%f\t%f\t%f\t%f\n‘,xianshi‘) subplot(2,2,1),plot(x0,y0,‘+‘,x,y1),title(‘Lagrange‘) subplot(2,2,2),plot(x0,y0,‘+‘,x,y2),title(‘Peicewise linear‘) subplot(2,2,3),plot(x0,y0,‘+‘,x,y3),title(‘Spline1‘) subplot(2,2,4),plot(x0,y0,‘+‘,x,y4),title(‘Spline2‘) dyx0=ppval(fnder(pp1),x0(1)) ytemp=y3(131:151); index=find(ytemp==min(ytemp)); xymin=[x(130+index),ytemp(index)] function y=lagrange(x0,y0,x); n=length(x0); m=length(x); for i=1:m z=x(i); s=0.0; for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s; end
c.B样条函数插值方法 -->对函数进行磨光处理(积分)构造出样条函数作为插值函数,既有较好的凹凸性,又有足够的光滑性
6)二维插值:z=interp2(x0,y0,z0,x,y,‘method‘) pp=csape({x0,y0},z0,conds,valconds),z=fnval(pp,{x,y}) 散乱节点(非有序) zi=griddata(x,y,z,xi,yi)
2.拟合 -->求近似函数,某种意义下这些点上总偏差最小
1)线性最小二乘法 -->将函数f(x)看为一系列线性无关的函数与待定系数的乘积之和
R为线性无关函数阵列,A为待定系数向量,Y为节点值向量,则A=(R‘R)的逆*R‘Y
a.函数的选取:作图直观的判断,常用的有:直线、多项式、双曲线、指数
clc,clear x=[19,25,31,38,44]‘; y=[19,32.3,49,73.3,97.8]‘; r=[ones(5,1),x.^2]; ab=r\y x0=19:0.1:44; y0=ab(1)+ab(2)*x0.^2; plot(x,y,‘o‘,x0,y0,‘r‘)
2)多项式拟合 -->采用多项式拟合给定数据
a=polyfit(x0,y0,m)输出a为待定系数矩阵(由高次到低次排列) y=polyval(a,x) 做散点图选择多项式的次数,
3.最小二乘优化问题 -->在无约束最优化问题中,目标函数由若干个函数的平方和构成,求其极小值的问题为最小二乘优化问题
1)lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)
2)lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
clc,clear t=[19,25,31,38,44]; c=[19,32.3,49,73.3,97.8]; x0=[0.2,0.2]; x=lsqcurvefit(@fun,x0,t,c); x(1),x(2) function f=fun(x,t); f=x(1)+x(2)*t.^2;
3)lsqnonlin(fun,x0,lb,ub,options)
4)lsqnonneg(c,d,x0,options) 求解非负的x满足最小二乘函数
4.函数逼近 -->给定一组离散数据选择一个较简单的f去接近这些数据成为曲线拟合 给定一个复杂连续函数选择一个较简单的函数f去接近它成为函数逼近
最小平方逼近 -->差值的平方的积分最小
以上是关于插值与拟合的主要内容,如果未能解决你的问题,请参考以下文章