Sympy 映射定义的函数

问题描述 投票:0回答:1

我有一种用户定义的语言,包含 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")

请注意,前两种方法的字符串表示形式是相同的。

python sympy
1个回答
0
投票

胜利的副驾驶。 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))
© www.soinside.com 2019 - 2024. All rights reserved.