在无约束最优化问题中,有些重要的特殊情形,比如目标函数由若干个函数的平方和构成。这类函数一般可以写成:
其中,一般假设。我们把极小化这类函数的问题:
称为最小二乘优化问题。
最小二乘优化是一类比较特殊的优化问题,在处理这类问题时,Matlab也提供了一些强大的函数。在 Matlab 优化工具箱中,用于求解最小二乘优化问题的函数有:lsqlin、lsqcurvefit、lsqnonlin、lsqnonneg,用法介绍如下。
1.lsqlin函数
求解
s.t.
其中为矩阵,为向量。
Matlab函数为:
x=lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)
例1 用Isqlin函数求一个形如的经验公式,使它与下表所示的数据拟合。
19 | 25 | 31 | 38 | 44 | |
---|---|---|---|---|---|
19.0 | 32.3 | 49.0 | 73.3 | 97.8 |
解:程序如下:
x=[19 25 31 38 44]';
y=[19.0 32.3 49.0 73.3 97.8]';
r=[ones(5,1),x.^2];
ab=lsqlin(r,y)
x0=19:0.1:44;
y0=ab(1)+ab(2)*x0.^2;
plot(x,y,'o',x0,y0,'r')
2.lsqcurvefit函数
给定输入输出数列,求参量使得
Matlab中的函数为:
X=lsqcurvefit(FUN,X0,XDATA,YDATA,LB,UB,OPTIONS)
其中FUN是定义函数的N文件。
例2 用下面表中的数据拟合函数中的参数。
100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 | |
---|---|---|---|---|---|---|---|---|---|---|
4.54 | 4.99 | 5.35 | 5.65 | 5.90 | 6.10 | 6.26 | 6.39 | 6.50 | 6.59 |
解:这个问题即解最优化问题:
解这个问题要分两步:
首先编写待求函数:
function f=fun1(x,tdata);
f=x(1)+x(2)*exp(-0.02*x(3)*tdata); %其中 x(1)=a,x(2)=b,x(3)=k
其中参数x是原函数的待求参数列表,xdata是函数自变量。
之后在主函数中调用lsqcurvefit,编写程序:
td=100:100:1000;
cd=[4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59];
x0=[0.2 0.05 0.05];
x=lsqcurvefit(@fun1,x0,td,cd)
3.lsqnonlin函数
已知函数向量,求使得:
Matlab中的函数为:
X=lsqnonlin(FUN,X0,LB,UB,OPTIONS)
用该函数求解例2:
首先编写含有待求参数的函数:
function f=fun2(x);
td=100:100:1000;
cd=[4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59];
f=x(1)+x(2)*exp(-0.02*x(3)*td)-cd;
之后调用函数lsqnonlin,编写如下程序:
x0=[0.2 0.05 0.05]; %初始值是任意取的
x=lsqnonlin(@fun2,x0)
4.lsqnonneg函数
求解非负的,使得满足
Matlab中的函数为:
X =lsqnonneg(C,d,X0,OPTIONS)
例3 已知,,求满足最小。
编写程序如下:
c=[0.0372 0.2869;0.6861 0.7071;0.6233 0.6245;0.6344 0.6170];
d=[0.8587;0.1781;0.0747;0.8405];
x=lsqnonneg(c,d)