首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在SymPy表达式中找到空闲符号*和*未定义函数?

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

Stack Overflow用户
提问于 2019-10-06 13:27:46
回答 2查看 737关注 0票数 2

我想知道如何在一个交感表达式中找到与Functions相关的符号。我知道.free_symbols.atoms(Function).atoms(AppliedUndef)。这里有一些代码来说明为什么没有一个能满足我的需要。

代码语言:javascript
复制
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

代码语言:javascript
复制
expr_num = lambdify([c1, f1, f2, x], expr)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-06 15:00:23

以下内容获得AppliedUndef函数的自由符号和名称:

代码语言:javascript
复制
>>> s = f(x).free_symbols
>>> func = set([i.func for i in f(x).atoms(Function) if isinstance(i, AppliedUndef)])
>>> s | func
{x, f}
票数 1
EN

Stack Overflow用户

发布于 2019-10-07 15:43:27

基于已接受的solution by @smichr,下面有一段代码可以直接附加到问题中的代码中(为了方便起见,没有添加任何有趣的内容):

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58257706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档