使用BFGS方法求几个方程的根



我正在尝试用BFGS方法求这些方程的根。

  1. 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中是否可行?如果可行,如何实现?另外两个方程是,

  1. b*x[2]^2 - x[1]^2 == 0
  2. d * x [0]x [2]x (x [2] + [0]) - x [1] ^ 2 = = 0

BFGS算法试图找到给定函数的局部最小值,如方法名称fmin_bfgs所示。可以用scipy.optimize.rootn变量的函数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次幂。

最新更新