将有限洛朗级数(洛朗多项式)表示为字典



假设你有一个多元多项式表达式,你想通过每个单项式的次数和系数将其描述为字典。

示例:

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}

我怎样才能优雅地做到这一点?

似乎最简单的方法是将表达式乘以每个变量的足够大的幂,使其成为实际的多项式。将其转换为字典,然后减去我们乘以的幂。设置:

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}  

最新更新