/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 13.04.2 ] */ /* [wxMaxima: comment start ] ...Libreria tensoriale 20100622 attualizzata ...
[wxMaxima: comment end ] */ /* [wxMaxima: title start ]

Esempio n.2 d'uso della libreria libtensori.mc

[wxMaxima: title end ] */ /* [wxMaxima: comment start ] Divergenze ed altri operatori differenziali... Vedere: http://www.elegio.it/mc2/maxwell-generale.html http://www.elegio.it/mc2/Ricci-Riemann-1.html [wxMaxima: comment end ] */ /* [wxMaxima: subsect start ]

Premessa: carico la libreria

   [wxMaxima: subsect end   ] */

/* [wxMaxima: comment start ]
Utilizza la libreria tensoriale. Deve dunque caricarla...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
load_questo:"libtensori.mc";
/* [wxMaxima: input   end   ] */

/* [wxMaxima: input   start ] */
salvoqui:"c:/xmaxima/tensori_x.mc";
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Dato che nel file che voglio rileggere con una load(...) ci
puo' essere una closefile(), per non avere segnalazioni di
errore apro un file detto di dribbling il cui contenuto
non mi interessa e dunque non importa se lo sovrascrivero'.
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
if atom(path_iniziale) then writefile("eliminando.mc");
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Ora amplia il path
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
altracartella:"C:/xmaxima/###.{mc,mac}";
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
E' consigliabile, prima di modificarlo, di salvare il valore del
path di default di Maxima.
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
( if atom(path_iniziale) then (path_iniziale: file_search_maxima) )$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Ora amplio il path iniziale aggiungendogli la cartella. Con questo 
trucco posso ricaricare varie volte questo documento senza il 
problema di modificare ogni volta il path di ricerca. 
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
file_search_maxima: cons(altracartella,path_iniziale);
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Dopo avere ampliato il path, cerco di caricare la libreria tensoriale.
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
load(load_questo);
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Ora salva su un nuovo file ossia salvoqui...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
writefile(salvoqui);
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Guardo i nomi delle funzioni della libreria.
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
libmia;
/* [wxMaxima: input   end   ] */

