在同情中简化根源

时间:2015-08-14 18:24:53

标签: python math sympy symbolic-math

我在sympy中有以下代码

from sympy import *
x,y,G=symbols('x y G')
G=x**(3./2.) - y
g_inv=solve(G, x)
if len(g_inv)>1: g_inv=g_inv[-1]
dginvdy=diff(g_inv, y)

问题在于这给了我

     ____
  3 ╱  2 
2⋅╲╱  y  
─────────
   3⋅y

而不是我预期的2*y**(-1./3)/3。我尝试了simplify()甚至cancel(),但没有运气。另外,如果我使用real=True定义变量,由于某种原因我无法用solve将其反转。如果我只将y定义为真实的我

2⋅sign(y)
─────────
  3 _____
3⋅╲╱ │y│ 

更接近(?)但仍然不是我想要的。将y定义为正面也没有做到这一点。

这可能看似愚蠢但却使我从那时起的计算变得非常复杂。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为您需要在此使用sympy.factor而不是simplify

In [2]: dginvdy
Out[2]: 2*(y**2)**(1/3)/(3*y)
In [3]: factor(dginvdy)
Out[3]: 2/(3*y**(1/3))

sympy docs详细介绍了这一点。

答案 1 :(得分:0)

我发现通过假设positive=True来定义我的变量,我的根简化头痛常常得到缓解,而且这种方法确实可以让你在这里得到你想要的答案。您需要删除if语句并使用g_inv=solve(G, x)[0],因为solve(...)现在只返回一个解决方案。这种方法可能导致一般性失去,所以你只需要知道你的问题。