如何快速反转Sympy中的电源功能

tia*_*iam 4 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)
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为20分钟后内核仍然很忙.我注意到,如果我用0.8628交换更简单的功率,比如0.8或甚至0.86,那么计算工作得非常快.

我想在加快这方面提供一些帮助,或者可能有更好的方法?

小智 5

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

正如asmeurer所指出的,这是一个已知问题,解决方案是设置标志rational = False

solve(y - 0.1222*x**0.8628, x, rational=False)
Run Code Online (Sandbox Code Playgroud)

输出[11.4314187062073*y**1.15901715345387]很快就会返回.


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

solve(log(y) - log(0.1222*x**0.8628), x)
Run Code Online (Sandbox Code Playgroud)

[11.4314187062073*y**(2500/2157)]马上回来.有趣的是,这种方法将指数维持为理性.