2016-06-23 5 views
2

Я готовлю примеры того, как якобиан прибыл с использованием преобразований из полярных/декартовых параметров. Мой вопрос двоякий. Во-первых, я хочу знать, как заставить sympy отменить условия после замены. Две матрицы:Условия отмены симпигментов в трансформации якобиана полярных координат

J1 = Matrix([[(r*cos(theta)).diff(r), (r*cos(theta)).diff(theta)],[(r*sin(theta)).diff(r),(r*sin(theta)).diff(theta)]]) 
J2 = Matrix([[((x**2+y**2)**(1/2.)).diff(x),((x**2+y**2)**(1/2.)).diff(y)],[atan(y/x).diff(x),atan(y/x).diff(y)]]) 
#substitute for x,y to have same variables for J1 and J2 
J2 = trigsimp(J2.subs({x:r*cos(theta), y:r*sin(theta)})) 
J2 

я ожидал, что с помощью отмены(), или даже evalf() был бы удален г/(г^2)^1/2 = 1 термин, но это не так.

Во-вторых, как или может потребоваться симпять для распознавания простых тождеств, в этом случае sin^2 + cos^2 = 1? Это так, что результатом является оцененная единичная матрица из J1 * J2.

Это работает, согласно документации:

simplify(r/(r**2)**(1/2)*(sin(theta)**2+cos(theta)**2)) 

Это эквивалентно (МОГ) уравнение не имеет.

J = J1*J2 
simplify(J[0,0]) 

Похоже, что вторая ошибка является следствием первого.

ответ

1

Математически, r/(r^2)^1/2 = 1 не всегда верно. Это верно, если r - неотрицательное число, которое находится в полярных координатах. Таким образом, вы должны сказать SymPy это:

r = Symbol('r', nonnegative=True) 
theta, x, y = symbols('theta x y') 

(Математически, вы можете даже предположить г строго положительное, positive=True, так как в начале координат производные в полярных координатах не работать в любом случае.)

Вывод будет гораздо приятнее: [[1.0*cos(theta), 1.0*sin(theta)], [-sin(theta)/r, cos(theta)/r]]

Только этот 1.0 вызывает раздражение, откуда он исходит? Он исходит от 1/2. будучи плавающим вместо рационального числа. Используйте Rational(1, 2), чтобы иметь рациональное число в экспоненте (важно для упрощения). В этом случае показатель равен 1/2, более естественно использовать sqrt, который имеет тот же эффект, что и показатель экспоненциальности, и его легче вводить.

sqrt(x**2+y**2).diff(x) 

Конечный результат [[cos(theta), sin(theta)], [-sin(theta)/r, cos(theta)/r]]

Что касается тригонометрической упрощения, trigsimp(J1*J2) делает возвращает матрицу.

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