插值,拟合,参数估计

1. 曲线拟合

1.1 多项式拟合

  • polyfit(x,y,n) —— 其中多项式的系数为n
    说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。x必须是单调的。矩阵s用于生成预测值的误差估计。

  • [p,E]=polyfit(x,y,n) —— p是多项式,E是矩阵用在polyval中计算误差

  • polyval( ) —— 用于多项式求值
    [y,DELTA]=polyval(p,x,s)
    调用格式: y=polyval(p,x)
    说明:y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值。
    [y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计Y DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则Y DELTA将至少包含50%的预测值。

clear all
clc 
x=[0.3 0.4 0.7 0.9 1.2 1.9 2.8 3.2 3.7 4.5];
y=[1 2 3 4 5 2 6 9 2 7];
p5=polyfit(x,y,5);              %5阶多项式拟合
y5=polyval(p5,x);
p5=vpa(poly2sym(p5),5)          %显示5阶多项式
p8=polyfit(x,y,8);              %8阶多项式拟合
y8=polyval(p8,x);   
figure;                     %画图显示
plot(x,y,'bo');
hold on;
plot(x,y5,'r:');
plot(x,y8,'g--');
legend('原始数据','5阶多项式拟合','8阶多项式拟合');
xlabel('x');
ylabel('y');

1.3 非线性拟合

一直输入和输出的函数关系,但不清楚系数向量x
在matlab中可以用lsqcurvefit()解决

  • x = lsqcurvefit(fun,x0,xdata,ydata) —— 其中x0为初始解向量,xdata,ydata为满足函数关系的数据
  • [x,resnorm,residual] —— resnorm是在x处残差的平方和,residual是残差
%定义函数关系
function F = ex1024(x,xdata)
F = x(1)*xdata.^2+x(2)*sin(xdata)+x(3)*xdata.^3
clear all
clc
xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
x0 = [10, 10, 10];    
[x,resnorm,residual] = lsqcurvefit(@ex1024,x0,xdata,ydata)

>>
x =

    0.2269    0.3385    0.3022

2.参数估计函数

2.1 常见分布函数的参数估计

  • [muhat,sigmahat] = normfit(data)
  • [muhat,sigmahat,muci,sigmaci] = normfit(data)
    muhat,sigmahat分别是的估计值
    muci,sigmaci时95%的置信区间
  • [muhat,sigmahat,muci,sigmaci] = normfit(data,alpha)
clear all
clc
x1=[59.6 55.2 56.6 55.8 60.2 57.4 59.8 56.0 55.8 57.4];
x2=[56.8 54.4 59.0 57.0 56.0 60.0 58.2 59.6 59.2 53.8];
x=[x1 x2]';
a=0.05;
[muhat,sigmahat,muci,sigmaci]=normfit(x,a);
[p,ci]=mle('norm',x,a);
n=numel(x);
format long
muhat
p1=p(1)
sigmahat
sigmahat1=var(x).^0.5
p2=p(2)
muci
ci
sigmaci
muci1=[muhat-tinv(1-a/2,n-1)*sigmahat/sqrt(n),muhat+tinv(1-a/2,n-1)*sigmahat/sqrt(n)]
sigmaci1=[((n-1).*sigmahat.^2/chi2inv(1-a/2,n-1)).^0.5,((n-1).*sigmahat.^2/chi2inv(a/2,n-1)).^0.5]

>>

muhat =

  57.390000000000001


p1 =

  57.390000000000001


sigmahat =

   1.966535826750873


sigmahat1 =

   1.966535826750873


p2 =

   1.916742027503963


muci =

  56.469632902339683
  58.310367097660318


ci =

  56.469632902339683   1.495531606349597
  58.310367097660318   2.872266449964584


sigmaci =

   1.495531606349597
   2.872266449964584


muci1 =

  56.469632902339683  58.310367097660318


sigmaci1 =

   1.495531606349597   2.872266449964584

2.2 点估计

  1. 极大似然法
    用mle()进行极大似然估计:
    phat = mle('dist',data):使用data中的数据,返回dist指定的分布的最大似然估计。
clear all 
clc
x1=[59.6 55.2 56.6 55.8 60.2 57.4 59.8 56.0 55.8 57.4];
x2=[56.8 54.4 59.0 57.0 56.0 60.0 58.2 59.6 59.2 53.8];
x=[x1 x2]';
p=mle('norm',x);
muhatmle=p(1)
sigma2hatmle=p(2)^2
p
>>
muhatmle =

  57.390000000000001


sigma2hatmle =

   3.673900000000002
%分别为均值和方差

2.3 区间估计

在matlab中调用mle进行极大似然估计时,有几种调用方式:
[phat,pci] = mle('dist',data,alpha) —— 返回指定分布的最大似然估计和100(1-alpha)%的置信空间

clear all 
clc
x1=[29.8 27.6 28.3 27.9 30.1 28.7 29.9 28.0 27.9 28.7];
x2=[28.4 27.2 29.5 28.5 28.0 30.0 29.1 29.8 29.6 26.9];
x=[x1 x2]';
[p,pci]=mle('norm',x,0.05)

>>

p =

  28.695000000000000   0.958371013751981


pci =

  28.234816451169841   0.747765803174798
  29.155183548830159   1.436133224982292

3.插值

3.1 一维插值

使用命令interp1(),调用方式如下:
yi = (x,Y,xi,method)
其中yi对应于每一参量xi
在下列程序中列出几种常见插值方法:

clear all
clc
x=0:0.3:3;
y=(x.^2-4*x+2).*sin(x);
xi=0:0.01:3;                                %要插值的数据
yi_nearest=interp1(x,y,xi,'nearest');               %临近点插值
yi_linear=interp1(x,y,xi);                      %默认为线性插值
yi_spine=interp1(x,y,xi,'spine');                   %三次样条插值
yi_pchip=interp1(x,y,xi,'pchip');                   %分段三次Hermite插值
yi_v5cubic=interp1(x,y,xi,'v5cubic');               %MATLAB5中三次多项式插值
figure;                                 %画图显示
hold on;
subplot(231);
plot(x,y,'ro');                             %绘制数据点
title('已知数据点');
subplot(232);
plot(x,y,'ro',xi,yi_nearest,'b-');                  %绘制临近点插值的结果
title('临近点插值');
subplot(233);   
plot(x,y,'ro',xi,yi_linear,'b-');                       %绘制线性插值的结果
title('线性插值');
subplot(234);
plot(x,y,'ro',xi,yi_spine,'b-');                        %绘制三次样条插值的结果
title('三次样条插值');
subplot(235);
plot(x,y,'ro',xi,yi_pchip,'b-');                        %绘制分段三次Hermite插值的结果
title('分段三次Hermite插值');
subplot(236);
plot(x,y,'ro',xi,yi_v5cubic,'b-');                  %绘制三次多项式插值的结果
title('三次多项式插值');

其中spline的效果最好

3.2 二维插值

Zi = interp2(X,Y,Z,Xi,Yi,method)

clear all
clc
[x,y]=meshgrid(-5:1:5);                     %原始数据
z=peaks(x,y);
[xi,yi]=meshgrid(-5:0.8:5);                     %插值数据
zi_nearest=interp2(x,y,z,xi,yi,'nearest');              %临近点插值
zi_linear=interp2(x,y,z,xi,yi);                 %系统默认为线性插值
zi_spline=interp2(x,y,z,xi,yi,'spline');                %三次样条插值
zi_cubic=interp2(x,y,z,xi,yi,'cubic');              %三次多项式插值
figure;                                 %数据显示
hold on;
subplot(321);
surf(x,y,z);                                    %绘制原始数据点
title('原始数据');
subplot(322);
surf(xi,yi,zi_nearest);                         %绘制临近点插值的结果
title('临近点插值');
subplot(323);
surf(xi,yi,zi_linear);                          %绘制线性插值的结果
title('线性插值');
subplot(324);
surf(xi,yi,zi_spline);                          %绘制三次样条插值的结果
title('三次样条插值');
subplot(325);
surf(xi,yi,zi_cubic);                           %绘制三次多项式插值的结果
title('三次多项式插值');

3.3 样条插值

在matlab中,三次样条插值可以采用函数spline()

  • spline():给定离散的测量数据x,y
clear all
clc
x = [0 2 4 5 8 12 12.8 17.2 19.9 20];  
y = exp(x).*sin(x);
xx = 0:.25:20;
yy = spline(x,y,xx);
plot(x,y,'o',xx,yy)

你可能感兴趣的:(插值,拟合,参数估计)