Есть ли способ обработки параметров постоянной функции в SymPy? - PullRequest
2 голосов
/ 01 апреля 2020

Я генерирую функции symboli c и использую SymPy для их упрощения. Теперь я хотел бы найти способ «упростить» символы, которые представляют постоянные параметры в функции, которая еще не установлена. Например, если я генерирую полином, я мог бы сгенерировать такую ​​строку

C*x*x + C*x + C*x + C,

, которую SymPy превратит в

C*x^2 + 2*C*x + C.

Теперь я хотел бы найти способ получить this:

C*x^2 + C*x + C.

Другими словами, есть ли способ сообщить SymPy, что определенный символ является постоянным и неопределенным, так что

C+C -> C, C*C -> C, etc. Or more generally: f(C) = C, for any f(C)?

Моя первая идея состояла в том, что, возможно, существует предположение (например, Q.positive), которое описывает это свойство, и я мог бы использовать уточнение. Тем не менее, это не так. Если ничего другого, я уверен, что есть способ использовать preorder_traversal, чтобы делать то, что я хочу, но я не могу придумать стратегию, чтобы сделать это. Любая помощь или идеи приветствуются.

1 Ответ

2 голосов
/ 01 апреля 2020

Возможно, что-то вроде этого (применяется к выражению, которое было полностью раскрыто):

def consim(eq, *v):
    con = numbered_symbols('c', cls=Dummy)
    reps = {}
    for i in preorder_traversal(eq):
        if i.is_Mul or i.is_Add:
            c, d = i.as_independent(*v)
            if c != i.identity and c.free_symbols:
                c = reps.setdefault(c, next(con))
    return eq.subs(reps)


>>> from sympy.abc import a, b, c, d, x
>>> eq = 2*a*x**2 + b*c*x + d + e
>>> consim(eq, x)
         2
c₀ + c₁⋅x  + c₂⋅x

Возможно, вам нужны пронумерованные символы, а не все символы одинаковые.

...