python - 处理 exec 内部函数以进行符号计算
问题描述
我试图在一个创建变量的函数中包含一个 exec,以便使用一个简单的符号来求解一个方程。但是,由于解决方案是在 exec 内部创建的,因此会产生错误:UnboundLocalError: local variable 'sol' referenced before assignment
import sympy as sym
import sympy.parsing.latex as sym_tex # requires sympy 1.2
def symbolic_solver(equation, unknown, some_symbol='x'):
expr = equation.replace(unknown, some_symbol)
eqn = sym_tex.parse_latex(expr)
exec('%s = sym.Symbol("%s")'%(some_symbol, some_symbol))
try: # Sometimes Sympy throws a notimplemented error when it can not solve
exec('sol = sym.solve(eqn, %s)'%(some_symbol))
except NotImplementedError:
print('SymPy could not solve the equation.')
print('Set the solution manually.')
return sol
equation = 'm\\cdot g\\cdot h_A + \\frac{1}{2}\\cdot m\\cdot {v_A}^2 = m\\cdot g\\cdot h_B + \\frac{1}{2}\\cdot m\\cdot {v_B}^2'
unknown = 'v_B'
sol = symbolic_solver(equation, unknown)
我必须替换方程中的未知变量的原因是因为 SymPy 求解器无法处理可能有下标的变量,例如v_B
. 无论如何,当我不使用函数时,只需将其作为脚本运行,它就会产生以下解决方案:
Solution symbolic: [-sqrt(2*g*h_A - 2*g*h_B + v_A**2), sqrt(2*g*h_A - 2*g*h_B + v_A**2)]
解决方案
您不能动态更新局部变量,包括使用exec
. 请参阅exec 如何与本地人合作?.
在您的情况下,您需要做的就是:
sol = sym.solve(eqn, sym.Symbol(some_symbol))
不需要exec
,因为不需要创建与符号同名的变量。对象的行为不会因指向它们的变量名称而有所不同。
推荐阅读
- reactjs - 更改输入的状态会延迟一个字符(useState 挂钩)
- javascript - 从使用 document.createElement() 的数组中创建的输入字段中读取值
- spring - Spring Boot - RabbitMQ - 将消息内容类型从八位字节流更改为 json
- java - 如何在 IntelliJ 中配置 Spring Boot Run Configuratipon
- python - 如何将 Python 环境添加到给定文件/模块 conda/anaconda 的路径
- serialization - 在 Ember.js 中使用序列化程序来支持不同的有效负载密钥的最佳方法是什么?
- sql - 使用带有记录集的 Access VBA 和 SQL 添加和删除记录
- dax - 如何计算 DAX 中总值的百分比(Power BI Desktop)
- node.js - 如何在 AWS Lambda 函数中使用 ImageMagick `drawtext` 方法?
- javascript - 没有 JS 的 SPA 路由使用 @document