From: Juan P. C. <car...@if...> - 2010-11-10 21:41:45
|
Mario, Espectacular lo que estás haciendo, che! Mi problema es un poco menos explicito me parece... a ver si lo puedo reducir al minimo... kill(all); Rot(_angle%) := matrix([cos(_angle%),-sin(_angle%)],[sin(_angle%),cos(_angle%)])$ dRot(_angle%) := matrix([0, -1],[1, 0]) . 'Rot(_angle%)$ matchdeclare(_x%,true); defrule(Rotderiv,'diff('Rot(_x%),t),dRot(_x%)*'diff(_x%,t)); Hasta ahi todo bien, acá esta el chequeo de que algo anda bien... expr : 'diff('Rot(%theta),t); apply1(expr,Rotderiv); pero ahora haciendo expr: ('diff('Rot(%theta(t)) . [x,y],t)) . ('diff('Rot(%theta(t)) . [x,y],t)); expr: ev(expr,diff); apply1(expr,Rotderiv); Parece todo bien, pero si no hago el truco que charlamos antes (hacer que de alguna forma diff(%theta(t),t) sea un escalar), esa expresion no se simplifica; la derivada temporal de %theta, deberia salir como un factor al cuadrado. Otro ejemplo expr: transpose('diff('Rot(%theta(t)),t).[x,y]). ('diff('Rot(%theta(t)),t) . [x,y]); apply1(expr,Rotderiv); expr: ev(expr,transpose); Donde ni se que es lo que el sistema está haciendo. con el truco mencionado, logré conseguir el comportamiento deseado, peor no se si estoy metiendo bugs. Saludos 2010/11/10 Mario Rodriguez <bio...@te...>: > El mié, 10-11-2010 a las 18:10 +0100, Juan Pablo Carbajal escribió: >> Gracias Mario, >> >> Eso aclararía un poco las cosas. Sin embargo, hasta donde pueod ver, >> haciendo ese apply, tood funciona como si %theta fuese una función. >> Voy a corregir ese bug de mis programas. >> >> En este caso queda sin respuesta la pregunta de como definir funciones >> escalares, de tal forma que las derivadas se an considerados como >> escalares. >> Todo viene de que quiero hacer la derivada de una matriz de rotacion R y eso da >> >> matrix([0 -1],[1 0]) . R(%theta) * diff(%theta,t) >> >> Y, cuando hago operaciones vectoriales (como un simple transpose()) >> considera que diff(%theta,t) no es un escalar y no puede simplificar >> las expresiones. >> > > Bueno, en Maxima, el producto de una matriz por escalar es el operador > *. No creo que necesites declarar nada como escalar. > > No sé si te servirá, pero aquí defino algunas matrices de > transformación: > > http://www.telefonica.net/web2/biomates/maxima/gpdraw/transform > >> Voy a preguntar mañana en la lista en Inglés. >> >> Saludos y gracias. >> >> JPi > > -- > Mario > > -- M. Sc. Juan Pablo Carbajal ----- PhD Student University of Zürich www.ailab.ch/carbajal |