【问题标题】:MATLAB: Solve system of linear equalities while constraining some values to be positiveMATLAB:求解线性等式系统,同时将某些值约束为正
【发布时间】:2026-02-04 10:15:02
【问题描述】:

paper I'm reading 包含以下定理。

我编写了一些 MATLAB 代码来尝试重现本文后面出现的结果,最初它似乎运行良好。

M = 6;

Sigma = [1 .5 .15 .15 0 0;
 .5 1 .15 .15 0 0;
 .15 .15 1 .25 0 0;
 .15 .15 .25 1 0 0;
 0 0 0 0 1 .1;
 0 0 0 0 .1 1];

Delta = [0 0 .2 .2 .5 .5]';

cov_vect = [.3 .3 .35 .35 .25 .25];

u = ones(M,1);

lastcol = [u' 0];

First = Sigma+(Delta*Delta');
First(M+1,:) = u;
First(:,M+1) = lastcol;

Third = [cov_vect 1]';

X = linsolve(First,Third);

此代码创建的结果与论文中的结果相匹配。

我想将我的代码与其他数据集一起使用,但是当我尝试这样做时遇到了问题。 M、Sigma、Delta 和 cov_vect 会因数据集而异,但其余代码应保持不变。

当我在新数据集上使用我的代码时,尽管向量 w 总和为 1(应该如此),但它有时包含负值。根据该论文,这不应该发生。 lambda 可以为负数,但 w 向量中的任何值都不能为负数。

如何让 MATLAB 约束结果,使 w 中的所有值都必须为正,同时保持向量 w 总和为 1 的要求?

【问题讨论】:

  • 一个想法:您可以将问题表述为优化问题。例如。最小化 x'Ax + b'*x 服从 C * x quadprog 或 linprog.
  • 查看 linprog 的文档,似乎我应该有类似 [X,FVAL] = linprog(f,First,Third) 的内容。但是在这种情况下 f 是什么?
  • 为了得到线性等式系统,论文作者是否解决了一些优化问题?我要做的第一件事(如果可能的话)是通过添加 w 为非负的约束来解决相同的优化问题。
  • 尝试查看lsqnonneg:mathworks.com/help/matlab/ref/lsqnonneg.html - 这确定了最小二乘问题的最佳解决方案,确保解决方案都是正数。值得考虑的事情。
  • 我有点好奇,所以就这么做了。看我的回答。

标签: matlab


【解决方案1】:

您的问题似乎引用了this paper

您引用的定理 2 是以下优化问题的解决方案(请参阅错误/错字部分,我必须至少进行一次更正)。

minimize (over w)  w' * (Sigma + delta * delta') * w - 2 * cov_vect' * w

                                      subject to:  w'*ones(n, 1) = 1

这可以使用 Matlab 函数 quadprog 解决:

H = 2 * (Sigma + delta * Delta');  % see quadprog docs, it solves 1/2 so we need 2
f = - 2 * cov_vect;
A = [];
b = [];
Aeq = ones(1,6);
beq = 1;
w = quadprog(H, f, A, b, Aeq, beq);

您可以添加 0 的下限约束:

lb = zeros(6, 1);
ub = [];
w2 = quadprog(H, f, A, b, Aeq, beq, lb, ub);

如何在CVX 中解决这个问题(很棒的优化包)

cvx_begin
variables y(n);
minimize(y' * (Sigma + Delta * Delta') * y - 2 * cov_vect * y)
subject to:
   y'*ones(n,1) == 1;
   y >= 0;
cvx_end

链接到cvx

researchgate 上发表的论文附录中的错字:

(错别字)他们对定理 2 的证明省略了目标函数的第 2*cov_vect' * w 项中的2*wThe minimization problem should be:

minimize (over w)  w' * (Sigma + delta * delta') * w - 2*cov_vect' * w

这确实给出了解决方案:

0.1596    0.1596    0.2090    0.2090    0.1314    0.1314

或等效:

minimize (over w)  .5 * w' * (Sigma + delta * delta') * w - cov_vect' * w

【讨论】:

  • 您是如何确定前面带有 .5 的版本可以工作的?使用 CVX,我能够独立验证将 .5 放在前面是否可以重新创建他们的结果,但我不知道你是如何发现它会起作用的。
  • 出于好奇,你有发表过的论文吗?还是只是研究门版本?我很好奇已发布版本附录中的目标函数是否更正/不同。我并不好奇要支付 30 美元:P
  • @user1205901 我是如何计算出 0.5 的?我只是猜测,因为这似乎是一个容易犯的错误(我自己编码时可能在 A 前面没有 2* 就调用了 quadprog)。我不知道:是正确的目标w'(S+d*d')w - 2 *cov_vect'*w?还是w'(S+d*d')w - cov_vect'*w。我不知道!可能发表的论文不一样,可能附录有错别字,可能附录是对的,论文中的小错误。很可能一切都是正确的,只是附录在 researchgate 发布的版本中有错字。我不知道。
  • 谢谢。我在问题的第一行附上了一个已发布的版本。
  • 他们论文中的答案是正确的。是附录的目的不正确。看起来像一个小错字。请参阅正确目标的推导here