1 回答
TA贡献2041条经验 获得超4个赞
一种选择是使用scipy.optimize.minimize代替root,这里您有多个求解器选项,其中一些(即SLSQP)允许您指定多个约束。请注意,我更改了变量名称,以便这x是您要优化的数组并y定义z约束。
from scipy.optimize import minimize
import numpy as np
x0 = np.array([1, 1, 1, 1, 1])
y = np.array([6, 3, 1, 0, 2])
z = np.array([3, 4, 5, 6, 7])
constraint_x = dict(type='ineq',
fun=lambda x: x) # fulfilled if > 0
constraint_y = dict(type='eq',
fun=lambda x: np.linalg.norm(x-y) - 5) # fulfilled if == 0
constraint_z = dict(type='eq',
fun=lambda x: np.linalg.norm(x-z) - 8) # fulfilled if == 0
res = minimize(fun=lambda x: np.linalg.norm(x), constraints=[constraint_y, constraint_z], x0=x0,
method='SLSQP', options=dict(ftol=1e-8)) # default 1e-6
print(res.x) # [1.55517124 1.44981672 1.46921122 1.61335466 2.13174483]
print(np.linalg.norm(res.x-y)) # 5.00000000137866
print(np.linalg.norm(res.x-z)) # 8.000000000930026
这是一个最小化器,因此除了约束之外,它还需要一个函数来最小化,我只选择了 的范数y,但将函数设置为常量(即 lambda x: 1)也可以。另请注意,约束并未完全ftol满足,您可以通过将可选参数设置为较小的值(即 )来提高准确性1e-10。
添加回答
举报