python - 使用BFGS方法找到几个方程的根
问题描述
我正在尝试使用 BFGS 方法来找到这些方程的根。
- 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中是否有可能,如果可以,如何?另外两个方程就像,
- b*x[2]^2 - x[1]^2 == 0
- d *x[0] x[2] (x[2] + x[0]) - x[1]^2 == 0
解决方案
fmin_bfgs
正如方法名称所示,BFGS 算法试图找到给定函数的局部最小值。您可以使用查找变量函数的scipy.optimize.root
根:F: R^n -> R^n
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
期望 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]
。
推荐阅读
- c# - c# AutoMapper 条件映射条件
- c# - 使用 DocumentFormat.OpenXML 逐段读取 Word 文档
- echarts - Q:Echarts - 一周中不同日子的不同背景颜色(时间x轴)
- javascript - 将 LocalStorage 用于 html 表
- tensorflow - 构建 tensorflow 1.10 成功但包安装失败
- dialogflow-es - 如何在 dialogflow webhook 中显示多个基本卡作为响应
- python - 使 .log 文件持久化
- java - 使用 Selenium WebDriver 和 Java 在新页面上查找 WebElement
- c++ - 在 C++ 中使用宏验证 IP 时出错
- visual-studio - Visual Studio 2017 无法建立数据连接对话框