首页 > 解决方案 > 使用BFGS方法找到几个方程的根

问题描述

我正在尝试使用 BFGS 方法来找到这些方程的根。

  1. a x[0]^2 - b x[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[2] + x[0]) - x[1]^2 == 0

标签: pythonscipy

解决方案


fmin_bfgs正如方法名称所示,BFGS 算法试图找到给定函数的局部最小值。您可以使用查找变量函数的scipy.optimize.root根:F: R^n -> R^nn

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期望 2 个方程用于 2 个变量的函数。添加其他两个方程时,我们有一个包含三个变量的函数,即:

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]


推荐阅读