我有一种用户定义的语言,包含 python 语法中的数学表达式,但具有包装特殊的数学函数,例如 代替
sqrt(y) - x
我有_math.foo(y) - x
我希望能够在这些字符串上使用 sympy.parse_expr 并以相同的方式处理它们。 我尝试了两种不同的方法,但尚未得到正确的结果:
import sympy
import math
import sympy.utilities
from sympy.utilities.lambdify import implemented_function
class Math:
foo = math.sqrt
bar = implemented_function("sqrt", math.sqrt)
input = "sqrt(y) - x"
input = "_math.bar(y) - x"
input = "_math.foo(y) - x"
expr = sympy.parse_expr(input, {"_math" : Math})
print(expr)
print(sympy.solveset(expr, sympy.Symbol("y")))
print(sympy.solveset(expr, sympy.Symbol("x")))
与
input = "sqrt(y) - x"
我确实得到了结果:
-x + sqrt(y)
{x**2}
{sqrt(y)}
这就是我想要的结果。 方法
input = "_math.bar(y) - x"
给我输出:
-x + sqrt(y)
ConditionSet(y, Eq(-x + sqrt(y), 0), Complexes)
{sqrt(y)}
我不太明白,但和上面的不一样 和最后一种方法
input = "_math.foo(y) - x"
在 eval 中给我 TypeError("Cannot convert expression to float")
。
请注意,前两种方法的字符串表示形式是相同的。
胜利的副驾驶。 SymPy 实际上具有可直接用于符号的数学函数(只是不是一个很好的文档)。 可以组合其他不能直接使用的方法。
class Math:
foo = sympy.sqrt
@staticmethod
def mydiv(a: Any, b: Any) -> Any:
"""sympy division operation"""
return sympy.Mul(a, sympy.Pow(b, -1))