插值与拟合

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去接近它成为函数逼近

  最小平方逼近  -->差值的平方的积分最小

以上是关于插值与拟合的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中的一维插值与函数拟合

插值与拟合

备战数学建模31-数据插值与曲线拟合3

Python SciPy库——拟合与插值

Python SciPy库——拟合与插值

Python SciPy库——拟合与插值