曲线拟合最小二乘法
最小二乘法的Matlab实现:
- 解方程组法:
(1)确定系数:
J ( a 1 , ⋯   , a m ) = ∣ ∣ R A − Y ∣ ∣ 2 2 J(a_{1},\cdots,a_{m})=||RA-Y||_{2}^{2} J(a1,⋯,am)=∣∣RA−Y∣∣22
MATLAB中线性最小二乘的标准形式为
m i n A ∣ ∣ R A − Y ∣ ∣ 2 2 \mathop{min}\limits_{A}||RA-Y||_{2}^{2} Amin∣∣RA−Y∣∣22
命令为 :A=R\Y
例5.5
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')
- 多项式拟合方法:
MATLAB命令:
a=polyfit(x0,y0,m)
其中: x 0 , y 0 为 要 拟 合 的 数 据 , m 为 拟 合 多 项 式 的 次 数 , 输 出 参 数 a 为 拟 合 多 项 式 : y = a ( 1 ) x m + ⋯ + a ( m ) x + a ( m + 1 ) 的 系 数 向 量 a = [ a ( 1 ) , ⋯   , a ( m ) , a ( m + 1 ) ] x0,y0为要拟合的数据,m为拟合多项式的次数,输出参数a为拟合多项式:y=a(1)x^{m}+\cdots+a(m)x+a(m+1)的系数向量a=[a(1),\cdots,a(m),a(m+1)] x0,y0为要拟合的数据,m为拟合多项式的次数,输出参数a为拟合多项式:y=a(1)xm+⋯+a(m)x+a(m+1)的系数向量a=[a(1),⋯,a(m),a(m+1)]
多项式在x处的值y:
y=polyval(a,x);
例5.6
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
- Isqlin函数
求解:
m i n x 1 2 ∣ ∣ C ⋅ x − d ∣ ∣ 2 2 \mathop{min}\limits_{x} \quad\frac{1}{2} ||C·x-d||_{2}^{2} xmin21∣∣C⋅x−d∣∣22
s . t . = { A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b s_{.}t_{.}=\left\{ \begin{aligned} A ·x \leq b \\ Aeq ·x=beq \\ lb\leq x \leq ub \end{aligned} \right. s.t.=⎩⎪⎨⎪⎧A⋅x≤bAeq⋅x=beqlb≤x≤ub
命令:x=lsqlin(c,d,A,b,Aeq,beq,lb,ub,x0) - Isqcurvefit函数
给定输入输出数列xdata,ydata,求参量x,使
m i n x ∣ ∣ F ( x , x d a t a ) − y d a t a ∣ ∣ 2 2 = ∑ i ( F ( x , x d a t a i ) − y d a t a i ) 2 \mathop{min}\limits_{x} \quad ||F(x,xdata)-ydata||_{2}^{2}=\sum_{i}(F(x,xdata_{i})-ydata_{i})^{2} xmin∣∣F(x,xdata)−ydata∣∣22=i∑(F(x,xdatai)−ydatai)2
命令:x=lsqlin(fun,x0,xdata,ydata,lb,ub,options) - lsqnonlin函数
求解非负的x,使得:
m i n x ∣ ∣ C ⋅ x − d ∣ ∣ 2 2 \mathop{min}\limits_{x} \quad ||C·x-d||_{2}^{2} xmin∣∣C⋅x−d∣∣22
命令:x=lsqnonlin(C,d,options)
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