首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ln((exp(x)+1)/exp(x))简化为log(1+exp(-x))?

如何将ln((exp(x)+1)/exp(x))简化为log(1+exp(-x))?
EN

Stack Overflow用户
提问于 2016-08-10 17:50:58
回答 2查看 1.4K关注 0票数 2

如果我使用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))那样的形式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-11 07:01:16

您可以更直接地使用sympy.polys.polytools.cancel(),它可以作为.cancel()表达式中的一个方法使用。

代码语言:javascript
复制
>>> from sympy.abc import x
>>> from sympy import *
>>> my_expr = log((exp(x)+1)/exp(x))
>>> my_expr.cancel()
log(1 + exp(-x))

这就是在simplify()中简化表达式的工作。

一个非常幼稚的基准:

代码语言:javascript
复制
>>> 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

编辑:这不是一个稳定的解决方案,我建议您看看阿斯迈勒的回答建议使用展开()的地方。

票数 3
EN

Stack Overflow用户

发布于 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) (它们在内部都是以相同的方式表示的)。

代码语言:javascript
复制
In [1]: log((exp(x)+1)/exp(x)).expand()
Out[1]:
   ⎛     -x⎞
log⎝1 + ℯ  ⎠

教程中有一些简化函数的指南。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38880320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档