您可以使用root https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html:
import numpy as np
from scipy.optimize import root
def your_funcs(X):
x, y, a, b = X
f = [np.cos(x) / x - 0.2 * a - 0.1,
np.cos(y) / y - 0.2 * b - 0.1,
a + b - 1,
1.03 * np.sinc(x) - 1.02 * np.sinc(y)]
return f
sol2 = root(your_funcs, [0.1, 0.1, 0.3, 0.1])
print(sol2.x)
将打印
[ 1.30301572 1.30987969 0.51530547 0.48469453]
您的函数必须以计算结果为 0 的方式定义,例如a + b - 1
代替a + b = 1
.
快速检查:
print(your_funcs(sol2.x))
gives
[-1.9356960478944529e-11, 1.8931356482454476e-11, 0.0, -4.1039033282785908e-11]
所以,解决方案应该没问题(请注意e-11
基本上是0)。
或者,您也可以使用fsolve https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fsolve.html:
from scipy.optimize import fsolve
sol3 = fsolve(your_funcs, [0.1, 0.1, 0.3, 0.1])
这会给你相同的结果:
[ 1.30301572 1.30987969 0.51530547 0.48469453]
您可以使用传递附加参数args
争论:
def your_funcs(X, fac_a, fac_b):
x, y, a, b = X
f = [np.cos(x) / x - fac_a * a - 0.1,
np.cos(y) / y - fac_b * b - 0.1,
a + b - 1,
1.03 * np.sinc(x) - 1.02 * np.sinc(y)]
return f
sol2 = root(your_funcs, [0.1, 0.1, 0.3, 0.1], args=(0.2, 0.2))
print(sol2.x)
这给你“旧”输出:
[ 1.30301572 1.30987969 0.51530547 0.48469453]
如果你跑
sol2 = root(your_funcs, [0.1, 0.1, 0.3, 0.1], args=(0.4, 0.2))
print(sol2.x)
然后你会收到:
[ 1.26670224 1.27158794 0.34096159 0.65903841]