Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 问题:如何将乘积的对数简化为对数之和?_Python_Sympy - Fatal编程技术网

Python 问题:如何将乘积的对数简化为对数之和?

Python 问题:如何将乘积的对数简化为对数之和?,python,sympy,Python,Sympy,为了激发这个问题,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.lo

为了激发这个问题,
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)
问题。如何将其转换为对数之和

相关的:

假设目前还没有具有所需行为的标准函数,我编写了自己的函数,模仿

sp.expand_log(expr, force=True)
这段代码递归地遍历试图定位模式的表达式
log(product)
,并用
sum(log)
替换它们。这也支持多索引求和

代码。

示例。


这是一个有效的问题,尽管在这种情况下,我会求助于良好的手工数学,并在使用Symphy进行进一步处理之前自己完成这一步。当然,如果这是一系列行动的一部分,这将不是一个解决方案。当然,这只是一个“玩具示例”。我尝试使用CAS来避免在大型表达式中手工犯愚蠢的错误,即使这需要更多的时间。z是一个复数,还是\sqrt{1-4jz^2}是?如果在复平面上使用对数的主分支,那么乘积的对数不是对数之和。SymPy正确地避免了犯那个错误。是的,我又犯了同样的错误:)SymPy默认的假设有时对我来说似乎有点困惑。例如,如果
z
j
不通勤怎么办?如果
z
是四元数怎么办?默认情况下,
z
是复杂的这一事实总是被假定的,但我怀疑人类在默认情况下会假定一个变量是真实的,并会指定一个标志
is_complex=True
。嗯,这是实施的细节,我必须习惯它。谢谢你的评论。我编辑了这个问题以显示使用
force
选项的
expand\u 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))