【问题标题】:Linear programming: minimizing difference between vectors Matlab线性规划:最小化向量之间的差异 Matlab
【发布时间】:2014-09-15 16:58:06
【问题描述】:

我希望通过将x1 更改为x5 来最小化以下等式。

y=[(x1*a+x2*b+x3*c+x4*d+x5*e)-z]

这里a,b,c,d,ez 都是向量。目标是找到a,b,c,d,e 的组合以尽可能与z 匹配。这可以作为线性程序或类似的东西来完成吗?我有 (x1 + x2)=0.6(x3 +x4 x5)=0.4 的约束使用 lsqlin 设置为:

       a=[1;2;3];
    b=[2;5;1];
    c=[8;1;3];
    d=[6;2;1];
    e=[5;4;3];

    C=[a,b,c,d,e];
    z=[6;5;2];
    A=[1 1 0 0 0; 
       0 0 1 1 1] ;
    bounds=[0.6; 0.4];


   lb=zeros(5,1);
       x = lsqlin(C,z,A,bounds,[],[],lb);

但这会返回错误:

警告:大规模算法至少需要与 变量 在 C 矩阵中;改为使用中等规模算法。

在 lsqlin 中 268 优化终止。

x =

0.0000
0.5319    
-0.0000
0.5745
0.2979

这忽略了我所追求的平等。

【问题讨论】:

  • 任何不等式约束,例如非负性?
  • 是的。我相信 lb=zeros(5,1) 给出了这个?但是,是的,都是非负数。但如果需要,y 可以为负数——但无论以绝对值最小化 y。即使得 y 的元素之和尽可能接近 0

标签: matlab optimization vector minimize


【解决方案1】:

如果您只是有等式约束并希望最小化均方误差,您可以使用mrdivide 解决此问题。

不受约束的情况是:

x = z / [a b c d e]

有了约束,你就有了

y = [(x1*a+x2*b+x3*c+x4*d+x5*e)-z] = [(x1*a+(.6-x1)*b+x3*c+x4*d+(.4-x3-x4)*e)-z]

这样

x = [0 .6 0 0 .4] + (z -.6*b - .4*e) / [a-b c-e d-e] * [1 0 0; -1 0 0; 0 1 0; 0 0 1; 0 -1 -1]';

对于不等式约束,您需要设置二次规划并使用求解器,例如单纯形法或内点法。

quadprog MATLAB 函数应该可以有效地做到这一点。 lsqlin 看起来也是一个不错的选择,而且根据您的描述可能更容易设置。

【讨论】:

  • 谢谢。 lsqlin 看起来正是我所需要的,但它给了我一个错误。我现在编辑问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2020-11-09
  • 2016-07-20
相关资源
最近更新 更多