编程手之数学建模学习——插值与拟合

插值是已知点都在函数曲线上,然后找到最接近的函数;

拟合是用一条函数曲线,尽可能多的接近所有已知点。

一、插值

指已知多个点的坐标,用函数进行拟合,从而预测其他未知点的函数值。

1、一维插值

用多项式作为插值函数:

注:不适合用高次多项式作为插值函数

范德蒙行列式法:

范德蒙行列式=vander(已知条件的自变量列矩阵)

多项式系数矩阵=范德蒙行列式\已知条件的因变量列矩阵

插值估计值=polyval(多项式系数矩阵,要求的插值点的自变量值)

范德蒙行列式:

例: 

clc, clear
x0=[1:6]'; y0=[16, 18, 21, 17, 15, 12]';
A=vander(x0), p=A\y0
x=[1.5, 2.6];
yh=polyval(p,x)  %求估计值
拉格朗日插值法 :

拉格朗日插值法函数:

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
end

具体调用如下:

插值估计值=lagrange(已知条件的自变量列矩阵,已知条件的因变量列矩阵,要求的插值点的自变量值);

分段线性函数作为插值函数:

y2=interp1(x0,y0,x);  %分段线性插值

三次样条插值作为插值函数(最准确):

有三种形式:

y3=interp1(x0,y0,x,'spline');  %三次样条插值
pp4=csape(x0,y0); %三次样条插值
y4=fnval(pp4,x); %得到插值后的估计值
yx5=griddedInterpolant(x0,y0,'spline') %三次样条插值
y5=yx5(x);%求插值估计值

得到以下结果:
sp = 

  包含以下字段的 struct:

      form: 'pp'
    breaks: [0 0.4000 1 2 3.1416]
     coefs: [4×4 double]
    pieces: 4
     order: 4
       dim: 1


ans =

   -0.1627    0.0076    0.9965         0
   -0.1627   -0.1876    0.9245    0.3894
    0.0244   -0.4804    0.5238    0.8415
    0.0244   -0.4071   -0.3637    0.9093

根据提供的结果,可以得到以下解释:

- `form: 'pp'` 表示插值的形式是 pp 形式。

- `breaks: [0 0.4000 1 2 3.1416]` 表示节点的位置,即插值区间的分割点。

- `coefs: [4×4 double]` 是一个大小为 4×4 的矩阵,其中包含了样条插值的系数。每一行代表一个插值段,每一列对应于插值段的一个系数。

- `pieces: 4` 表示插值区间被分割成了 4 个插值段。

- `order: 4` 表示插值所采用的多项式阶数为 4,即是三次样条插值。

- `dim: 1` 表示插值的维度为 1。

2、二维插值 

用interp2函数 

z=interp2(x0,y0,z0,x,y,'method')

 用三次样条插值法

pp=csape({x0,y0},z0'); %双三次样条插值,注意这里z0要转置
z=fnval(pp,{x,y}); z=z'; %为了和z0的矩阵维数一致

 这里x0,x为行向量,y0,y为列向量。

3、散乱数据插值

主要用于补充未知点,然后画出三维图。

1、ZI=griddatatx(x,y,z,XI,YI)

2、scatteredInterpolant(已知的插值点,Method,ExtrapolationMethod)

Fz=scatteredInterpolant(x0',y0',z0','natural','nearest')
​[xi,yi]=meshgrid(xi,yi); %化成网格数据
zi=Fz(xi,yi); 
mesh(xi,yi,zi)%画出网格图像
​

二、拟合

线性拟合

约束线性最小二乘解:

多项式拟合:

即可线性又可非线性拟合 

 fittype和fit函数(只能一元、二元函数)

fittype定义拟合函数类(可以直接调用库),fit用来拟合函数。

,例: 

 

g=@(a,b,c,d,k,x)(a+b*x).*(x<k)+(c+d*x).*(x>=k); %定义匿名函数
%自变量放最后%分段函数的定义用法
g=fittype(g) %生成fittype类型的函数类
x=[0.81;0.91;0.13;0.91;0.63;0.098;0.28;0.55;0.96;0.96;0.16;0.97;0.96];
y=[0.17;0.12;0.16;0.0035;0.37;0.082;0.34;0.56;0.15;-0.046;0.17;-0.091;-0.071];
f=fit(x,y,g,'StartPoint',[1, 0, 1, 0, 0.5])  %函数拟合%startpoint从哪个点开始搜索

非线性拟合

lsqcurvefit函数(多元函数)

lsqcurvefit(匿名函数,初始拟合点,已知自变量,已知因变量,拟合下限,拟合上限,算法选择)

初始拟合点,拟合上下限均为行向量。

用内置图形界面解决曲线和曲面拟合

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值