曲线拟合最小二乘法
最小二乘法的Matlab实现:
x=[19 25 31 38 44]';
y=[19.0 32.3 49.0 73.3 97.8]';
r=[ones(5,1),x.^2] %ones(5,1)意思是生成5行1列的全1阵
ab=r\y
x0=19:0.1:44;
y0=ab(1)+ab(2)*x0.^2;
plot(x,y,'o',x0,y0,'r')
x0=1990:1:1996;
y0=[70,122,144,152,174,196,202];
plot(x0,y0,'*')
%由图可知,利润直线上升所以用y=a1x+b函数
a=polyfit(x0,y0,1);
y1=polyval(a,1997)
y2=polyval(a,1998)
最小二乘优化
(1)把由若干个子函数的平方和构成的函数写成: F ( x ) = ∑ i = 1 m f i 2 ( x ) , x ∈ R n F(x)=\sum_{i=1}^{m}{f_{i}^{2}(x)},x\in R^{n} F(x)=∑i=1mfi2(x),x∈Rn
式中: x = [ x 1 , ⋯   , x n ] T x=[x_{1},\cdots,x_{n}]^{T} x=[x1,⋯,xn]T;
把极小化此类函数的问题
m i n F ( x ) = ∑ i = 1 m f i 2 ( x ) min \qquad F(x)=\sum_{i=1}^{m}{f_{i}^{2}(x)} minF(x)=i=1∑mfi2(x)
称为最小二乘优化问题
(2)
(3)总结:MATLAB中用于解决此类问题的函数:lsqlin,lsqcurvefit,lsqnonlin,lsqnonneg
MATLAB曲线拟合图形界面解法:
命令:cftool,给出了一维数据的拟合
曲线拟合与函数逼近
原文地址:https://wenku.baidu.com/view/cf56be0e6ad97f192279168884868762caaebb24.html
加权最小方差拟合(WLS)
根据基础数据准确性的不同,在拟合时给每个数据以不同的加权数值
WLS拟和数据的函数:
function [th,err,yi]=polyfits_W_L_S(x,y,N,xi,r)
%x,y:数据点系列
%N:多项式拟合的系统,x的阶数
%r:加权系数的逆矩阵
M=length(x);
x=x(:);
y=y(:);
if nargin==4
if length(xi)==M
r=xi;
xi=x;
else
r=1;
end
elseif nargin==3
xi=x;
r=1;
end
%求解系数矩阵
A(:,N+1)=ones(M,1);
for n=N:-1:1
A(:,n)=A(:,n+1).*x;
end
if length(r)==M
for m=1:M
A(m,:)=A(m,:)/r(m);
y(m)=y(m)/r(m);
end
end
%计算拟合系数(th)
th=(A\y)';
ye=polyval(th,x);
err=norm(y-ye)/norm(y);
yi=polyval(th,xi);
end
实例:在MATLAB中输入以下代码:
x=[-3:1:3]';
y=[1.1650,0.0751,-0.6965,0.0591,0.6268,0.3516,1.6961]';
[x,i]=sort(x);
% sort(A)若A是向量不管是列还是行向量,默认都是对A进行升序排列。sort(A)是默认的升序,而sort(A,'descend')是降序排序。
% sort(A)若A是矩阵,默认对A的各列进行升序排列
% sort(A,dim)
% dim=1时等效sort(A)
% dim=2时表示对A中的各行元素升序排列
y=y(i);
xi=min(x)+[0:100]/100*(max(x)-min(x));
for i=1:4
N=2*i-1;
[th,err,yi]=polyfits_W_L_S(x,y,N,xi);
subplot(2,2,i);
plot(x,y,'o');
hold on
plot(xi,yi,'-');
grid on
end