python - SymPy solve():UnboundLocalError:分配前引用的局部变量“solved_syms”
问题描述
我正在使用 SymPy 求解方程,代码如下。
我做了一个更简单的例子,但是这个问题可能与原始方程有关,所以我会选择在这里发布原始代码而不是简化的代码。
from sympy import *
dP, rho, nu, D, miu, L, Q, Re, eps, f = symbols('dP, rho, nu, D, miu, L, Q, Re, eps, f')
solve([Eq(Re, rho * nu * D / mu),
Eq(L / D, 0.05 * Re),
Eq(L / D, 1.359 * Re ** (1/4)),
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),
Eq(1 / sqrt(f), -1.8 * log ((eps / D / 3.7) ** 1.11 + 6.9 / Re))],
[Re, D, f])
带有错误消息:
UnboundLocalError Traceback (most recent call last)
<ipython-input-13-884b0835e135> in <module>
7 Eq(f, 64 / Re),
8 Eq(1 / sqrt(f), -1.8 * log ((eps / D / 3.7) ** 1.11 + 6.9 / Re))],
----> 9 [Re, D, f])
G:\Program-Files\anaconda3\lib\site-packages\sympy\solvers\solvers.py in solve(f, *symbols, **flags)
1094 solution = _solve(f[0], *symbols, **flags)
1095 else:
-> 1096 solution = _solve_system(f, symbols, **flags)
1097
1098 #
G:\Program-Files\anaconda3\lib\site-packages\sympy\solvers\solvers.py in _solve_system(exprs, symbols, **flags)
1834 return rv
1835
-> 1836 solved_syms = set(solved_syms) # set of symbols we have solved for
1837 legal = set(symbols) # what we are interested in
1838 # sort so equation with the fewest potential symbols is first
UnboundLocalError: local variable 'solved_syms' referenced before assignment
解决方案
那是因为你输入了错误的方程式。尝试:
solve([Eq(Re, rho * nu * D / mu),
Eq(dP, f * (L/D) * (rho * nu ** 2 / 2)),
Eq(1 / sqrt(f), -1.8 * log ((eps / D / 3.7) ** 1.11 + 6.9 / Re))],
[Re, D, f])
并且错误将消失。你输入正确的方程式。
但是你会发现 SymPy 似乎无法解决这个问题。
NotImplementedError: could not solve 9*sqrt(f)*log(58510807926309*2**(11/100)*(dP*eps/(L*f*nu**2*rho))**(111/100)/125000000000000 + 69*dP*mu/(5*L*f*nu**3*rho**2)) + 5
即使经过适当的转换,我们也可以看到Re
和 与f
恒定相关D
,但是,D
满足:
solve(Eq(e**(1 / (u * D ** x)), d/(D**y) + u/D),
D)
除了一切D
都是不变的。
SymPy也无法解决它:
NotImplementedError: multiple generators [D, D**y, e**(D**(-x)/u)]
No algorithms are implemented to solve equation e**(D**(-x)/u) - D**(-y)*d - u/D
可能不存在封闭形式的解决方案。这个方程需要用数值求解。请参阅:https ://math.stackexchange.com/questions/3774718/how-to-solve-this-ln-fracax-fracbxc-frac1u-xv-where?noredirect=1#comment7769877_3774718
所以可以使用nsolve
of sympy
,意思numerical solver
。或者fsolve
ofscipy
也可以。
from sympy import *
L = 4.11 * 10 ** 5
nu = 1
rho = 0.8175
mu = 2.88 * 10 ** -6
dP = 20000
eps = 4.6 * 10 ** -5
Re, D, f = symbols('Re, D, f')
nsolve((Eq(Re, rho * nu * D / mu),
Eq(dP, f * L / D * rho * nu ** 2 / 2),
Eq(1 / sqrt(f), -1.8 * log ( (eps / D / 3.) ** 1.11 + 6.9 / Re))),
(Re, D, f), (1123, -1231, -1000))
哪里(1123, -1231, -1000)
是找到根的初始向量。它给出了:
虚部非常小,都是 10^(-20),所以我们可以认为它们为零,这意味着根都是实数。Re ~ 13602.938,D ~ 0.047922 和 f~0.0057。
推荐阅读
- java - Grakn 安装:不支持 Java 版本
- entity-framework-core - 在 Entity Framework Core 中模仿 ADO.NET 设计
- kubernetes - Kubernetes - ALB 入口控制器 - CertificateNotFound
- python - 在 Transformer 编码器中查询填充掩码和键填充掩码
- system-verilog - UVM 测试结束
- sql-server - 在 SQL 中连接具有不均匀行且不重复的表
- neo4j - Neo4j:删除节点会增加存储文件大小
- python - 计算 LogisticRegression 模型的 AUC
- python - 并排修改 2 个列表中的列表
- c++ - C ++中的二进制搜索分段错误