/* ...Jacobiano+ tensore metrico...

Jacobiano e nuovo tensore metrico in coordinate sferiche

http://www.elegio.it/omnia/mc/ argomenti di meccanica classica...

Dopo avere installato sul proprio PC il gratutito e trasportabilissimo, su chiavetta USB, wxMaxima...

http://www.elegio.it/omnia/mc/mc20140203.mac.html

http://www.elegio.it/omnia/mc/mc20140203.wxm.html

*/

/*
Pro memoria di come visualizzare numeri in virgola
mobile e con alta precisione
*/

fpprec:36$
print("256 elevato a 1250 vale quasi ",
" 2 moltiplicato per 10 alla 3010")$
print(bfloat(256^1250))$
print("Un numeretto non molto piccolino...")$

/*
Ecco le due funzioni fondamentali definite qui per lavorare
in spazi CLASSICI ossia in TRE DIMENSIONI
*/

fajacobiano(X,Y,Z):=block([mj],
mj:matrix([diff(X,x),diff(X,y),diff(X,z)],
[diff(Y,x),diff(Y,y),diff(Y,z)],
[diff(Z,x),diff(Z,y),diff(Z,z)]),
return(ratsimp(mj)))$
print("definisco la funzione: fajacobiano(X,Y,Z)")$
/*
*/ nuovogm(GM,Xv,Yv,Zv):=block([gmp,gm,jacobiano], gmp:trigsimp(ev(GM, X=Xv,Y=Yv,Z=Zv)), jacobiano:matrix([diff(Xv,x),diff(Xv,y),diff(Xv,z)], [diff(Yv,x),diff(Yv,y),diff(Yv,z)], [diff(Zv,x),diff(Zv,y),diff(Zv,z)]), gm:ratsimp(transpose(jacobiano).gmp.jacobiano), return (trigsimp(ev(gm,x=X,y=Y,z=Z))) )$ print("definisco la funzione: nuovogm(GM,Xv,Yv,Zv)")$ /* Ora scrivo le coordinate cartesiane espresse come funzioni delle coordinate sferiche tradizionali... */ X1 : x*sin(y)*cos(z)$ Y1 : x*sin(y)*sin(z)$ Z1 : x*cos(y)$ print("Cartesiane classiche espresse da sferiche classiche ")$ print("X1 vale: ",X1)$ print("Y1 vale: ",Y1)$ print("Z1 vale: ",Z1)$ /* Ecco come viene lo jacobiano usato per ottenere il tensore metrico in coordinate sferiche classiche */ fajacobiano(X1,Y1,Z1); /* Ora scrivo le coordinate sferiche classiche espresse come coordinate cartesiane classiche: */ X2:sqrt(x^2+y^2+z^2)$ Y2:acos(z/sqrt(x^2+y^2+z^2))$ Z2:asin(y/sqrt(x^2+y^2))$ print("Sferiche classiche espresse tramite le cartesiane")$ print("X2 vale : ",X2)$ print("Y2 vale : ",Y2)$ print("Z2 vale : ",Z2)$ /* Il tensore metrico cartesiano in tre dimensioni e' semplicissimo ossia e' la matrice identita' */ gmcartesiana:diag_matrix(1,1,1)$ print("Il tensore metrico cartesiano classico !")$ print("Semplicemente una matrice identita' ", "e il covariante coincide col controvariante")$ print("gmcartesiana vale: ",gmcartesiana)$ /* Calcolo dal cartesiano classico e dalle formule per ottenere il cartesiano note le coordinate sferiche classiche: */ gmsferico:nuovogm(gmcartesiana,X1,Y1,Z1)$ print("calcolo nuovogm(gmcartesiana,X1,Y1,Z1) ")$ print("X1 : ",X1)$ print("Y1 : ",Y1)$ print("Z1 : ",Z1)$ print("Ed ecco il tensore metrico covariante sferico classico ")$ print("gmsferico vale ",gmsferico)$ /* Per curiosita' vediamo cosa e' la matrice jacobiana quando si vuole riottenere il tensore metrico cartesiano ossia la semplicissima matrice identita' */ print(" La matrice jacobiana delle coordinate sferiche ", "espresse tramite le coordinate cartesiane")$ print("fajacobiano(X2,Y2,Z2) : ", fajacobiano(X2,Y2,Z2))$ /* Se il tensore metrico sferico covariante e' giusto, facendo l'operazione inversa debbo riottenere il classicissimo tensore metrico cartesiano ossia la matrice identita' di ordine 3. */ gmcartesianaricalcolata:nuovogm(gmsferico,X2,Y2,Z2)$ print("Lecito chiedersi se gmsferico e' giusto")$ print("Verifico facendo l'operazione inversa")$ print("Uso il tensore metrico sferico", " per riottenere il cartesiano")$ print("calcolo nuovogm(gmsferico,X2,Y2,Z2) ")$ print("X2 : ",X2)$ print("Y2 : ",Y2)$ print("Z2 : ",Z2)$ print("Ed ecco il tensore metrico covariante cartesiano ")$ print("gmcartesianaricalcolata vale ", gmcartesianaricalcolata)$ determinant(gmsferico); /*
*/ /* Qui iniziano le formule non ovvie... */ X3 : x*sqrt(1-y^2)*cos(z)$ Y3 : x*sqrt(1-y^2)*sin(z)$ Z3 : x*y$ print("Cartesiane classiche espresse da sferiche NON classiche ")$ print("X3 vale: ",X3)$ print("Y3 vale: ",Y3)$ print("Z3 vale: ",Z3)$ /* Per calcolare le sferiche NON classiche usando le solite coordinate cartesiane : */ X4:sqrt(x^2+y^2+z^2)$ Y4:z/sqrt(x^2+y^2+z^2)$ Z4:asin(y/sqrt(x^2+y^2))$ print("Sferiche NON classiche espresse tramite le cartesiane")$ print("X4 vale : ",X4)$ print("Y4 vale : ",Y4)$ print("Z4 vale : ",Z4)$ /* Ecco come viene bene il tensore metrico usando queste coordinate sferiche NON classiche ossia quando uso per theta che sarebbe 90-latitudine ossia vale 0 al polo Nord e 180 al polo sud o meglio, in radianti %pi... */ gmsferico2:nuovogm(gmcartesiana,X3,Y3,Z3)$ print("calcolo nuovogm(gmcartesiana,X3,Y3,Z3) ")$ print("X3 : ",X3)$ print("Y3 : ",Y3)$ print("Z3 : ",Z3)$ print("Ed ecco il tensore metrico covariante sferico NON classico ")$ print("gmsferico2 vale ",gmsferico2)$ /* A questo punto controllo se, noto il tensore metrico sferico NON classico riesco a riottenere quello solito cartesiano... */ gmcartesianaricalcolata2:nuovogm(gmsferico2,X4,Y4,Z4)$ print("Lecito chiedersi se gmsferico2 e' giusto")$ print("Verifico facendo l'operazione inversa")$ print("Uso il tensore metrico sferico NON classico", " per riottenere il cartesiano")$ print("calcolo nuovogm(gmsferico2,X4,Y4,Z4) ")$ print("X4 : ",X4)$ print("Y4 : ",Y4)$ print("Z4 : ",Z4)$ print("Ed ecco il tensore metrico covariante cartesiano ")$ print("gmcartesianaricalcolata2 vale ", gmcartesianaricalcolata2)$ /* Pero' c'e' questo difettuccio ossia il determinante della metrica non vale 1 ossia non e' indipendente dal valore locale delle coordinate... */ ratsimp(determinant(gmsferico2)); /* Ma se voglio NON far dipendere il determinante del tensore metrico dalle coordinate, come posso fare ? */ /* ECCO COME SI FA ! */ X5 : (3*x)^(1/3)*sqrt(1-y^2)*cos(z)$ Y5 : (3*x)^(1/3)*sqrt(1-y^2)*sin(z)$ Z5 : (3*x)^(1/3)*y$ print("Cartesiane classiche espresse da sferiche BISNON classiche ")$ print("X5 vale: ",X5)$ print("Y5 vale: ",Y5)$ print("Z5 vale: ",Z5)$ /* Da cui mi vien fuori questo tensore metrico */ gmsferico3:nuovogm(gmcartesiana,X5,Y5,Z5)$ print("calcolo nuovogm(gmcartesiana,X5,Y5,Z5) ")$ print("X5 : ",X5)$ print("Y5 : ",Y5)$ print("Z5 : ",Z5)$ print("Ed ecco il tensore metrico ", "covariante sferico BISNON classico ")$ print("gmsferico3 vale ",gmsferico3)$ /* Dunque con questa metrica sferica BISNON classica il determinante del tensore metrico vale 1 come nel caso della metrica cartesiana e questo fatto semplifica la scrittura di certi operatori differenziali e varie altre cose... */ ratsimp(determinant(gmsferico3)); /* Lo scrivo perche' e' TROOOOPPPO BELLO ! */ /*

gmbello:diag_matrix(1/(3*X)^(4/3), (3*X)^(2/3)/(1-Y^2),(3*X)^(2/3)*(1-Y^2))

*/

