我有五个变量,我想根据、、、和scipy.optimize.minimize
来找到我正在寻找的解决方案。首先,我导入并定义了初始猜测(基于实验室实验,因此它们应该是有效的)。A
B
C
D
E
minimize
scipy
from scipy.optimize import minimize
A0 = 1.90
B0 = 6.40
C0 = 11.7
D0 = 3.70
E0 = 2.50
ABCDE0 = [A0, B0, C0, D0, E0]
其次,我定义了组成目标函数的各个函数,命名方便Objective
。我还尝试将F
, G
, H
, and组合I
成一个函数,但没有任何运气,所以我决定暂时保持这种状态。
def F(abcde):
a, b, c, d, e = abcde
return c - (b ** 2) / (a - e)
def G(abcde):
a, b, c, d, e = abcde
return (4 * e * ((a - e) * c - b ** 2)) / (a * c - b ** 2)
def H(abcde):
a, b, c, d, e = abcde
return b / (2 * (a - e))
def I(abcde):
a, b, c, d, e = abcde
return (2 * e * b) / (a * c - b ** 2)
def Objective(abcde):
return (F(abcde) / G(abcde)) / (H(abcde) / I(abcde))
第三,为了简单起见,我定义了constraint
(ie (F/G)/(H/I)=1
) 以及命名bnds
为初始猜测的边界。+/- 10%
def constraint(x):
F = x[0]
G = x[1]
H = x[2]
I = x[3]
return (F / G) / (H / I) - 1
con = {'type': 'eq', 'fun': constraint1}
min_per = 0.9
max_per = 1.1
bnds = ((A0*min_per, A0*max_per), (B0*min_per, B0*max_per),
(C0*min_per, C0*max_per), (D0*min_per, D0*max_per),
(E0*min_per, E0*max_per))
第四也是最后,minimize
为我提供了一个名为sol
.
sol = minimize(Objective, ABCDE0, method='SLSQP', bounds=bnds, constraints=con1, options={'disp':True})
如果 sol 要由 打印print(sol)
,将出现以下消息。
Positive directional derivative for linesearch (Exit mode 8)
Current function value: 1.0
Iterations: 18
Function evaluations: 188
Gradient evaluations: 14
fun: 1.0
jac: array([ 0.00000000e+00, 1.49011612e-08, -7.45058060e-09, 0.00000000e+00,
0.00000000e+00])
message: 'Positive directional derivative for linesearch'
nfev: 188
nit: 18
njev: 14
status: 8
success: False
x: array([ 2.09 , 5.76 , 10.53 , 4.07 , 2.50000277])
对我的新手来说,constraint
这似乎是问题所在,但由于缺乏经验,我不确定minimize
。
- 我做错了什么?
- 为什么它没有成功执行?
root_scalar
在这种情况下,按照@fuglede 的建议使用会更好吗?- 是否可以将所有单独的功能包含在一个功能中以避免造成混乱?
请注意D0
和d
不包含在任何功能中,但作为五个自变量之一在事物的宏伟计划中很重要。