BFGS方法求解多元非线性方程组的实现与异常结果问题咨询
问题解答
此前结果异常原因分析
- 接口使用逻辑错误:
scipy.optimize.fmin_bfgs是无约束最小化算法,本身不直接支持求根。你之前直接传入目标函数a*x[0]^2 - b*x[1]^2,该函数不存在全局最小值:当x[1]绝对值增大、x[0]绝对值不变时,函数值会趋向负无穷,算法会不断往函数值更小的方向迭代,最终得到不符合预期的大数值结果。 - Python语法错误:代码里的
^是位异或运算符,不是幂运算,求平方需要用**2,语法错误也直接导致计算逻辑不符合预期。
能否用BFGS求解多元方程组
可行,需要将多元方程组求根问题转化为无约束最小化问题:构造残差平方和损失函数,把每个方程的残差(等式左侧减右侧)的平方相加,当损失函数值收敛到0时,对应的x就是方程组的根。
具体实现代码
import numpy as np from scipy import optimize # 定义固定参数 a = 35 b = 25 d = 15 # 定义残差平方和损失函数 def loss(x): # 计算三个方程的残差 res1 = a * x[0]**2 - b * x[1]**2 res2 = b * x[2]**2 - x[1]**2 res3 = d * x[0] * x[2] * (x[2] + x[0]) - x[1]**2 # 返回残差平方和作为损失值 return res1**2 + res2**2 + res3**2 # 选择合理初始值(建议选正数,避免收敛到零解[0,0,0]) init_x = [0.8, 1.0, 0.6] # 调用BFGS算法最小化损失 result = optimize.fmin_bfgs(loss, init_x) # 输出结果与验证 print("求解得到的变量值:", result) print("方程1残差:", a * result[0]**2 - b * result[1]**2) print("方程2残差:", b * result[2]**2 - result[1]**2) print("方程3残差:", d * result[0] * result[2] * (result[2] + result[0]) - result[1]**2)
补充说明
- 运行后如果损失值收敛到接近0的数值,说明得到的结果是方程组的近似根。
- 该问题存在多组解,如果需要限定变量为正数,可以改用带约束的
scipy.optimize.fmin_l_bfgs_b函数添加变量边界约束,提升结果符合预期的概率。 - 如果仅需要求解多元方程组,也可以直接使用
scipy.optimize.root函数,底层也支持调用BFGS类算法,无需手动构造损失函数。
内容的提问来源于stack exchange,提问作者Pro
相关产品推荐
相关产品推荐

