Python 如何在Sympy中快速求幂函数的逆

Python 如何在Sympy中快速求幂函数的逆,python,sympy,Python,Sympy,我有一系列的函数依赖项,看起来像这样 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换

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

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,那么计算速度相当快


我想要一些帮助来加速这个过程,或者有更好的方法吗

似乎Symphy将0.8628视为一个有理数(2157/2500),并试图找到代数方程y=0.1222*x**(2157/2500)的所有解,然后将其过滤为实数和正数。不幸的是,这个方程在复平面上有2157个根,它们非常难看。所以这需要很长时间。对于更简单的分数,如0.8=4/5或0.86=43/50,情况并没有那么糟糕(尽管我已经看到0.86的减速)

正如阿斯穆勒所指出的,这是一个错误,解决方案是设置标志rational=False

solve(y - 0.1222*x**0.8628, x, rational=False)
输出为
[11.4314187062073*y**1.15901715345387]
,快速返回


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

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

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

这很有效,谢谢!显然,Symphy这边需要一些优化。您可以使用
solve(y-0.1222*x**0.8628,x,rational=False)
阻止solve转换为有理数。Symphy问题跟踪器中有一个用于更改此默认值的工具。@asmeurer谢谢,我添加了此信息。我还感到奇怪的是,取对数可以加快计算速度,同时将指数保留为有理数。将指数保持为有理数可能会被认为是一个错误(我刚刚在Symphy的开发版本中进行了测试,而日志版本给出了“超过最大递归深度”,因此这里可能会有新的错误)。