Sympy: How To Simplify Logarithm Of Product Into Sum Of Logarithms?
To motivate the question, sympy.concrete has some efficient tools to manipulate symbolic sums. In order to apply these tools to symbolic products, one has to take a logarithm. Howe
Solution 1:
Assuming that there is no standard function with desired behaviour yet, I wrote my own, mimicking the behaviour of
sp.expand_log(expr, force=True)
This code recursively goes over expression trying to locate patterns log(product)
and replaces them by sum(log)
. This also supports multi-index summation.
Code.
defconcrete_expand_log(expr, first_call = True):
import sympy as sp
if first_call:
expr = sp.expand_log(expr, force=True)
func = expr.func
args = expr.args
if args == ():
return expr
if func == sp.log:
if args[0].func == sp.concrete.products.Product:
Prod = args[0]
term = Prod.args[0]
indices = Prod.args[1:]
return sp.Sum(sp.log(term), *indices)
return func(*map(lambda x:concrete_expand_log(x, False), args))
Example.
import sympy as sp
from IPython.display import display
sp.init_printing() # display math as latex
z = sp.Symbol('z')
j,k,n = sp.symbols('j,k,n')
Prod = sp.Product( (z + sp.sqrt(1-4*j*z**2))**(-1), (j,0,k))
expr = sp.log(z**(n-k) * (1 - sp.sqrt((1 - 4*(k+2)*z**2)/(1-4*(k+1)*z**2)) ) * Prod)
display(expr)
display(concrete_expand_log(expr))
Post a Comment for "Sympy: How To Simplify Logarithm Of Product Into Sum Of Logarithms?"