首页 > 解决方案 > 处理 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)]

标签: pythonsympy

解决方案


您不能动态更新局部变量,包括使用exec. 请参阅exec 如何与本地人合作?.

在您的情况下,您需要做的就是:

sol = sym.solve(eqn, sym.Symbol(some_symbol))

不需要exec,因为不需要创建与符号同名的变量。对象的行为不会因指向它们的变量名称而有所不同。


推荐阅读