SymPy solve(): UnboundLocalError: 局部变量

我正在使用 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


喵喵时光机
浏览 124回答 1
1回答

慕的地6264312

那是因为你输入了错误的方程式。尝试:solve([Eq(Re,&nbsp;rho&nbsp;*&nbsp;nu&nbsp;*&nbsp;D&nbsp;/&nbsp;mu), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eq(dP,&nbsp;f&nbsp;*&nbsp;(L/D)&nbsp;*&nbsp;(rho&nbsp;*&nbsp;nu&nbsp;**&nbsp;2&nbsp;/&nbsp;2)), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eq(1&nbsp;/&nbsp;sqrt(f),&nbsp;-1.8&nbsp;*&nbsp;log&nbsp;((eps&nbsp;/&nbsp;D&nbsp;/&nbsp;3.7)&nbsp;**&nbsp;1.11&nbsp;+&nbsp;6.9&nbsp;/&nbsp;Re))], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Re,&nbsp;D,&nbsp;f])并且错误将消失。您输入正确的方程式。但是你会发现 SymPy 似乎无法解决这个问题。NotImplementedError:&nbsp;could&nbsp;not&nbsp;solve&nbsp;9*sqrt(f)*log(58510807926309*2**(11/100)*(dP*eps/(L*f*nu**2*rho))**(111/100)/125000000000000&nbsp;+&nbsp;69*dP*mu/(5*L*f*nu**3*rho**2))&nbsp;+&nbsp;5即使经过适当的转换,我们也可以看到Re和f与 常量相关D,然而,D满足:solve(Eq(e**(1&nbsp;/&nbsp;(u&nbsp;*&nbsp;D&nbsp;**&nbsp;x)),&nbsp;d/(D**y)&nbsp;+&nbsp;u/D), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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的sympy,意思是numerical solver。或者fsolve的scipy也可以。from sympy import *L = 4.11 * 10 ** 5nu = 1rho = 0.8175mu = 2.88 * 10 ** -6dP = 20000eps = 4.6 * 10 ** -5Re, D, f = symbols('Re, D, f')nsolve((Eq(Re, rho * nu * D / mu),&nbsp; &nbsp; &nbsp; &nbsp;Eq(dP, f * L / D * rho * nu ** 2 / 2),&nbsp; &nbsp; &nbsp; &nbsp;Eq(1 / sqrt(f), -1.8 * log ( (eps / D / 3.) ** 1.11 + 6.9 / Re))),&nbsp; &nbsp; &nbsp; (Re, D, f), (1123, -1231, -1000))哪里(1123, -1231, -1000)是寻找根的初始向量。它给出了:虚部很小,都是10^(-20),所以我们可以认为它们为零,这意味着根都是实数。Re ~ 13602.938,D ~ 0.047922 和 f~0.0057。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python