1 回答

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
一種選擇是使用scipy.optimize.minimize代替root,這里您有多個(gè)求解器選項(xiàng),其中一些(即SLSQP)允許您指定多個(gè)約束。請(qǐng)注意,我更改了變量名稱,以便這x是您要優(yōu)化的數(shù)組并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
這是一個(gè)最小化器,因此除了約束之外,它還需要一個(gè)函數(shù)來最小化,我只選擇了 的范數(shù)y,但將函數(shù)設(shè)置為常量(即 lambda x: 1)也可以。另請(qǐng)注意,約束并未完全ftol滿足,您可以通過將可選參數(shù)設(shè)置為較小的值(即 )來提高準(zhǔn)確性1e-10。
添加回答
舉報(bào)