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

流体力学四方程四未知量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. 1/sqrt(f) + 2*log10(2.51/(Re*sqrt(f))) = 0(原方程移项)
  2. (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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:13:16