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 点估计
- 极大似然法
用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)