如何使用Python的fsolve求解非线性方程及常见报错排查
报错原因定位
两个核心问题导致你遇到对应的报错:
- 格式匹配问题:
scipy.optimize.fsolve要求目标函数的返回值、输入初始值的维度和类型要匹配,你当前返回的是列表[eq1],单变量求解场景下要么直接返回标量eq1,要么统一用numpy数组格式传递参数和返回值。 - 公式括号逻辑错误:这个虽然不是直接报错原因,但会导致求解结果完全错误,你写的动能项
( (Q²/A2² - Q²/A1² )/2*g )实际运算逻辑是「除以2再乘以g」,但伯努利方程里的动能项应该是「除以(2g)」,这里括号写错了。
修复方案
直接修改目标函数和调用逻辑即可,完整可运行代码如下:
%reset -f from math import * from scipy.optimize import fsolve T = 4 # N·m ω = 1800*(pi/30) # rad/s A1 = .00131 # m^2 A2 = .00055 # m^2 P1 = 12000 # Pa P2 = 200000 # Pa ρ = 1000 # kg/m^3 μ = .89e-3 # N·s/m^2 η = .57 # 效率 g = 9.81 # m/s^2 γ = 9810 # N/m^3 Z2 = .7 # m P_motor = T*ω print(f"电机功率:{P_motor} W") P_pump = P_motor*η print(f"泵有效功率:{P_pump} W") def equations(Q): # 直接返回标量差值,不需要套列表 eq1 = γ*Q*( ((P2-P1)/γ) + ( ( (Q**2/A2**2) - (Q**2/A1**2) )/(2*g) ) + Z2 ) - P_pump return eq1 Q = fsolve(equations, 1.0) print(f"求解得到流量Q:{Q[0]} m³/s")
补充说明
如果要保持和多变量求解一致的写法,也可以统一用数组格式:
- 目标函数里返回
np.array([eq1]) - 初始值传入
np.array([1.0])
两种写法都可以正常运行,不会再出现维度不匹配的报错。
内容的提问来源于stack exchange,提问作者User1234
相关产品推荐
相关产品推荐

