流体力学四方程四未知量Python求解报错及解决方案咨询
问题分析与解决方法
错误原因
你代码里的错误是因为混用了numpy和sympy的函数:numpy的np.log10、np.sqrt只能处理数值类型,无法识别sympy的符号变量(比如Re、f),所以触发了类型错误。另外,这个方程组是非线性的,sympy的符号求解器sym.solve很难直接得到解析解,更适合用数值方法求解。
解决方案:数值求解非线性方程组
我们可以先通过前两个方程减少未知量,将dot_v和Re用v和f表示,然后把问题简化为求解两个未知量的非线性方程组,再用scipy.optimize.fsolve进行数值求解。
步骤1:简化方程组
根据你给出的方程:
- 由
v = dot_v / 0.0113得:dot_v = v * 0.0113 - 由
Re = v*0.12 / 1.1e-6得:Re = v * (0.12 / 1.1e-6)
将这两个关系代入剩下的两个方程,得到只含v和f的方程组:
1/sqrt(f) + 2*log10(2.51/(Re*sqrt(f))) = 0(原方程移项)(f*800*v²)/(0.12*2*9.81) - 8 = 0(原方程移项)
步骤2:数值求解代码
import numpy as np from scipy.optimize import fsolve # 定义残差函数:输入[v, f],返回两个方程的残差值 def equations(x): v, f = x Ac = 0.0113 # 或者用3.14*0.12**2/4计算,结果一致 Re = v * 0.12 / 1.1e-6 # 方程3的残差 res1 = 1 / np.sqrt(f) + 2 * np.log10(2.51 / (Re * np.sqrt(f))) # 方程4的残差 res2 = (f * 800 * v**2) / (0.12 * 2 * 9.81) - 8 return [res1, res2] # 初始猜测值:v初始设为1m/s,f初始设为0.02(管道阻力系数典型值) initial_guess = [1.0, 0.02] # 求解方程组 v_sol, f_sol = fsolve(equations, initial_guess) # 计算dot_v和Re dot_v_sol = v_sol * 0.0113 Re_sol = v_sol * 0.12 / 1.1e-6 # 输出结果 print(f"解得:") print(f"v = {v_sol:.4f} m/s") print(f"dot_v = {dot_v_sol:.6f} m³/s") print(f"Re = {Re_sol:.2f}") print(f"f = {f_sol:.4f}")
代码说明
fsolve需要残差函数(方程等于0的形式),我们把每个方程整理为残差=0的形式传入。- 初始猜测值很重要,这里根据管道流动的典型值给出,你也可以根据实际情况调整。
- 运行后会得到满足所有方程的数值解,结果可以根据需求调整精度。
内容的提问来源于stack exchange,提问作者Kerdiorp
相关产品推荐
相关产品推荐

