简化 sympy 中的根

Simplify roots in sympy

我在 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 定义为正数也没有成功。

这可能看起来很愚蠢,但它极大地复杂化了我从那时起所做的计算。

有什么想法吗?

我认为你需要在这里使用 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 对此进行了详细介绍。

我发现,通过使用假设 positive=True 定义变量,我的根简化问题通常会得到缓解,事实上,这种方法也能让您在这里得到想要的答案。您需要摆脱 if 语句并使用 g_inv=solve(G, x)[0] 因为 solve(...) 现在 return 只有一个解决方案。这种方法可能会导致一些通用性的损失,所以你只需要知道你的问题。