找到一个标量使向量加法为正

Find a scalar to make a vector addition positive

我有两个向量 a=(a_1, a_2,...,a_n) 和 b=(b_1, b_2, ...,b_n)。我想找到一个标量 "s" 使得 s=max{s : a+sb >= 0}。这里的不等式是逐元素的,即 a_i+sb_i>=0 对于所有 i=[1,...,n]。如何计算这样的标量?此外,如果 s=infinity 是解,我们将通过 s=1 来约束 s。

向量 "a" 也是非负的(即每个元素 >=0)。

好的 a_i >= 0,我们可以看到 s=0 总是一个解决方案。 一种可能的方法是解决所有组件上的不等式,然后取域的交集。它们的上限(如果是有限的,是交集的一部分)就是你想要的数字。 这意味着:

是您要解决的问题。请注意,因为在第二种情况下 b_i 为负数,所以右侧的数字为正数。这意味着你得到的所有 s_i 的交集都是非空的。最大值的下限为 0,因此从技术上讲,您可以 忽略 b_i 为正的不等式 ,无论如何它们都是正确的。但是,出于完整性和说明目的:

示例: a= (1,1), b=(-0,5,1)

  1. 1 - s*0.5 >= 0 ,这意味着 s <= 2,或者 s in (-inf, 2]
  2. 1 + s*1 >= 0,即s>= -1,或[-1,inf)
  3. 中的s

交点:[-1,2] 这意味着两个方程都成立的最大值是 2.

这是最直接的方式,当然还有更优雅的方式。

编辑: 作为算法:检查 b_i 是正数还是负数。如果为正,则保存 s_i = 1(如果您希望您的值受 1 约束)。如果为负,则保存 s_i = -a_i/b_i。最后你要实际采取最低限度!

效率更高:当b_i为正时,您实际上不需要关心。无论如何,您的最大值将大于或等于零。所以只需检查它小于 0 的情况并保留它们中的最小值 -a_i/b_i,因为那是该区域的上限。

伪代码:

s = 1
for i in range = 1 to length(b):
    if b[i]<0:
        s = min(s, -a[i]/b[i]) 

为什么是最小值?因为那个-a[i]/b[i]是区域的上限。