获得锥体的极光

计算科学 Python 线性规划
2021-12-24 23:19:03

所以我有一组线性齐次方程Ax=0. 我想为非负解决方案解决这个问题。我一般可以求解系统,我得到了跨越解空间的两个向量,但其中一个向量有负条目。我想将解决方案空间限制为R0n. 我应该添加向量x是符号变量的向量(Sympy),不确定这是否重要。

有人告诉我,一种方法是使用线性规划的单纯形法并将目标函数设置为零函数。当我在 SciPy 中执行此操作时,我只得到一个解向量,而不是我想要的两个(输出似乎是我想要的两个的总和)。

问题

  • 我怎样才能调整算法,使其吐出跨越解空间(圆锥)的向量(极值射线)?

  • 是否有任何其他我可以使用的库可以在 Python 中为我做到这一点?

示例 假设我有系统:

  1. λ0λ3=0
  2. λ1+λ4λ0=0
  3. λ2λ1=0
  4. λ3λ2λ4=0

解决这个系统相当于找到零空间,

[10010110010110000111]

使用 SciPy 方法查找矩阵的零空间为我提供了向量跨越的解空间,

[1,1,1,1,0],[0,1,1,0,1]
我想将此限制为非负面解决方案。我相信跨越限制为正实数的解决方案空间的两个向量是,
[1,1,1,1,0],[1,0,0,1,1]
到目前为止,我已经尝试通过将目标函数设置为零函数来使用线性规划方法和单纯形法。那里的输出,
[2,1,1,2,2]
这是我想要的两者的总和。最小二乘法在边界 (0.5,2) 下给出相同的结果。

1个回答

正如我在评论中提到的,您可以使用随机方法来解决这个问题。最终,我们的解向量有等式约束λ存在Aλ=0, 对于一些给定的A. 由于我们正在考虑零空间的元素,它们的规模并不重要,但我们真正关心的是λ大于或等于0. 因此,让我们设置盒子约束0λi1, 对所有人i.

现在,我们假设可能有多种解决方案可以满足这些约束,那么我们如何才能潜在地识别它们呢?让我们寻求最小化形式的目标cTλ我们确保我们的选择c是这样的ci<0对所有人i以确保我们不会得到微不足道的解决方案λ=0在我们的约束下。

假设我们使用随机方法,也许选择所有iciunif(1,0)然后生成一组k随机向量{c(1),,c(k)}. 如果我们解决k线性规划最小化(c(j))Tλ在我们的限制下,对于足够大的k我们应该以高概率获得您想要的所有解决方案。我敢肯定,可以使用 Hoeffding 不等式或类似的东西来计算出一些界限,然后找出确保您以高概率找到所有解决方案所需的样本复杂性,但最终这应该可行。

我编写了一个示例 Matlab 脚本来说明这个算法

% test randomized algorithm idea for finding nullspace with constraints

% setup the linear program values
A = [1, 0, 0, -1, 0;
    -1, 1, 0, 0, 1;
    0, -1, 1, 0, 0;
    0, 0, -1, 1, -1];
b = zeros(4,1);
lb= zeros(5,1);
ub= ones(5,1);

% solve k linear programs with randomized approach
k = 15;
X = zeros(5,k);
for i = 1:k
X(:,i) = linprog(-rand(5,1), A, b, [], [], lb, ub);
end

% find the unique solutions
U = unique(X','rows')'

为了k=15,我已经多次运行脚本,它总是产生正确的两个解决方案,即产生输出

U =

     1     1
     0     1
     0     1
     1     1
     1     0

如果我使用k=2,有时它会同时产生,有时则不会。您可以尝试使用您的方法,可能会进行采样,直到您拥有与您期望的一样多的独特解决方案,但关键是该算法将为您提供您正在寻找的具有足够样本的结果。