非线性最小二乘问题

非线性最小二乘问题的数学模型为

\({min}_{x}f(x)={f}_{1}(x{)}^{2}+{f}_{2}(x{)}^{2}+...+{f}_{m}(x{)}^{2}+\)L

式中L为常数。

该问题主要通过Gauss-Newton法和Levenberg-Marquardt法进行求解。最优化工具箱用lsqnonlin函数求解非线性最小二乘问题,其调用格式为:

lsqnonlin函数求解非线性最小二乘问题,包括非线性数据拟合问题。不仅仅要计算目标函数f(x) (平方和), lsqnonlin函数还需要用户指定函数来计算矢量值函数

\[F(x)=\left[ \begin{matrix} {f}_{1}(x) \\ {f}_{2}(x) \\ {f}_{3}(x) \end{matrix} \right]\]

然后,将优化问题重新写成矢量的形式:

\[{min}_{x}\frac{1}{2}{\left\| F(x) \right\|}_{2}^{2}-\frac{1}{2}{\sum_{i} {{f}_{i}(x)}}^{2}\]

式中,x为一矢量,F(x)为一返回矢量值的函数。

x = lsqnonlin(fun, x0) 初值为x0,求fun函数的最小平方和。fun函数将返回一个数值矢量但不是值的平方和。

x = lsqnonlin(fun, x0, lb, ub) 定义一系列的下界lb和上界ub,使得总有lb <= x <= ub。

x = lsqnonlin(fun, x0, lb, ub, options) 用options结构指定的优化参数进行最小化。

[x, resnorm] = lsqnonlin(...) 返回x处残差的平方范数值: sum(fun(x).^2)。

[x, resnorm, residual] = lsqnonlin(...) 返回解x处的残差值fun(x)。

[x, resnorm, residual, exitflag] = lsqnonlin(...) 返回exitflag参数,描述函数的退出条件。

[x, resnorm, residual, exitflag, output] = lsqnonlin(...) 返回包含优化信息的输出结构参数output。

[x, resnorm, residual, exitflag, output, lambda] = lsqnonlin(...) 返回包含x处拉格朗日乘子的结构参数lambda。

[x, resnorm, residual, exitflag, output, lambda, jacobian] = lsqnonlin(...) 返回解x处的fun函数的雅可比矩阵。

【例20】 求解x,使下式最小化:

\[\sum_{k=1}^{10} {(2+2k-{e}^{k{x}_{1}}-{e}^{k{x}_{2}}{)}^{2}}\]

初值为x = [0.3, 0.4]。

因为lsqnonlin函数假设用户提供的平方和不是显式表达的,所以传递给lsqnonlin函数的函数应该计算矢量值函数。

\[{F}_{k}(x)=2+2k-{e}^{k{x}_{1}}-{e}^{k{x}_{2}}\]

k=1,2,…,10 (即,F应该有k个元素)。

首先编写一个M文件lsqnonlino.m,计算k元素矢量F:

code.matlab
function F = myfun(x)
k = 1:10;
F=2+2*k-exp(k*x(1))-exp(k*x(2));

然后调用优化过程:

code.matlab
>> x0 = [0.3 0.4];            % 初值
>> [x,resnorm] = lsqnonlin(@lsqnonlino,x0)     % 调用优化函数

计算结果为:

code.matlab
x =
    0.2578    0.2578
resnorm =
  124.3622

【例21】求下面函数的极小点,初始点取为x0=[1,1]。

\[f({x}_{1}, {x}_{2})={x}_{1}^{2}+4{x}_{2}^{2}\]

首先编写目标函数的M文件lsqnonlin2o.m,

code.matlab
function F=myfun(x)
  F(1)=x(1);
  F(2)=2*x(2);
end

然后调用优化过程:

code.matlab
>> x0=[1 1];            % 初值
>> [x,resnorm]=lsqnonlin(@lsqnonlin2o,x0)     % 调用优化函数

计算结果为:

code.matlab
x =
   1.0e-15 *
   -0.2220   -0.2220
resnorm =
   2.4652e-31

可见该解接近于问题的正解[0, 0]。