Reputation: 6617
I'm trying to get sympy to produces an output that is the quotient of two polynomials: 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 it's 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?
What I want is for it to look like this:
(-2*a**2*b**2 - 4*a*b**3) / (4a + 4b**2)
Upvotes: 0
Views: 438
Reputation: 6617
You can use the keyword numer=True or denom=True with expand:
>>> 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)
How to fix above:
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 = _
Another way is to use the cancel() method which basically does the same thing (even though the name is somewhat counter-intuitive):
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()
Upvotes: 2