非线性最小二乘问题的数学模型为
\({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函数还需要用户指定函数来计算矢量值函数
然后,将优化问题重新写成矢量的形式:
式中,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,使下式最小化:
初值为x = [0.3, 0.4]。
因为lsqnonlin函数假设用户提供的平方和不是显式表达的,所以传递给lsqnonlin函数的函数应该计算矢量值函数。
k=1,2,…,10 (即,F应该有k个元素)。
首先编写一个M文件lsqnonlino.m,计算k元素矢量F:
function F = myfun(x)
k = 1:10;
F=2+2*k-exp(k*x(1))-exp(k*x(2));
然后调用优化过程:
>> x0 = [0.3 0.4]; % 初值
>> [x,resnorm] = lsqnonlin(@lsqnonlino,x0) % 调用优化函数
计算结果为:
x =
0.2578 0.2578
resnorm =
124.3622
【例21】求下面函数的极小点,初始点取为x0=[1,1]。
首先编写目标函数的M文件lsqnonlin2o.m,
function F=myfun(x)
F(1)=x(1);
F(2)=2*x(2);
end
然后调用优化过程:
>> x0=[1 1]; % 初值
>> [x,resnorm]=lsqnonlin(@lsqnonlin2o,x0) % 调用优化函数
计算结果为:
x =
1.0e-15 *
-0.2220 -0.2220
resnorm =
2.4652e-31
可见该解接近于问题的正解[0, 0]。