You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:57:00