Выразите конечный ряд Лорана (многочлен Лорана) в виде словаря - PullRequest
0 голосов
/ 07 ноября 2018

Предположим, у вас есть многомерное полиномиальное выражение, и вы хотите охарактеризовать его как словарь по степени и коэффициенту каждого из мономов.

Пример:

p=Poly(3*x1**2 -  x1*x2 + 5*x2 +7)

Вы хотите:

dic={"(2,0)":3 , "(1,1)":-1 , "(0,1)": 5 , "(0,0)": 7}

p.as_dict() хорошо решает проблему.

Теперь у вас та же проблема, но теперь многомерное полиномиальное выражение допускает отрицательные показатели (конечный ряд Лорана).

Так что если у вас есть:

p=Poly(3*x1**-2 -  x1*x2 + 5*x2)

p.as_dict() напечатает:

{(0, 0, 2): 3, (0, 1, 0): 5, (1, 1, 0): -1}

Но я хотел бы иметь это:

{(-2, 0): 3, (0, 1): 5, (1, 1): -1}

Как мне добиться этого элегантным способом?

1 Ответ

0 голосов
/ 07 ноября 2018

Кажется, проще всего умножить выражение на достаточно большую степень каждой переменной, чтобы оно стало фактическим полиномом. Преобразуйте это в словарь, затем вычтите силу, на которую мы умножены. Настройка:

x1, x2 = symbols('x1 x2')
syms = (x1, x2)    #  specify the desired order of symbols: do not rely on default order being what you want
expr = 3*x1**(-2) - x1*x2 + 5*x2  # just an expression so far, not a polynomial

Основной код:

d = max(Poly(expr).degree_list())
prelim = Poly(expr*prod([x**d for x in syms]), syms).as_dict()
final = {tuple(deg - d for deg in key): prelim[key] for key in prelim}

Объяснение: Poly(expr) создает многочлен от переменных x1, x2, 1 / x1. Позволяя d - максимальная степень в каждой переменной, гарантируется, что x1**d * x2**d * expr не будет иметь отрицательных степеней. Этот продукт сделан полиномом в (x1, x2) и преобразован в «предварительный» словарь: {(0, 2): 3, (2, 3): 5, (3, 3): -1}. Затем словарь корректируется путем вычитания d везде. Конечный результат:

{(-2, 0): 3, (0, 1): 5, (1, 1): -1}  
...