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

时间:2016-03-04 10:35:00

标签: python sympy

我有一系列功能依赖,看起来像这样。

y = 0.1222 * x ** 0.8628

我想使用sympy将x作为y的函数。 在互联网上搜索我看到<div id="timeline"> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> <div class="timebox"></div> </div> <div id="timelinehours"> <div class="timeboxhour" >0</div> <div class="timeboxhour" >1</div> <div class="timeboxhour" >2</div> <div class="timeboxhour" >3</div> <div class="timeboxhour" >4</div> <div class="timeboxhour" >5</div> <div class="timeboxhour" >6</div> <div class="timeboxhour" >7</div> <div class="timeboxhour" >8</div> <div class="timeboxhour" >9</div> <div class="timeboxhour" >10</div> <div class="timeboxhour" >11</div> <div class="timeboxhour" >12</div> <div class="timeboxhour" >13</div> <div class="timeboxhour" >14</div> <div class="timeboxhour" >15</div> <div class="timeboxhour" >16</div> <div class="timeboxhour" >17</div> <div class="timeboxhour" >18</div> <div class="timeboxhour" >19</div> <div class="timeboxhour" >20</div> <div class="timeboxhour" >21</div> <div class="timeboxhour" >22</div> <div class="timeboxhour" >23</div> </div>可用于此。 所以我试过

solve

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

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

1 个答案:

答案 0 :(得分: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,解决方法是设置标志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)]。有趣的是,这种方法将指数维持为理性。