2015-08-14 2 views
1

У меня есть следующий код в 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 как положительный также не сделал трюк.

Это может показаться чем-то глупым, но это чрезвычайно усложняет вычисления, которые я делаю с этого момента.

Любые идеи?

ответ

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 углубиться в детали об этом.

0

Я обнаружил, что мои основные упрощения головных болей часто устраняются путем определения моих переменных с предположением positive=True, и действительно этот метод также дает вам ваш желаемый ответ. Вам нужно будет избавиться от вашего оператора if и использовать g_inv=solve(G, x)[0], потому что solve(...) вернет только одно решение. Этот метод может привести к некоторой потере общности, поэтому вам просто нужно знать вашу проблему.

Смежные вопросы