主要内容

生成代码lsqlin

求解线性最小二乘问题

的范数最小化问题,创建伪随机数据C*x - d受边界和线性不等式约束。为15个变量创建一个问题,受限于边界Lb = -1而且Ub = 1受到150个线性约束A*x <= b

N = 15;变量数量%rng默认的%用于再现性A = randn([10*N,N]);b = 5*ones(size(A,1),1);Aeq = [];%无等式约束Beq = [];ub = ones(N,1);Lb = -ub;C = 10*eye(N) + randn(N);C = (C + C.')/2;使矩阵对称d = 20*randn(N,1);

解决使用lsqlin

代码生成需要“激活集”算法,需要一个初始点x0.用MATLAB求解该问题®使用算法生成所需代码,设置选项和初始点。

X0 = 0 (size(d));选项= optimoptions(“lsqlin”“算法”“激活集”);

要解决问题,请拨打电话lsqlin

[x,阵线,~,英孚,输出,lam) = lsqlin (C, d, A、b Aeq,说真的,磅,乌兰巴托,x0,选项);
最小值满足约束条件。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。

lsqlin解决这个问题,看看每种类型的非零拉格朗日乘子的数量。通过减去非零拉格朗日乘法器的总数,可以看到有多少解决方案组件是无约束的。

Nl = nnz(lam.lower);Nu = nnz(lam.upper);Ni = nnz(lam.ineqlin);nunconstrained = N - nl - nu - ni;流('下界处的溶液组分数量:%g\n'问);流('在上界处的解组件数:%g\n'ν);流(不等式处的解分量数:%g\n、镍);流('无约束解的分量数:%g\n', nunconstrained);
下界解个数:3上界解个数:2不等式处解个数:5无约束解个数:5

代码生成步骤

要使用代码生成解决相同的问题,请完成以下步骤。

  1. 编写一个包含上述所有步骤的函数。若要产生较少的输出,请设置显示选项“关闭”

    函数[x,fv,lam] = solvelsqlin N = 15;变量数量%rng默认的%用于再现性A = randn([10*N,N]);b = 5*ones(size(A,1),1);Aeq = [];%无等式约束Beq = [];ub = ones(N,1);Lb = -ub;C = 10*eye(N) + randn(N);C = (C + C.')/2;使矩阵对称d = 20*randn(N,1);X0 = 0 (size(d));选项= optimoptions(“lsqlin”“算法”“激活集”...“显示”“关闭”);[x,阵线,~,英孚,输出,lam) = lsqlin (C, d, A、b Aeq,说真的,磅,乌兰巴托,x0,选项);Nl = nnz(lam.lower);Nu = nnz(lam.upper);Ni = nnz(lam.ineqlin);nunconstrained = N - nl - nu - ni;流('下界处的溶液组分数量:%g\n'问);流('在上界处的解组件数:%g\n'ν);流(不等式处的解分量数:%g\n、镍);流('无约束解的分量数:%g\n', nunconstrained);结束
  2. 为代码生成创建配置。在这种情况下,使用墨西哥人的

    CFG = code .config(墨西哥人的);
  3. solvelsqlin函数。

    codegen配置cfgsolvelsqlin
  4. 通过运行生成的文件来测试生成的代码solvelsqlin_mex.mexw64或类似的。

    [x2,fv2,lam2] = solvelsqlin_mex;
    下界解组件数:1上界解组件数:5不等式处解组件数:6无约束解组件数:3
  5. 在不同边界上的解的分量数量与以前的解相比发生了变化。要看这些差异是否重要,可以比较解点差异和函数值差异。

    dip ([norm(x - x2), abs(fv - fv2)])
    1.0e-12 * 0.0007 0.2274

    这两种解决方案之间的差异可以忽略不计。

另请参阅

||(MATLAB编码器)|

相关的话题

Baidu
map