我的线性约束scipy.optimize.minimize
是
ones = np.ones_like(x)
np.outer(x, ones) - np.outer(ones, x) > something
其中something
是给定矩阵。(从数学上讲,a_ij < x_i - x_j < a_ji
)。
我该如何表达这一点,即scipy.optimize.LinearConstraint
不接受 3d“矩阵”作为第一个参数?
我的线性约束scipy.optimize.minimize
是
ones = np.ones_like(x)
np.outer(x, ones) - np.outer(ones, x) > something
其中something
是给定矩阵。(从数学上讲,a_ij < x_i - x_j < a_ji
)。
我该如何表达这一点,即scipy.optimize.LinearConstraint
不接受 3d“矩阵”作为第一个参数?
我建议编写一个循环,一次一行地形成约束。
如果要添加对应于 的约束
a_ij < x_i - x_j < a_ji
,可以通过向约束矩阵添加一个向量来实现,该向量全为零,但第 i 个位置为 1,第 j 个位置为负 1。当 SciPy 将此向量与 x 进行点积时,结果将为x_i - x_j
。您可能还想避免重复约束。如果您同时约束值
x_i - x_j
和值x_j - x_i
,那么这些值是相同的,只是乘以 -1。由于约束矩阵中的秩较低,重复约束可能会导致某些最小化方法出现问题。在下面的例子中,我任意选择了所有约束的 i < j。这是一个例子。
输出:
这实际上将您的约束“展平”为二维线性矩阵。