相关文章推荐
成熟的饭盒  ·  js findIndex ...·  10 月前    · 
瘦瘦的山羊  ·  sqlserver ...·  1 年前    · 
紧张的大蒜  ·  pyqt qthread stop ...·  1 年前    · 
坚强的机器猫  ·  java - Failed to bind ...·  1 年前    · 

如何在SymPy表达式中找到自由符号*和*未定义函数?

2 人关注

我在想,如何找到与 "我 "有关的符号? Functions 在一个同情的表情中。我意识到 .free_symbols , .atoms(Function) 以及 .atoms(AppliedUndef) .下面是一些代码,说明为什么这些都不能满足我的需要。

f1 = Function(r'f_1')
f2 = Function(r'f_2')
c1, x = symbols(r'c_1, x')
expr = c1+f1(x)+f2(x)
print(expr)
# c_1 + f_1(x) + f_2(x)
print(expr.free_symbols)
# {x, c_1}
print(expr.atoms(Function))
# {f_1(x), f_2(x)}
from sympy.core.function import AppliedUndef
print(expr.atoms(AppliedUndef))
# {f_1(x), f_2(x)}

(注释是每个打印行的输出)。所以.free_symbols很好,它给了我c_1x。然而,它没有返回与函数f_1f_2相关的符号(第一个问题:为什么? 它们不是以某种方式免费的吗?).atoms(Function)也没有帮助。它找到了这些函数,但没有返回它们的相关符号(例如:f_1),而是返回了整个函数调用(例如:f_1(x))。

主要问题。我如何在上述表达式中找到符号f_1f_2

背景。我之所以想要这个,是因为我想lambdify以下列方式进行

expr_num = lambdify([c1, f1, f2, x], expr)

但我不想手动给出参数[c1, f1, f2, x],而是想在表达式中找到所有必要的符号。

python
sympy
Wolpertinger
Wolpertinger
发布于 2019-10-06
2 个回答
smichr
smichr
发布于 2019-10-07
已采纳
0 人赞同

下面获得AppliedUndef函数的自由符号和名称。

>>> s = f(x).free_symbols
>>> func = set([i.func for i in f(x).atoms(Function) if isinstance(i, AppliedUndef)])
>>> s | func
{x, f}
    
谢谢你的回答!这可以解决我的问题,但对我来说却不能运行。你的代码与问题中的x和f的定义。 x = symbols(r'x') f = Function(r'f') s = f(x).free_symbols func = set([i.name for i in f(x).atoms(Function) if isinstance(i, AppliedUndef)]) s | func 给出了 AttributeError: 'f' object has no attribute 'name' 。事实上 f(x).name 也会出现同样的错误。
你可能有一个旧版本的SymPy。我更新了答案,用'func'而不是'name',因为后者会给出一个字符串而不是函数'f'。
带有'.func'的新版本甚至可以在我的sympy版本中工作。很好,谢谢!
Wolpertinger
Wolpertinger
发布于 2019-10-07
0 人赞同

根据公认的 solution by @smichr ,这里有一段代码,可以直接附加到问题中的代码上(没有增加任何有趣的内容,只是为了方便)。

f1 = Function(r'f_1')
f2 = Function(r'f_2')
c1, x = symbols(r'c_1, x')
syms_and_funs = set(expr.free_symbols) | set([i.func for i in expr.atoms(Function) if isinstance(i, AppliedUndef)])