gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:18:49 27 4
gpt4 key购买 nike

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

我已经尝试过定义返回 sympy 函数的 python 函数的方法,如前所述 here .我也尝试过使用 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)

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

最佳答案

解析器不会自动将给定字符串中的“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)]

关于sympy - 需要能够在 sympy.solve 中使用的 log2(x) 的 sympy 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44223486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com