我有一系列功能依赖,看起来像这样。
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,那么计算工作就会很快。
我想在加快速度方面提供一些帮助,或者可能有更好的方法?
答案 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)]
。有趣的是,这种方法将指数维持为理性。