我需要接受字符串形式的用户输入,将其解析为一个渐近表达式,然后对变量进行求解。除log2(x)外,大多数用户允许的函数与渐近函数匹配,后者等价于渐近日志(x,2)。
我已经尝试过定义python函数的方法,它像前面提到的这里那样返回渐近函数。我也尝试过使用lambda定义一个渐近函数。这两种方法都可以在替换变量后获得表达式的值,但是如果调用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)引发NotImplementedError。使用lambda返回类似的结果。如果将log2(t+k)替换为log(t+k,2),则上述代码可以工作。我认为这是因为渐近函数是具有许多不同方法的对象,sympy.solve试图调用一个未在我的python函数中实现的方法。我正在寻找一种解决方案,它不需要为我的函数创建一个与日志的实现长度相同的类。是否有一种无需创建一个长类来处理每个可能的调用就可以识别和使用log2的方法?我可以以某种方式创建一个简短的类定义来传递对log(x,2)的任何方法调用吗?
发布于 2017-05-28 13:30:51
解析器不会自动将给定字符串中的"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))输出:[(-t*log(2) + LambertW(exp((t + y)*log(2))*log(2)))/log(2)]
https://stackoverflow.com/questions/44223486
复制相似问题