【问题标题】:How to quickly invert a power function in Sympy如何在 Sympy 中快速反转幂函数
【发布时间】:2016-03-08 05:25:03
【问题描述】:

我有一系列看起来像这样的函数依赖。

y = 0.1222**x**0.8628

我想使用 sympy 得到 x 作为 y 的函数。 搜索互联网我看到solve 可以用于此。 所以我尝试了

x = Symbol('x', real=True, positive=True)
y = Symbol('y', real=True, positive=True)

solve(y - 0.1222*x**0.8628, x)

但是,这不起作用,因为 20 分钟后内核仍然忙碌。 我注意到,如果我将 0.8628 换成更简单的幂,比如 0.8 甚至 0.86,那么计算会很快进行。

我需要一些帮助来加快速度,或者也许有更好的方法?

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    似乎 Sympy 将 0.8628 视为有理数 (2157/2500) 并尝试在过滤之前找到代数方程 y = 0.1222*x**(2157/2500) 的所有解他们下降到真实和积极的。不幸的是,这个方程在复平面上有 2157 个根,而且非常难看。所以这需要很长时间。对于更简单的分数,例如 0.8 = 4/5 或 0.86 = 43/50,它并没有那么糟糕(尽管我已经看到 0.86 的放缓)。

    正如 asmeurer 指出的,这是known issue,解决方案是设置标志rational=False

    solve(y - 0.1222*x**0.8628, x, rational=False)
    

    输出为[11.4314187062073*y**1.15901715345387],很快返回。


    我发现的另一个解决方法是引入对数,这迫使 Sympy 放弃方程的代数方法。

    solve(log(y) - log(0.1222*x**0.8628), x)
    

    立即返回[11.4314187062073*y**(2500/2157)]。有趣的是,这种方法将指数保持为有理数。

    【讨论】:

    • 这行得通,谢谢!显然,Sympy 这边需要进行一些优化。
    • 您可以使用solve(y - 0.1222*x**0.8628, x, rational=False) 阻止solve 转换为有理数。
    • 在 SymPy 问题跟踪器中有一个 issue 来更改此默认值。
    • @asmeurer 谢谢,我添加了这些信息。我还觉得奇怪的是,取对数会加快计算速度,同时 保留 指数作为有理数。
    • 保持指数有理可能应该被认为是一个错误(我刚刚在 SymPy 的开发版本中进行了测试,并且日志版本给出了“超出最大递归深度”,因此这里可能存在新错误)。
    猜你喜欢
    • 2018-09-13
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多