如何使用Python求解含四个未知量的四元非线性方程组
四元非线性方程组求解Python脚本
依赖安装
使用前需要先安装依赖库:
pip install numpy scipy
求解逻辑
- 将4个未知量
Qcu、Qzn、Ccu、Czn打包为一维数组作为求解变量 - 定义残差函数返回4个方程的计算结果,要求全部接近0
- 给定合理初始猜测值调用
fsolve求解,支持单个V值计算和0~300区间V的批量计算
完整代码
import numpy as np from scipy.optimize import fsolve # 定义方程组残差函数:x = [Qcu, Qzn, Ccu, Czn], V为自变量 def equations(x, V): Qcu, Qzn, Ccu, Czn = x f1 = (Qcu * Czn) / (Qzn * Ccu) - 3 f2 = Qzn + Qcu - 3.5 f3 = Czn + Qzn * V - 0.189 f4 = Ccu + Qcu * V - 0.917 return [f1, f2, f3, f4] # ------------------- 单个V值求解示例 ------------------- if __name__ == "__main__": # 可自定义测试的V值 V_test = 10 # 初始猜测值,可调整以提升收敛性 init_guess = [1.0, 2.5, 0.5, 0.1] # 求解 solution = fsolve(equations, init_guess, args=(V_test,)) Qcu, Qzn, Ccu, Czn = solution # 输出结果 print(f"V = {V_test} 时求解结果:") print(f"Qcu = {Qcu:.6f}") print(f"Qzn = {Qzn:.6f}") print(f"Ccu = {Ccu:.6f}") print(f"Czn = {Czn:.6f}") # 校验残差,判断解是否有效 residual = equations(solution, V_test) print(f"方程残差:{residual}") # ------------------- 可选:批量遍历V=0~300求解 ------------------- # if __name__ == "__main__": # # 步长为1,可根据需求调整 # V_arr = np.arange(0, 301, 1) # init_guess = [1.0, 2.5, 0.5, 0.1] # results = [] # for V in V_arr: # try: # sol, infodict, ier, mesg = fsolve(equations, init_guess, args=(V,), full_output=True) # # 校验是否收敛 # if ier == 1: # Qcu, Qzn, Ccu, Czn = sol # results.append([V, Qcu, Qzn, Ccu, Czn]) # # 用当前解作为下一次初值,提升收敛效率 # init_guess = sol # else: # print(f"V={V} 求解不收敛,错误信息:{mesg}") # except ZeroDivisionError: # print(f"V={V} 出现除零错误,跳过") # # 导出结果到csv文件 # # np.savetxt("四元方程组求解结果.csv", results, delimiter=",", header="V,Qcu,Qzn,Ccu,Czn", comments="")
注意事项
- 初始猜测值的选择对fsolve求解成功率影响极大,如果出现求解不收敛的情况,可根据方程组的物理意义调整初始值
- 求解完成后建议校验残差的绝对值,通常小于1e-6可认为解是有效的
- 批量求解时复用前一次的收敛结果作为初值,可大幅提升求解效率和收敛概率
内容的提问来源于stack exchange,提问作者erkvos
相关产品推荐
相关产品推荐

