生成代码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
代码生成步骤
要使用代码生成解决相同的问题,请完成以下步骤。
编写一个包含上述所有步骤的函数。若要产生较少的输出,请设置
显示
选项“关闭”
.函数[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);结束
为代码生成创建配置。在这种情况下,使用
墨西哥人的
.CFG = code .config(墨西哥人的);
为
solvelsqlin
函数。codegen配置cfgsolvelsqlin
通过运行生成的文件来测试生成的代码
solvelsqlin_mex.mexw64
或类似的。[x2,fv2,lam2] = solvelsqlin_mex;
下界解组件数:1上界解组件数:5不等式处解组件数:6无约束解组件数:3
在不同边界上的解的分量数量与以前的解相比发生了变化。要看这些差异是否重要,可以比较解点差异和函数值差异。
dip ([norm(x - x2), abs(fv - fv2)])
1.0e-12 * 0.0007 0.2274
这两种解决方案之间的差异可以忽略不计。
另请参阅
quadprog
|lsqlin
|codegen
(MATLAB编码器)|optimoptions