主要内容

生成的代码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

代码生成步骤

使用代码生成来解决同样的问题,完成以下步骤。

  1. 写一个函数,它包含了前面的所有步骤。产生更少的输出设置显示选项“关闭”

    函数(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);结束
  2. 创建一个配置代码生成。在这种情况下,使用墨西哥人的

    cfg = coder.config (墨西哥人的);
  3. 生成的代码solvelsqlin函数。

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

    (x2, fv2, lam2) = solvelsqlin_mex;
    在下界的解决方案组件数量:1上界的解决方案组件数量:5不平等的解决方案组件数量:6无约束的解决方案组件数量:3
  5. 解决方案组件的数量在不同的范围已经从以前的解决方案。这些差异是否重要,比较方案点差异和函数值的差异。

    disp([规范(x - x2), abs(阵线- fv2)))
    1.0 e-12 * 0.0007 - 0.2274

    两种解决方案之间的差异可以忽略不计。金宝搏官方网站

另请参阅

||(MATLAB编码器)|

相关的话题