如何减小sympy.Poly中生成器的大小?

问题描述 投票:0回答:1

给出公式,我想将其转换为Poly对象并最小化生成器的大小。例如,如果我的公式是x^2+x+sqrt(x),则期望生成器中只有sqrt(x)。但是在我的大多数尝试中,生成器同时包含xsqrt(x)

from sympy import *
print('first attempt:',Poly('x^2+x+sqrt(x)'))
x=Symbol('x', positive=True)
print('second attempt:',Poly(x**2+x+sqrt(x)))
print('third attempt:',str(Poly({1:1,2:1,4:1},gens=S('sqrt(x)'))))
first attempt: Poly(x**2 + x + (sqrt(x)), x, sqrt(x), domain='ZZ')
second attempt: Poly(x**2 + x + (sqrt(x)), x, sqrt(x), domain='ZZ')
third attempt: Poly((sqrt(x))**4 + (sqrt(x))**2 + (sqrt(x)), sqrt(x), domain='ZZ')

只有第三个方法成功了,但是它的代码丑陋且难以自动化(我想对其进行转换,因为我想轻松地提取系数和幂,所以它什么也没有给我)。有没有更好的方法呢?

python generator sympy poly
1个回答
0
投票

您可以仅将sqrt(x)替换为y或(使用符号骗子)将其替换为名为sqrt(y)(或sqrt(y)的符号,以证明其有效):]]

>>> from symyp.abc import x, y
>>> from sympy import Symbol
>>> (x**2+x+sqrt(x)).subs(sqrt(x), y)
y**4 + y**2 + y
>>> (x**2+x+sqrt(x)).subs(sqrt(x), Symbol('sqrt(y)'))
sqrt(y)**4 + sqrt(y)**2 + sqrt(y)

这两种形式现在都具有单个符号,并且将使用单个生成器创建一个Poly。

© www.soinside.com 2019 - 2024. All rights reserved.