2016-03-04 23 views
3

我有一系列看起來像這樣的函數依賴關係。如何在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交換更簡單的權力,如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指出的那樣,這是一個known issue並將該溶液是設置標誌理性=假

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)]。有趣的是,這種方法保持指數是理性的。

+0

This Works,thank you!顯然,Sympy方面需要進行一些優化。 – tiam

+0

您可以使用'solve(y - 0.1222 * x ** 0.8628,x,rational = False)'來防止求解轉換爲有理數。 – asmeurer

+0

SymPy問題跟蹤器中有一個[issue](https://github.com/sympy/sympy/issues/8515)更改此默認值。 – asmeurer