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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:54:03