Как найти свободные символы * и * неопределенные функции в выражении SymPy? - PullRequest
1 голос
/ 06 октября 2019

Мне интересно, как найти символы, связанные с функциями , в выражении симпты. Мне известны .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] вручную я бы хотел найти все необходимые символы в выражении.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Следующее получает свободные символы и имена функций 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}
0 голосов
/ 07 октября 2019

На основе принятого решения от @ 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...