为了激发这个问题,sympy.concrete
有一些有效的工具来操纵符号总和。为了将这些工具应用于符号产品,必须采用对数。但是,直接取对数并不会自动进行转换:
import sympy as sp
sp.init_printing() # display math as latex
z = sp.Symbol('z')
j,k = sp.symbols('j,k')
Prod = sp.Product( (z + sp.sqrt(1-4*j*z**2))**(-1), (j,1,k) )
sp.log(Prod)
给出
所有可能的变体:
sp.log(Prod)
sp.log(Prod).expand()
sp.log(Prod).simplify()
sp.expand_log(sp.log(Prod),force=True)
问题即可。如何将其转换为对数之和?
答案 0 :(得分:2)
假设没有所需行为的标准功能,我自己编写,模仿
的行为sp.expand_log(expr, force=True)
此代码以递归方式覆盖表达式,尝试查找模式log(product)
并将其替换为sum(log)
。这也支持多索引求和。
<强>代码。强>
def concrete_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))
示例强>
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))