Sign in to follow this  
DarwinNE

Maxima, il nipotino del grande MACSYMA

Recommended Posts

scusa Darwinunccio (eh eh leccatina! :)), conosci il prodotto e la somma secondo kronecker? mi servirebbe tanto! è quando moltiplichi tutti gli gli elementi di una matrice per tutti quelli di un altra

ad es se fai il prodotto di k. di 2 matrici 3*3 devi ottnere una matrice 9*9.

Share this post


Link to post
Share on other sites

A grande richiesta ;), ecco come fare alcuni calcoletti fra matrici: la somma diretta (o di Kronecker) ed il prodotto di Kronecker. Definiamo un paio di matrici con cui fare i calcoli:

(%i139) m: matrix([a,b],[c,d]);                                   [ a  b ](%o139)                            [      ]                                   [ c  d ](%i140) n: matrix([i,j,k],[x,y,z]);                                  [ i  j  k ](%o140)                           [         ]                                  [ x  y  z ]

Qui ho utilizzato un metodo più compatto rispetto a quello visto sopra per introdurre una matrice quadrata ed una rettangolare da usare in seguito.

Il prodotto di Kronecker fra due matrici di dimensioni MxN e PxQ è ben diverso da un prodotto fra matrici e consiste a costruire una matrice a blocchi di dimensioni NPxNQ. Costituisce un caso particolare di prodotto tensoriale. Per maggiori informazioni ed esempi, rimando a questa pagina di Wikipedia:

http://en.wikipedia.org/wiki/Kronecker_product

Maxima non prevede fra le funzioni di base caricate all'avvio la possibilità di effettuare il prodotto di Kronecker. Funzioni avanzate sono tuttavia disponibili caricando dei moduli con il comando load. Il modulo linearalgebra fornisce un sacco di cose utili per chi si diverte con le matrici (fattorizzazioni LU, Cholesly, matrici particolari tipo quella di Vandermonde e chi più ne ha più ne metta). Fra le possibilità offerte, c'è anche quella di calcolare il prodotto di Kronecker tramite il comando cronecker_product. Ecco come fare:

(%i141) load(linearalgebra);WARNING: DEFUN/DEFMACRO: redefining function $COPY in         /usr/local/share/maxima/5.11.0/share/linearalgebra/linalg-utilities.lisp, was defined         in /Users/davidebucci/Desktop/maxima-5.11.0/src/binary-clisp/comm2.fas(%o141) /usr/local/share/maxima/5.11.0/share/linearalgebra/linearalgebra.mac(%i142) p:kronecker_product(m,n);                       [ a i  a j  a k  b i  b j  b k ]                       [                              ]                       [ a x  a y  a z  b x  b y  b z ](%o142)                [                              ]                       [ c i  c j  c k  d i  d j  d k ]                       [                              ]                       [ c x  c y  c z  d x  d y  d z ](%i143) 

La somma diretta consiste sempre nel creare una matrice definita a blocchi i cui blocchi nella diagonale sono le matrici di partenza, che devono essere quadrate.

Per la somma diretta, non ho trovato una funzione che la effetui direttamente, ma l'operatore diag_matrix, sempre nel pacchetto linearalgebra puo' risolvere il problema nel caso in cui le matrici sono quadrate ed hanno la stessa dimensione:

(%i168) q:matrix([1,2],[3,4]);                                   [ 1  2 ](%o168)                            [      ]                                   [ 3  4 ](%i169) m: matrix([a,b],[c,d]);                                   [ a  b ](%o169)                            [      ]                                   [ c  d ](%i170) r:diag_matrix(q,m);                            [ [ 1  2 ]  [ 0  0 ] ]                            [ [      ]  [      ] ]                            [ [ 3  4 ]  [ 0  0 ] ](%o170)                     [                    ]                            [ [ 0  0 ]  [ a  b ] ]                            [ [      ]  [      ] ]                            [ [ 0  0 ]  [ c  d ] ](%i171) r1:mat_fullunblocker(r);                                [ 1  2  0  0 ]                                [            ]                                [ 3  4  0  0 ](%o171)                         [            ]                                [ 0  0  a  b ]                                [            ]                                [ 0  0  c  d ](%i172) 

Si noti come Maxima disegna le matrici a blocchi (linea %o170) e come si è usato il comando mat_fullunblocker per passare da una matrice a blocchi (blocked in Maxima) ad una matrice normale.

Purtroppo il metodo fallisce se le matrici sono si' quadrate, ma hanno una dimensione diversa, perché i blocchi non sono di dimensione corretta:

(%i172) o:matrix([1,2,3],[4,5,6],[7,8,9]);                                  [ 1  2  3 ]                                  [         ](%o172)                           [ 4  5  6 ]                                  [         ]                                  [ 7  8  9 ](%i173) r:diag_matrix(m,o);                         [  [ a  b ]     [ 0  0 ]   ]                         [  [      ]     [      ]   ]                         [  [ c  d ]     [ 0  0 ]   ]                         [                          ](%o173)                  [ [ 0  0  0 ]  [ 1  2  3 ] ]                         [ [         ]  [         ] ]                         [ [ 0  0  0 ]  [ 4  5  6 ] ]                         [ [         ]  [         ] ]                         [ [ 0  0  0 ]  [ 7  8  9 ] ](%i174) r1:mat_fullunblocker(r);Incompatible structure - `addrow'//`addcol'#0: mat_fullunblocker(m=matrix([matrix([a,b],[c,d]),matrix([0,0],[0,0])],[matrix([0,0,0],[0,0,0],[0,0,0]),matrix([1,2,3],[4,...)(linearalgebra.mac line 258) -- an error.  To debug this try debugmode(true);(%i175) 

