我想知道如何在一个交感表达式中找到与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_1
和x
。但是,它不返回与函数f_1
和f_2
相关联的符号。(第一个问题:为什么?它们不是自由的吗?).atoms(Function)
也无济于事。它找到函数,但不返回它们相关联的符号(例如f_1
),而是返回整个函数调用(例如f_1(x)
)。
的主要问题:,如何在上面的表达式中找到符号f_1
和f_2
?
背景:我之所以想这样做,是因为我想以以下方式进行lambdify
expr_num = lambdify([c1, f1, f2, x], expr)
但是,我不想手动地给出参数[c1, f1, f2, x]
,我想在表达式中找到所有必要的符号。
发布于 2019-10-06 15:00:23
以下内容获得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}
发布于 2019-10-07 15:43:27
基于已接受的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)])
print(syms_and_funs)
# {x, f_2, f_1, c_1}
expr_num = lambdify(syms_and_funs, expr)
https://stackoverflow.com/questions/58257706
复制相似问题