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

2024-10-02 14:21:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何在一个sympy表达式中找到与Functions相连的符号。我知道^{}^{}以及^{}。下面是一些代码来说明为什么这些都不能满足我的需要。你知道吗

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?你知道吗

背景:我之所以要这样做,是因为我想用以下方式^{}

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

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


Tags: 函数free表达式符号functionfunctionsf2f1
2条回答

以下是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}

基于公认的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)

相关问题 更多 >