Male che vada, si puo' sempre fare i conti e costruire la matrice a blocchi a mano:

(%i176) r2:matrix([m,zeromatrix(first(matrix_size (m)),second(matrix_size(o)))],\[zeromatrix(first(matrix_size (o)),second(matrix_size(m))),o]);                           [ [ a  b ]  [ 0  0  0 ] ]                           [ [      ]  [         ] ]                           [ [ c  d ]  [ 0  0  0 ] ]                           [                       ](%o176)                    [ [ 0  0 ]  [ 1  2  3 ] ]                           [ [      ]  [         ] ]                           [ [ 0  0 ]  [ 4  5  6 ] ]                           [ [      ]  [         ] ]                           [ [ 0  0 ]  [ 7  8  9 ] ](%i177) r3:mat_fullunblocker(r2);                               [ a  b  0  0  0 ]                               [               ]                               [ c  d  0  0  0 ]                               [               ](%o177)                        [ 0  0  1  2  3 ]                               [               ]                               [ 0  0  4  5  6 ]                               [               ]                               [ 0  0  7  8  9 ](%i178) 

Ho utilizzato alla linea (%i176) l'operatore size, che restituisce una lista composta di due elementi che sono le dimensioni della matrice. Ho spezzato una linea lunga (%i176) per evitare di scombinare il forum, utilizzando la barra rovesciata \.

Share this post


Link to post
Share on other sites

DarwinE, ti volevo chiedere. in matlab se dico

a=5

b=4

c=a+b

se cheido quanto vale c me lo indica. e con maxima come si fa?

Hanno poi funzionato le operazioni fra matrici che ti ho indicato?

Per quanto riguarda la tua domanda, non c'è nulla di più semplice:

(%i4) a:5;(%o4)                                  5(%i5) b:4;(%o5)                                  4(%i6) c:a+b;(%o6)                                  9(%i7) 

Naturalmente, possono essere eseguiti anche calcoli più complessi, ma Maxima cerca di evitare la strada del calcolo numerico fino a che puo' farlo:

(%i17) a:5/2;                                        5(%o17)                                 -                                       2(%i18) b:3/5;                                       3(%o18)                                 -                                       5(%i19) c:a+b;                                      31(%o19)                                --                                      10(%i20) c:a+b, numer;(%o20)                                3.1(%i21) a:sqrt(5);(%o21)                              sqrt(5)(%i22) d:a+b;                                            3(%o22)                            sqrt(5) + -                                            5(%i23) d:a+b,numer;(%o23)                         2.83606797749979(%i24) 
Come si vede, il far seguire ad un'espressione il termine numer separato da una virgola permette di forzare il calcolo per via numerica. Una cosa divertente è giocare con le possibilità di calcolo numerico con precisione arbitraria, specificata dalla variabile fpprec e dal modificatore di formato bfloat (big floating point):

(%i25) fpprec: 200;(%o25)                                200(%i26) bfloat(d:a+b);(%o26) 2.836067977499789696409173668731276235440618359611525724270897245410520\925637804899414414408378782274969508176150773783504253267724447073863586360121\5334527088667781731918791658112766453226398565805358b0

Prego

Share this post


Link to post
Share on other sites

ah ecco come si fa! grazie Darwine! in effetti Maxima è più portato verso l'analisi matematica che il calcolo matricale numerico! :)

Share this post


Link to post
Share on other sites

Davide, per fixare il problema relativo a gnuplot e aqua-term, prova ad installare gnuplot dai Darwinports. Io ho risolto cosi'. Mi sto davvero gingillando con questo stupendo programma, mi sta tornando molto utile nel calcolo differenziale. Bellissimo anche LatexIt :)

Share this post


Link to post
Share on other sites

Davide, per fixare il problema relativo a gnuplot e aqua-term, prova ad installare gnuplot dai Darwinports. Io ho risolto cosi'. Mi sto davvero gingillando con questo stupendo programma, mi sta tornando molto utile nel calcolo differenziale. Bellissimo anche LatexIt :)

Grazie, ma ho risolto, grazie ad un suggerimento di Jeby. Basta aggiungere la riga seguente al file .bash_profile

export GNUTERM=aqua

In pratica, si indica a Gnuplot di utilizzare aqua come default per la visualizzazione il terminale "aqua", ovvero aquaterm. Maxima sul Macbook l'ho installato da sorgenti, dato che non avevo un port pronto. Tra l'altro (è collegato al compilatore Lisp utilizzato), sul Macbook non funziona l'history dei comandi introdotti da tastiera, lanciando il programma con il comando "maxima". Il problema è facilmente aggirabile lanciando il programma con il comando "rmaxima" (che pero' non è disponibile sull'iMac dove del resto non è necessario, credo che sia generato solo quando serve al momento della compilazione).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this