需要能够在 sympy.solve 中使用的 log2(x) 的 sympy 函数

Kyl*_*leV 2 sympy

我需要以字符串的形式接受用户输入,将其解析为一个 sympy 表达式,然后求解一个变量。除了 log2(x) 等价于 sympy 的 log(x, 2) 之外,大多数用户允许的函数都匹配 sympy 函数。

我试着定义为提到,返回sympy功能的Python函数的方法在这里。我也尝试过使用 lambda 定义一个 sympy 函数。这两种方法都可以在用变量替换数字后获取表达式的值,但如果调用 sympy.solve 来求解变量,则会产生错误。例如:

import sympy
from sympy.parsing.sympy_parser import parse_expr
def log2(x):
    return sympy.log(x, 2)
t, k, y = sympy.symbols('t k y')
parsed = parse_expr("log2(t + k) + k - y")
sympy.solve(parsed, k)
Run Code Online (Sandbox Code Playgroud)

引发 NotImplementedError。使用 lambda 返回类似的结果。如果 log2(t+k) 替换为 log(t+k,2),则上述代码有效。我认为这是因为 sympy 函数是具有许多不同方法的对象,并且 sympy.solve 尝试调用未在我的 python 函数中实现的方法。我正在寻找一种解决方案,它不需要为我的函数创建一个与log的实现长度相同的类。有没有办法让 sympy 识别并使用 log2 而不创建一个长类来处理每个可能的调用?我可以以某种方式创建一个简短的类定义,将任何方法调用传递给 log(x, 2) 吗?

小智 5

解析器不会自动将给定字符串中的“log2”与您创建的函数匹配。你必须明确地告诉它这是要做什么,使用local_dict={"log2": log2}.

或者直接将 lambda 放入 local_dict 中:

import sympy
from sympy.parsing.sympy_parser import parse_expr
t, k, y = sympy.symbols('t k y')
parsed = parse_expr("log2(t + k) + k - y", local_dict={"log2": lambda x: sympy.log(x, 2)})
print(sympy.solve(parsed, k))
Run Code Online (Sandbox Code Playgroud)

输出: [(-t*log(2) + LambertW(exp((t + y)*log(2))*log(2)))/log(2)]