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
相关产品推荐
相关产品推荐

