如果我使用simplify()函数,log((exp(x)+1)/exp(x))确实简化为log(1+exp(-x)),然而,当我阅读文档时,简化函数是“可能不必要的慢”,我尝试了其他简化方法,但它们都不起作用,所以我想知道如何在不调用ln((exp(x)+1)/exp(x)) ()的情况下将ln((exp(x)+1)/exp(x))简化成像这个log(1+exp(-x))那样的形式。
发布于 2016-08-11 07:01:16
您可以更直接地使用sympy.polys.polytools.cancel(),它可以作为.cancel()表达式中的一个方法使用。
>>> from sympy.abc import x
>>> from sympy import *
>>> my_expr = log((exp(x)+1)/exp(x))
>>> my_expr.cancel()
log(1 + exp(-x))这就是在simplify()中简化表达式的工作。
一个非常幼稚的基准:
>>> import timeit
>>> %timeit my_expr.simplify()
100 loops, best of 3: 7.78 ms per loop
>>> %timeit my_expr.cancel()
1000 loops, best of 3: 972 µs per loop编辑:这不是一个稳定的解决方案,我建议您看看阿斯迈勒的回答建议使用展开()的地方。
发布于 2016-08-11 20:11:12
要使用的确切函数取决于所处理的表达式的一般形式。cancel显然起作用,但可能只是偶然的。通常,cancel从分子和分母(如cancel((x**2 - 1)/(x - 1)) -> x + 1 )中取消公共因素。我认为它只是在这里起作用,因为它用exp(-x)来表示表达式。如果它使用exp(x),就不会简化,因为(x + 1)/x没有任何共同的因素。这可能是您在不同版本中看到来自cancel的不同结果的原因。有关详细信息,请参阅本期。
对于这个表达式,我将使用展开()(或更有针对性的expand_mul)。expand将把分母分布在分子上,即(exp(x) + 1)/exp(x)将成为exp(x)/exp(x) + 1/exp(x)。然后,SymPy自动将exp(x)/exp(x)取消为1,并将1/exp(x)转换为exp(-x) (它们在内部都是以相同的方式表示的)。
In [1]: log((exp(x)+1)/exp(x)).expand()
Out[1]:
⎛ -x⎞
log⎝1 + ℯ ⎠在教程中有一些简化函数的指南。
https://stackoverflow.com/questions/38880320
复制相似问题