给出公式,我想将其转换为Poly对象并最小化生成器的大小。例如,如果我的公式是x^2+x+sqrt(x)
,则期望生成器中只有sqrt(x)
。但是在我的大多数尝试中,生成器同时包含x
和sqrt(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')
只有第三个方法成功了,但是它的代码丑陋且难以自动化(我想对其进行转换,因为我想轻松地提取系数和幂,所以它什么也没有给我)。有没有更好的方法呢?
您可以仅将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。