我正在尝试用BFGS方法求这些方程的根。
- ax[0]^2 - bx[1]^2
a = 35; b = 25; d = 15
import numpy as np
from scipy import optimize
def f(x):
return a*x[0]^2 - b*x[1]^2
optimize.fmin_bfgs(f,[0.55,0.65])
我得到的输出是,
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: -2791745.308471
Iterations: 3
Function evaluations: 196
Gradient evaluations: 46
array([ 300.41455833, 2439.35586751])
输出当然是不理想的。我想再加两个方程并求出x[0] x[1] x[2]的根。这在BFGS中是否可行?如果可行,如何实现?另外两个方程是,
- b*x[2]^2 - x[1]^2 == 0
- d * x [0]x [2]x (x [2] + [0]) - x [1] ^ 2 = = 0
BFGS算法试图找到给定函数的局部最小值,如方法名称fmin_bfgs
所示。可以用scipy.optimize.root
求n
变量的函数F: R^n -> R^n
的根:
import numpy as np
from scipy.optimize import root
a = 35; b = 25; d = 15
def F(x):
return np.array([a*x[0]**2 - b*x[1]**2, 0])
# res.x contains your root
res = root(F, x0=np.ones(2))
为了求解a*x[0]**2 - b*x[1]**2 == 0
,我们添加了方程0 == 0
,因为root
期望两个变量的函数有两个方程。当你的另外两个方程相加时,我们得到一个三个变量的函数,即:
def F(x):
eq1 = a*x[0]**2 - b*x[1]**2
eq2 = b*x[1]**2 - x[0]**2
eq3 = d*x[0]*x[2]*(x[2] + x[0]) - x[1]**2
return np.array([eq1, eq2, eq3])
# res.x contains your root
res = root(F, x0=np.ones(3))
还请注意,在Python中,^
操作符表示按位异或。用x[0]**2
表示x[0]
的2次幂。