gmbello:diag_matrix(1/(3*X)^(4/3),
(3*X)^(2/3)/(1-Y^2),(3*X)^(2/3)*(1-Y^2))$
print("gmbello ossia gmsferico3 vale:",gmbello)$

/*
Faccio molti errorini ... controllo di non avere
sbagliato...
*/

print("Verifico di non avere fatto errori : ")$
print("ratsimp(gmbello-gmsferico3) vale :",
ratsimp(gmbello-gmsferico3))$

/*
Certo in gmbello mi compaiono un po' di radici cubiche 
ma in fondo non e' un dramma...
*/

/*
Se ho le coordinate cartesiane e voglio esprimerle
come BISNON classiche devo ysare queste formule che mi
servono anche per verificare la correttezza del
tensore metrico covariante espresso nelle coordinate
BISNON classiche...
*/

X6:(sqrt(x^2+y^2+z^2)^3)/3$
Y6:z/sqrt(x^2+y^2+z^2)$
Z6:asin(y/sqrt(x^2+y^2))$
print("Sferiche BISNON classiche",
" espresse tramite le cartesiane :")$
print("X6 vale : ",X6)$
print("Y6 vale : ",Y6)$
print("Z6 vale : ",Z6)$

/*
In sostanza la coordinata radiale diventa PROPORZIONALE
AL VOLUME DELLA SFERA COL CENTRO 
ALL'ORIGINE DELLE COORDINATE
*/

