生成的代码lsqlin
线性最小二乘问题来解决
创建伪随机数据的问题最小化的规范C * x - d
范围和线性不等式约束。为15个变量,创建一个问题范围磅= 1
和乌兰巴托= 1
并受150线性约束A * x < =
。
N = 15;%的变量rng默认的%的再现性一个= randn ((10 * N, N));b = 5 *的(大小(A, 1), 1);Aeq = [];%没有等式约束说真的= [];乌兰巴托= 1 (N, 1);磅=乌兰巴托;C = 10 *眼(N) + randn (N);C = (C + C。) / 2;%使对称矩阵d = 20 * randn (N, 1);
解决使用lsqlin
代码生成需要“激活集”
算法,它需要一个初始点x0
。在MATLAB解决这个问题®使用代码生成所需的算法,设置选项和一个初始点。
x0 = 0(大小(d));选择= optimoptions (“lsqlin”,“算法”,“激活集”);
为了解决这个问题,电话lsqlin
。
[x,阵线,~,英孚,输出,lam) = lsqlin (C, d, A、b Aeq,说真的,磅,乌兰巴托,x0,选项);
最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
后lsqlin
解决这个问题,看看非零的拉格朗日乘数法,每种类型的数量。看看有多少解决方案组件被减去无约束非零的总数拉格朗日乘数法。
问= nnz (lam.lower);ν= nnz (lam.upper);倪= nnz (lam.ineqlin);nunconstrained = N - nl - nu -镍;流(解决方案组件的数量在下界:% g \ n '问);流(解决方案组件的数量在上界:% g \ n 'ν);流(“不平等的解决方案组件数量:% g \ n '、镍);流(不受约束的解决方案组件的数量:% g \ n ',nunconstrained);
在下界的解决方案组件数量:3上界的解决方案组件数量:2的解决方案组件不平等:5无约束的解决方案组件数量:5
代码生成步骤
使用代码生成来解决同样的问题,完成以下步骤。
写一个函数,它包含了前面的所有步骤。产生更少的输出设置
显示
选项“关闭”
。函数(x,阵线,lam) = solvelsqlin N = 15;%的变量rng默认的%的再现性一个= randn ((10 * N, N));b = 5 *的(大小(A, 1), 1);Aeq = [];%没有等式约束说真的= [];乌兰巴托= 1 (N, 1);磅=乌兰巴托;C = 10 *眼(N) + randn (N);C = (C + C。) / 2;%使对称矩阵d = 20 * randn (N, 1);x0 = 0(大小(d));选择= optimoptions (“lsqlin”,“算法”,“激活集”,…“显示”,“关闭”);[x,阵线,~,英孚,输出,lam) = lsqlin (C, d, A、b Aeq,说真的,磅,乌兰巴托,x0,选项);问= nnz (lam.lower);ν= nnz (lam.upper);倪= nnz (lam.ineqlin);nunconstrained = N - nl - nu -镍;流(解决方案组件的数量在下界:% g \ n '问);流(解决方案组件的数量在上界:% g \ n 'ν);流(“不平等的解决方案组件数量:% g \ n '、镍);流(不受约束的解决方案组件的数量:% g \ n ',nunconstrained);结束
创建一个配置代码生成。在这种情况下,使用
墨西哥人的
。cfg = coder.config (墨西哥人的);
生成的代码
solvelsqlin
函数。codegen配置cfgsolvelsqlin
通过运行生成的测试生成的代码文件,命名
solvelsqlin_mex.mexw64
或类似的。(x2, fv2, lam2) = solvelsqlin_mex;
在下界的解决方案组件数量:1上界的解决方案组件数量:5不平等的解决方案组件数量:6无约束的解决方案组件数量:3
解决方案组件的数量在不同的范围已经从以前的解决方案。这些差异是否重要,比较方案点差异和函数值的差异。
disp([规范(x - x2), abs(阵线- fv2)))
1.0 e-12 * 0.0007 - 0.2274
两种解决方案之间的差异可以忽略不计。金宝搏官方网站
另请参阅
quadprog
|lsqlin
|codegen
(MATLAB编码器)|optimoptions