/* [wxMaxima: section start ]

Creiamo una metrica per la sperimentazione delle formule:

[wxMaxima: section end ] */ /* [wxMaxima: comment start ] Usiamo la piu' generica metrica diagonale di uno spazio a quattro dimensioni. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ ct_coords: [t,r,h,p]; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ depends([gt,gr,gh,gp],[t,r,h,p]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ ggg22:matrix( [gt,0,0,0], [0,gr,0,0], [0,0,gh,0], [0,0,0,gp]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ metrica:fa_metrica(ggg22,ct_coords)$ /* [wxMaxima: input end ] */ /* [wxMaxima: section start ]

Divergenza di un vettore.

[wxMaxima: section end ] */ /* [wxMaxima: comment start ] La divergenza diver di un vettore ( che è uno scalare ) è data, in generale, da (diver:A18[1][i,i]) ossia prendere la traccia della sua derivata covariante, ma puo' essere calcolata senza bisogno di fare derivate covarianti ossia detto sqrtabsdet la radice quadrata del valore assoluto del determinante del tensore metrico covariante, si ottiene con la formula: (AD1[j]:sqrtabsdet*A1[i], diver:AD10[1][i,i]/sqrtabsdet ) [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Importante da ricordare : Scrivo le derivate parziali in forma abbreviata ossia indicando con un pedice la variabile di derivazione. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ derivabbrev:true; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ metrica[2]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] La radice quadrata del valore assoluto del determinante vale: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ rest(metrica[2],-1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ metrica[3]; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ metrica[4]; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ metrica[5]; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ metrica[6]; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ metrica[7]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Data l'importanza dei simboli di Christoffel di seconda specie ripeto qui la stampa delle quattro matrici che costituiscono appunto lo pseudotensore del terzo ordine. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ ch122:[0,0,0,0]$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ ch122[1]:matrix([gt[t]/(2*gt),gt[r]/(2*gt),gt[h]/(2*gt),gt[p]/(2*gt)], [gt[r]/(2*gt),-gr[t]/(2*gt),0,0],[gt[h]/(2*gt),0,-gh[t]/(2*gt),0], [gt[p]/(2*gt),0,0,-gp[t]/(2*gt)]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ ch122[2]:matrix([-gt[r]/(2*gr),gr[t]/(2*gr),0,0], [gr[t]/(2*gr),gr[r]/(2*gr),gr[h]/(2*gr),gr[p]/(2*gr)], [0,gr[h]/(2*gr),-gh[r]/(2*gr),0], [0,gr[p]/(2*gr),0,-gp[r]/(2*gr)]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ ch122[3]:matrix([-gt[h]/(2*gh),0,gh[t]/(2*gh),0], [0,-gr[h]/(2*gh),gh[r]/(2*gh),0], [gh[t]/(2*gh),gh[r]/(2*gh),gh[h]/(2*gh),gh[p]/(2*gh)], [0,0,gh[p]/(2*gh),-gp[h]/(2*gh)]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ ch122[4]:matrix([-gt[p]/(2*gp),0,0,gp[t]/(2*gp)], [0,-gr[p]/(2*gp),0,gp[r]/(2*gp)], [0,0,-gh[p]/(2*gp),gp[h]/(2*gp)], [gp[t]/(2*gp),gp[r]/(2*gp),gp[h]/(2*gp),gp[p]/(2*gp)]); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] La radice quadrata del valore assoluto del determinante del tensore metrico covariante svolge un ruolo fondamentale in parecchie formule. Ovviamete, per un tensore metrico diagonale specificato simbolicamente vale: sqrt( abs(gt*gr*gp*gh ) ) ossia : [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ metrica[11][1]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Crea la funzione divergenza del tensore rispetto ad un dato indice. Fa uso della derivata covariante per cui questa funzione e' applicabile a qualunque tensore di ordine positivo. Nota: qui serve per test ma è gia' inclusa nella libreria... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ xdivergenza(tn,kkk,metrica):=block([k,tm,j], if not(tensorp(tn)) then return("Errore: non tensore"), if not(numberp(kkk)) then return("Errore: non numero intero"), k:floor(kkk), if 1>k then return("Errore: indice non positivo"), j:indici(tn), if k>length(j) then return("Errore: indice troppo elevato"), if mod(j[k],2)=1 then tm:diffcov(tn,metrica,"!") else ( tm:scala(metrica[3],1,tn,k), tm:diffcov(tm,metrica,"!")), traccia(tm,k,ordine(tm)) )$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Scrivo un vettore controvariante generico: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ depends([At,Ar,Ah,Ap],ct_coords); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ A1:[At,Ar,Ah,Ap,[1,"Vettore controvariante",4]]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Sfrutto le proprietà della divergenza di un vettore controvariante per non calcolare la derivata covariante. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ AD1:append(metrica[11][1]*rest(A1,-1), [[1,"sqrt(|g22|)*A1",4]]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ vala:traccia(append([radcan(fa_diff(AD1,ct_coords, "gradiente di AD1")[1]/metrica[11][1])], [[1,0,"derivata ordinaria",4]]),1,2); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xssa:xdivergenza(A1,1,metrica)$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Controllo se ci sono differenze rispetto alla versione in libreria... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ tmeno(xssa,divergenza(A1,1,metrica)); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] I due modi di calcolare la divergenza di un vettore controvariante coincidono. Infatti... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ ratsimp(rest(ratsimp(xssa),-1)-rest(vala,-1)); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Mi aspetto che siano coincidenti anche i due modi di calcolare la divergenza di un vettore covariante. Sia B2 un vettore covariante... Va prima convertito in controvariante e poi derivato. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ depends([Bt,Br,Bh,Bp],ct_coords); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ B2:[Bt,Br,Bh,Bp,[2,"Vettore covariante",4]]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Calcolo la sua divergenza in modo standard... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ xssb:xdivergenza(B2,1,metrica)$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Controllo se ci sono differenze rispetto alla versione in libreria... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ tmeno(xssb,divergenza(B2,1,metrica)); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Ora invece sfrutto le proprieta' della divergenza di un vettore... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ B1:scala(metrica[3],2,B2,1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ BD1:append(metrica[11][1]*rest(B1,-1), [[1,"sqrt(|g22|)*B1",4]]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ valb:append([radcan(fa_diff(BD1,ct_coords, "gradiente di BD1")[1]/metrica[11][1])], [[1,0,"derivata ordinaria",4]]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ scab:traccia(valb,1,2); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] I due metodi, quello standard e quello specifico del caso debbono dare lo stesso risultato. Infatti... ottengo zero !!! [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ ratsimp(xssb[1]-scab[1]); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Ora lavoro su tensori del secondo ordine ( meglio: RANGO )... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ depends([a11,a12,a13,a14,a21,a22,a23,a24, a31,a32,a33,a34,a41,a42,a43,a44],ct_coords); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ mat:matrix( [a11,a12,a13,a14], [a21,a22,a23,a24], [a31,a32,a33,a34], [a41,a42,a43,a44]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ tsmat:tmat11(mat+transpose(mat),metrica); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ tamat:tmat11(mat-transpose(mat),metrica); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Ridefinisco qui varie funzioni già presenti nella libreria per poterle modificare facendo delle stampe intermedie.

[wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ xsomma(tena,tenb):=block( [oa,ob,na,nb,ina,inb,stop], if not(tensorp(tena)) then return("Errore: primo arg. non tensore"), if not(tensorp(tenb)) then return("Errore: secondo arg. non tensore"), oa:ordine(tena), ob:ordine(tenb), if oa#ob then return("Errore: tensori di ordine diverso"), na:dimensione(tena), nb:dimensione(tenb), if na#nb then return("Errore: tensori di dimensione diversa"), ina:indici(tena), inb:indici(tenb), stop:false, for j:1 thru oa do if mod(ina[j]+inb[j],2)=1 then stop:true, if stop then return("Errore: indici incongruenti"), append(rest(tena,-1)+rest(tenb,-1), [append(ina,["(Somma tensori)",na])]) )$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xprod(scala,tenb):=block( [oa,ob,na,nb,inb], if not(tensorp(scala)) then return("Errore: primo arg. non tensore"), if not(tensorp(tenb)) then return("Errore: secondo arg. non tensore"), oa:ordine(scala), ob:ordine(tenb), if oa#0 then return("Errore: non scalare"), na:dimensione(scala), nb:dimensione(tenb), if na#nb then return("Errore: tensori di dimensione diversa"), inb:indici(tenb), append(scala[1]*rest(tenb,-1),[append(indici(tenb), ["(Prodotto scalare*tensore)",nb])]) )$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtsca(sc,metrica):=block([], [sc,["(scal)",dimensione(metrica[2])]])$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtcov(lv,metrica):=block([nl,nd], if not(listp(lv)) then return("Non lista"), nl:length(lv), nd:dimensione(metrica[2]), [ makelist(lv[1+mod(j-1,nl)],j,1,nd), [2,"(v2)",nd]])$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtcontrov(lv,metrica):=block([nl,nd], if not(listp(lv)) then return("Non lista"), nl:length(lv), nd:dimensione(metrica[2]), [ makelist(lv[1+mod(j-1,nl)],j,1,nd), [1,"(v1)",nd]])$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtmat11(mat,metrica):=block([], if not(matrixp(mat)) then return("Non matrice"), [mat,[1,1,"(tm11)",dimensione(metrica[2])]])$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtmat12(mat,metrica):=block([], if not(matrixp(mat)) then return("Non matrice"), [mat,[1,2,"(tm12)",dimensione(metrica[2])]])$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtmat21(mat,metrica):=block([], if not(matrixp(mat)) then return("Non matrice"), [mat,[2,1,"(tm11)",dimensione(metrica[2])]])$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtmat22(mat,metrica):=block([], if not(matrixp(mat)) then return("Non matrice"), [mat,[2,2,"(tm22)",dimensione(metrica[2])]])$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ]

Ed ora uso questi duplicati [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ xtcov([1,2,3],metrica); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ xtcontrov([1,2,3],metrica); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ tab:tsomma(tamat,tsmat); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] e per tornare indietro lo moltiplico per 1/2 [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ tprod(tsca(1/2,metrica),tab); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ]
Per usare questo file con http://maxima.sourceforge.net/ cancellare l'estensione .html e lasciargli l'estensione .wxm

Amen e ... auguri di tanti file come questo !

; [wxMaxima: comment end ] */ /* Maxima can't load/batch files which end with a comment! */ "Created with wxMaxima"$