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

SymPy solve()报错UnboundLocalError:solved_syms未赋值即引用

解决SymPy求解方程组时的UnboundLocalError问题

问题分析

你碰到的UnboundLocalError: local variable 'solved_syms' referenced before assignment,本质是因为传入SymPy的方程组存在矛盾或无有效解,导致求解器内部流程中断,没能正确初始化solved_syms变量。

仔细看你的方程组,有几个明显的冲突点:

  • 关于L/D的两个方程:Eq(L / D, 0.05 * Re)和Eq(L / D, 1.359 * Re ** (1/4)),这意味着0.05*Re = 1.359*Re^(1/4),结合流体力学的物理逻辑,这组等式本身就存在冲突,会让整个方程组失去可行解。
  • 关于摩擦因子f的两个方程:Eq(f, 64 / Re)是层流场景的公式,而Eq(1 / sqrt(f), -1.8 * log ((eps / D / 3.7) ** 1.11 + 6.9 / Re))是湍流的经验公式,两者适用流态完全不同,同时加入会直接导致方程组无解。

解决步骤

1. 清理矛盾方程

先根据你的实际物理场景筛选合适的方程:

  • 如果是层流场景,保留Eq(f, 64 / Re),移除湍流的对数方程;如果是湍流场景则反之。
  • 只保留一个关于L/D的方程,或者把两个L/D的等式联立成0.05*Re = 1.359*Re^(1/4),先单独求解Re。

2. 分步简化求解

不要一次性把所有方程扔给solve函数,分步求解变量能降低求解器的复杂度,避免内部报错。

这里给出层流场景下的修正代码(同时修复了符号拼写错误:原代码里符号定义的是miu,但第一个方程写的是mu):

from sympy import *

# 定义所有符号
dP, rho, nu, D, miu, L, Q, Re, eps, f = symbols('dP, rho, nu, D, miu, L, Q, Re, eps, f')

# 整理后的无矛盾方程组
eqs = [
    Eq(Re, rho * nu * D / miu),
    Eq(L / D, 0.05 * Re),
    Eq(dP, 32 * miu * L * nu / D ** 2),
    Eq(dP, 128 * miu * L * Q / pi / D ** 2),
    Eq(dP, f * (L/D) * (rho * nu ** 2 / 2)),
    Eq(f, 64 / Re)
]

# 求解目标变量
solution = solve(eqs, [Re, D, f])
print(solution)

3. 跨流态场景的处理建议

如果你的问题需要覆盖层流和湍流两种情况,建议分阶段处理:先通过雷诺数Re的临界值判断流态,再选择对应的摩擦因子公式代入方程组求解,不要把两种流态的公式混在一起。

内容的提问来源于stack exchange,提问作者Limina102

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:32:43