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

如何在Python中数值求解超定非线性方程组(4方程2变量)

解决超定非线性方程组的方案

超定方程组不存在精确解,你需要找的是最小二乘最优解——让所有方程的残差平方和最小的(x,y)。scipy.optimize.fsolve仅适用于方程数与变量数相等的场景,改用scipy.optimize.least_squares就能处理超定问题,同时修正原代码里的变量作用域错误:

原代码的两个关键问题

  • c_1和c_2定义在函数外部,依赖x和y,但x/y是equations的参数,会导致计算时误用全局变量而非当前迭代值,必须移到函数内部。
  • fsolve不支持超定系统,直接添加更多方程会触发类型错误。

修改后的完整代码

import numpy as np
import scipy as sp
from scipy.optimize import least_squares

# 定义常量
offset = 1.05
w = 10
R = 0.35

def residual(p):
    x, y = p
    # 将c1、c2移到函数内部,用当前迭代的x/y计算
    c_1 = w + (y / (x * R))
    c_2 = offset - (c_1 / (x * R))
    
    # 计算所有4个方程的残差(补全你的第四个方程)
    eq1 = (c_1 * sp.exp(-y * R * 1.017)) / (y * R) + c_2 - (x * 1.017) / (y * R) - (5.1138 * 2 * np.pi)
    eq2 = (c_1 * sp.exp(-y * R * 2.35)) / (y * R) + c_2 - (x * 2.35) / (y * R) - (2.02457 * 4 * np.pi)
    eq3 = (c_1 * sp.exp(-y * R * 2.683)) / (y * R) + c_2 - (x * 2.683) / (y * R) - (6.0842178 * 4 * np.pi)
    eq4 = # 替换为你的第四个方程表达式
    # 返回残差数组(least_squares要求输入为一维数组)
    return np.array([eq1, eq2, eq3, eq4])

# 初始猜测,建议多试几个不同初始点找稳定解
initial_guess = (1, 1)
result = least_squares(residual, initial_guess)

# 输出结果
print("最优解 x =", result.x[0])
print("最优解 y =", result.x[1])
print("所有方程的残差:", result.fun)
print("求解成功?", result.success)

关键说明

  1. least_squares会自动最小化残差的平方和,找到最适配所有方程的(x,y)。
  2. 关于初始猜测差异大:非线性方程组可能存在多个局部最优解,建议测试多个初始点(比如(0.5,0.5)、(2,2)等),选择残差更小、更符合实际场景的解。
  3. 可调整求解器参数,比如指定method='trf'(默认)或method='dogbox',针对你的方程类型选择更合适的算法。

内容的提问来源于stack exchange,提问作者user21056350

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:25:38