/*
Infatti facendo la verifica riottengo il tensore metrico
cartesiano ossia la solita matrice identita'
*/

gmcartesianaricalcolata3:nuovogm(gmsferico3,X6,Y6,Z6)$
print("Lecito chiedersi se gmsferico3 e' giusto")$
print("Verifico facendo l'operazione inversa")$
print("Uso il tensore metrico sferico NON classico",
" per riottenere il cartesiano")$
print("calcolo nuovogm(gmsferico3,X6,Y6,Z6) ")$
print("X6 : ",X6)$
print("Y6 : ",Y6)$
print("Z6 : ",Z6)$
print("Ed ecco il tensore metrico covariante cartesiano ")$
print("gmcartesianaricalcolata3 vale ",
gmcartesianaricalcolata3)$

/*

Per usare questo file con http://maxima.sourceforge.net/ cancellare l'estensione .html e lasciargli l'estensione .mac se e' stato creato con questa estensione da wxMaxima.oppure se e' un file che aveva estensione .wxm a cui io ho aggiunto, per camuffarlo da file di internet, l'estensione .html bisogna cancellare questa e ridargli la estensione che aveva all'origine ossia .wxm

*/ /*

Di solito Windows NASCONDE LE ESTENSIONI per evitare che un utente pasticcione ed ignorante che non sa che servono per identificare il tipo del file le cancelli volendo scrivere nomi di file senza punti

*/ /*

Pero' questa precauzione intralcia quando si vuole mascherare una estensione per CAMUFFARE il file da file .html

*/ /*

Per aggirare questa difficolta' si puo' aprire il file usando NOTEPAD.EXE che e' un editor standard presente in qualunque calcolatore che usa Windows. Lo si apre e lo si salva mettendogli l'estensione giusta ossia, per wxMaxima, a seconda dei casi, .mac o .wxm

*/ /*

Amen e BUON DIVERTIMENTO con gli Jacobiani !

*/