有约束线性最小二乘问题

有约束线性最小二乘问题的数学模型为[大谦MATLAB,dqmatlab点com]

\[{min}_{x}\frac{1}{2}{\left\| Cx-d \right\|}_{2}^{2}\]
\[\begin{matrix} A\cdot x\leq  b \\ Aeq\cdot x=beq \\ lb\leq  x\leq  ub \end{matrix}\]

式中,C, A和Aeq为矩阵,d、b、beq、lb、ub和x为矢量。

最优化工具箱用lsqlin函数求解有约束线性最小二乘问题。调用格式为:

x = lsqlin(C, d, A, b) 求解最小二乘意义上的线性系统C*x=d,约束条件为A*x<=b,其中C为m*n的矩阵。

x = lsqlin(C, d, A,b, Aeq, beq) 加上等式约束Aeq*x = beq以后求解上面的问题。如果没有不等式存在,则令A=[ ]、b=[ ]。

x=lsqlin(C, d, A, b, Aeq, beq, lb, ub)为x定义一系列下界lb和上界ub,使得总有lb <=x<=ub。当没有等式约束存在时,令 Aeq=[ ]、beq=[ ]。x = lsqlin(C, d, A, b, Aeq, beq, lb, ub, x0) 设置初值x0。

x = lsqlin(C, d, A, b, Aeq, beq, lb, ub, x0, options) 用options结构指定的优化参数进行最小化。

[x, resnorm] = lsqlin(...) 返回残差的平方范数值:norm(C*x-d)^2。

[x, resnorm, residual] = lsqlin(...) 返回残差C*x-d。

[x, resnorm, residual, exitflag] = lsqlin(...) 返回exitflag参数,它包含函数的退出条件。

[x, resnorm, residual, exitflag, output] = lsqlin(...) 返回与优化信息有关的结构输出参数output。

[x, resnorm, residual, exitflag, output, lambda] = lsqlin(...) 返回解x处包含拉格朗日乘子的lambda。

【例19】求解下列问题的最小二乘解。

\[C\cdot x=d A\cdot x\leq  b lb\leq  x\leq  ub\]

首先输入系数矩阵和下界、上界:

code.matlab
>> C=[
    0.9501    0.7620    0.6153    0.4057
    0.2311    0.4564    0.7919    0.9354
    0.6068    0.0185    0.9218    0.9169
    0.4859    0.8214    0.7382    0.4102
    0.8912    0.4447    0.1762    0.8936];
>> d=[
    0.0578
    0.3528
    0.8131
    0.0098
    0.1388];
>> A=[
    0.2027    0.2721    0.7467    0.4659
    0.1987    0.1988    0.4450    0.4186
    0.6037    0.0152    0.9318    0.8462];
>> b=[
    0.5251
    0.2026
    0.6721];
>> lb = -0.1*ones(4,1);
>> ub = 2*ones(4,1);

然后调用有约束线性最小二乘过程:

code.matlab
>> [x,resnorm,residual,exitflag,output,lambda] = ...
lsqlin(C, d, A, b, [ ], [ ], lb, ub)

计算结果为:

code.matlab
x =
   -0.1000
   -0.1000
    0.2152
    0.3502
resnorm =
    0.1672
residual =
    0.0455
    0.0764
   -0.3562
    0.1620
    0.0784
exitflag =
     1
output =
  包含以下字段的 struct:
            message: 'Minimum found that satisfies…'
          algorithm: 'interior-point'
      firstorderopt: 4.3374e-11
    constrviolation: 0
         iterations: 6
       linearsolver: 'dense'
       cgiterations: []
lambda =
  包含以下字段的 struct:
    ineqlin: [3×1 double]
      eqlin: [0×1 double]
      lower: [4×1 double]
      upper: [4×1 double]