如何获得sympy来将“乘积和”转换为“理性表达式” p(x)/ q(x)

时间:2019-03-16 11:21:28

标签: python sympy

我试图让sympy生成和输出两个多项式的商:p / q。

import sympy as sp
sp.init_printing()

a,b,c = sp.symbols("a b c")

N=a*b*100 - (a**2) * (b**2)
D=2*(a-b)

V = N / D
print(V)
#Output: (-a**2*b**2 + 100*a*b)/(2*a - 2*b)

# HERE"s WHERE I GET THE RESULT:
g = V.diff(a)
print(g)
#Output: (-2*a*b**2 + 100*b)/(2*a - 2*b)   
             -2*(-a**2*b**2 + 100*a*b)/(2*a - 2*b)**2
# The problem here is that its the sum of two terms

# So I try simplifying it to get it as p/q
h= g.simplify()
print(h)
# Output: b*(a*(a*b - 100) + 2*(a - b)*(-a*b + 50)) / (2*(a - b)**2)
#
# It works to get the function as "p/q", except now
# it didn't expand the numerator and denominator into 
# into a sum of polynomial terms.  how to undo the factoring
# of numerator and denominator while still maintaining the whole
# function as a rational function of the form p/q? 

我想要的是它看起来像这样:

(-2 * a 2 * b 2-4-4 * a * b 3)/(4a + 4b 2)

1 个答案:

答案 0 :(得分:1)

您可以在扩展中使用关键字numer = True或denom = True:

>>> q
(x + 1)*(x + 2)/((x - 2)*(x - 1))

>>> q.expand(numer=True)
(x**2 + 3*x + 2)/((x - 2)*(x - 1))

>>> _.expand(denom=True)
(x**2 + 3*x + 2)/(x**2 - 3*x + 2)

如何解决以上问题:

import sympy as sp
sp.init_printing()

a,b,c = sp.symbols("a b c")

N=a*b*100 - (a**2) * (b**2)
D=2*(a-b)

N / D
_.diff(a)
_.simplify()
_.expand(numer=True)
_.expand(denom=True)
V = _

另一种方法是使用cancel()方法,该方法基本上会做同样的事情(即使名称有点违反直觉):

import sympy as sp
sp.init_printing()

a,b,c = sp.symbols("a b c")

N=a*b*100 - (a**2) * (b**2)
D=2*(a+b)
V = N / D
V.diff(a).cancel()