如何在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)
关键说明
least_squares会自动最小化残差的平方和,找到最适配所有方程的(x,y)。- 关于初始猜测差异大:非线性方程组可能存在多个局部最优解,建议测试多个初始点(比如
(0.5,0.5)、(2,2)等),选择残差更小、更符合实际场景的解。 - 可调整求解器参数,比如指定
method='trf'(默认)或method='dogbox',针对你的方程类型选择更合适的算法。
内容的提问来源于stack exchange,提问作者user21056350
相关产品推荐
相关产品推荐

