/* Prove di calcolo tensoriale */ /* Provo a realizzare un documento wxm per il calcolo di tutte le grandezze derivate da un assegnato tensore metrico. In questo caso uso il tensore metrico di Reissner e Nordstrom. */ (if atom(lg) then load(ctensor)); init_ctensor(); /* Definisco una funzione del tutto generica delle coordinate. */ rq:x^2+y^2+z^2; depends(a,[x,y,z]); /* La funzione b mi serve solo per semplificare l'input. */ b:a/(a-1); lgmia: matrix ( [ 1-a, 0,0,0 ], [ 0,-1+b*x^2/rq,b*x*y/rq, b*x*z/rq ], [ 0,b*x*y/rq,-1+b*y^2/rq,b*y*z/rq ], [ 0,b*x*z/rq,b*y*z/rq,-1+b*z^2/rq]); /* Dichiaro che faccio uso di coordinate cartesiane */ ct_coords: [t,x,y,z]; /* In base alle esigenze della libreria ctensor di cui ho fatto il load inizializzo il tensore metrico covariante che si deve chiamare lg. */ lg:ratsimp(lgmia); /* Calcolo la metrica ovvero il tensore metrico controvariante che deve essere la matrice inversa del tensore metrico covariante. */ cmetric(); uug:ug$ /* Cerco di semplificare il piu' possibile l'espressione del tensore metrico controvariante */ ug:ratsimp(uug); /* Anche se non serve ora faccio vedere che lg ed ug sono una la matrice inversa dell'altra */ /* Ora calcolo i simboli di christoffel di prima e seconda specie visualizzandoli tutti. Attenzione alle regole della libreria ctensor che mette come terzo indice quello che di solito viene scritto come primo indice. */ christof(all); /* Provo a semplificare una delle componenti del simbolo di Christoffel di seconda specie. */ ratsimp(mcs[2,2,2]); /* Creo il tensore di Riemann sopprimendo l'output che probabilmente sarebbe troppo lungo per essere stampato. */ riemann(false); /* Ora faccio lo stesso calcolando il tensore di Ricci. */ ricci(false); /* Ora trasformo il tensore di Ricci in matrice. */ mat_ricci: ratsimp( matrix( [ ric[1,1],ric[1,2],ric[1,3],ric[1,4]], [ ric[2,1],ric[2,2],ric[2,3],ric[2,4]], [ ric[3,1],ric[3,2],ric[3,3],ric[3,4]], [ ric[4,1],ric[4,2],ric[4,3],ric[4,4]]))$ /* Innanzi tutto controllo che i termini non diagonali della prima riga e colonna siano degli zeri. */ forsezeri: [ratsimp(ric[2,1]),ratsimp(ric[3,1]),ratsimp(ric[4,1]), ratsimp(ric[1,2]), ratsimp(ric[1,3]), ratsimp(ric[1,4])]; /* Controllo che il tensore di ricci e' un tensore simmetrico... come da manuale ma se uno vuol fare il san Tommaso... */ certozeri: [ratsimp(ric[2,3]-ric[3,2]), ratsimp(ric[2,4]-ric[4,2]), ratsimp(ric[3,4]-ric[4,3]) ]; /* Questi non sono zeri ma se la funzione a(x,y,z) assume dei valori adeguati lo debbono diventare... Intanto li stampo... */ ratsimp(ric[1,1]); ratsimp(ric[2,2]); ratsimp(ric[3,3]); ratsimp(ric[4,4]); ratsimp(ric[2,3]); ratsimp(ric[2,4]); ratsimp(ric[3,4]); /* Ora mi preparo a specificare cosa deve valere la funzione a(x,y,z) per fare in modo che la metrica sia quella di un buco nero neutro ossia sia la metrica di Schwarzschild. */ v0n:2*m/rq^(1/2); /* Specifico tutte le derivate di primo e secondo ordine. */ vxn:ratsimp(diff(v0n,x)); vyn:ratsimp(diff(v0n,y))$ vzn:ratsimp(diff(v0n,z))$ vxxn:ratsimp(diff(vxn,x)); vyyn:ratsimp(diff(vyn,y))$ vzzn:ratsimp(diff(vzn,z))$ vxyn:ratsimp(diff(vxn,y)); vxzn:ratsimp(diff(vxn,z))$ vyzn:ratsimp(diff(vyn,z))$ /* Ora sostituisco alle derivate alcuni simboli ossia uso v0, vx, vy, vz, vxx, vxy, vzz, vxy, vxz, vyz. Inizio la procedura con ric[1,1] */ rics:ratsimp(ric[1,1]); ric1:ratsimp(subst(vx,diff(a,x),rics))$ ric2:ratsimp(subst(vy,diff(a,y),ric1))$ ric3:ratsimp(subst(vz,diff(a,z),ric2))$ ric4:ratsimp(subst(vxx,diff(a,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(a,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(a,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(a,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(a,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(a,y),z),ric8))$ rica:ratsimp(subst(v0,a,ric9)); /* Ora sostituisco ai simboli le vere funzioni dedotte a partire da v0n. */ ric1n:ratsimp(subst(vxn,vx,rica))$ ric2n:ratsimp(subst(vyn,vy,ric1n))$ ric3n:ratsimp(subst(vzn,vz,ric2n))$ ric4n:ratsimp(subst(vxxn,vxx,ric3n))$ ric5n:ratsimp(subst(vyyn,vyy,ric4n))$ ric6n:ratsimp(subst(vzzn,vzz,ric5n))$ ric7n:ratsimp(subst(vxyn,vxy,ric6n))$ ric8n:ratsimp(subst(vxzn,vxz,ric7n))$ ric9n:ratsimp(subst(vyzn,vyz,ric8n))$ rican:ratsimp(subst(v0n,v0,ric9n))$ /* Ecco il test cruciale: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Ripeto tutta la procedura con ric[2,2] */ rics:ratsimp(ric[2,2]); ric1:ratsimp(subst(vx,diff(a,x),rics))$ ric2:ratsimp(subst(vy,diff(a,y),ric1))$ ric3:ratsimp(subst(vz,diff(a,z),ric2))$ ric4:ratsimp(subst(vxx,diff(a,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(a,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(a,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(a,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(a,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(a,y),z),ric8))$ rica:ratsimp(subst(v0,a,ric9)); /* Ora sostituisco ai simboli le vere funzioni dedotte a partire da v0n. */ ric1n:ratsimp(subst(vxn,vx,rica))$ ric2n:ratsimp(subst(vyn,vy,ric1n))$ ric3n:ratsimp(subst(vzn,vz,ric2n))$ ric4n:ratsimp(subst(vxxn,vxx,ric3n))$ ric5n:ratsimp(subst(vyyn,vyy,ric4n))$ ric6n:ratsimp(subst(vzzn,vzz,ric5n))$ ric7n:ratsimp(subst(vxyn,vxy,ric6n))$ ric8n:ratsimp(subst(vxzn,vxz,ric7n))$ ric9n:ratsimp(subst(vyzn,vyz,ric8n))$ rican:ratsimp(subst(v0n,v0,ric9n))$ /* Ecco il test cruciale: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Ripeto tutta la procedura con ric[3,3] */ rics:ratsimp(ric[3,3]); ric1:ratsimp(subst(vx,diff(a,x),rics))$ ric2:ratsimp(subst(vy,diff(a,y),ric1))$ ric3:ratsimp(subst(vz,diff(a,z),ric2))$ ric4:ratsimp(subst(vxx,diff(a,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(a,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(a,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(a,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(a,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(a,y),z),ric8))$ rica:ratsimp(subst(v0,a,ric9)); /* Ora sostituisco ai simboli le vere funzioni dedotte a partire da v0n. */ ric1n:ratsimp(subst(vxn,vx,rica))$ ric2n:ratsimp(subst(vyn,vy,ric1n))$ ric3n:ratsimp(subst(vzn,vz,ric2n))$ ric4n:ratsimp(subst(vxxn,vxx,ric3n))$ ric5n:ratsimp(subst(vyyn,vyy,ric4n))$ ric6n:ratsimp(subst(vzzn,vzz,ric5n))$ ric7n:ratsimp(subst(vxyn,vxy,ric6n))$ ric8n:ratsimp(subst(vxzn,vxz,ric7n))$ ric9n:ratsimp(subst(vyzn,vyz,ric8n))$ rican:ratsimp(subst(v0n,v0,ric9n))$ /* Ecco il test cruciale: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Ripeto tutta la procedura con ric[4,4] */ rics:ratsimp(ric[4,4]); ric1:ratsimp(subst(vx,diff(a,x),rics))$ ric2:ratsimp(subst(vy,diff(a,y),ric1))$ ric3:ratsimp(subst(vz,diff(a,z),ric2))$ ric4:ratsimp(subst(vxx,diff(a,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(a,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(a,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(a,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(a,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(a,y),z),ric8))$ rica:ratsimp(subst(v0,a,ric9)); /* Ora sostituisco ai simboli le vere funzioni dedotte a partire da v0n. */ ric1n:ratsimp(subst(vxn,vx,rica))$ ric2n:ratsimp(subst(vyn,vy,ric1n))$ ric3n:ratsimp(subst(vzn,vz,ric2n))$ ric4n:ratsimp(subst(vxxn,vxx,ric3n))$ ric5n:ratsimp(subst(vyyn,vyy,ric4n))$ ric6n:ratsimp(subst(vzzn,vzz,ric5n))$ ric7n:ratsimp(subst(vxyn,vxy,ric6n))$ ric8n:ratsimp(subst(vxzn,vxz,ric7n))$ ric9n:ratsimp(subst(vyzn,vyz,ric8n))$ rican:ratsimp(subst(v0n,v0,ric9n))$ /* Ecco il test cruciale: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Ora verifico anche i termini NON DIAGONALI che possono essere diversi da zero se la funzione non possiede le opportune caratteristiche. */ rics:ratsimp(ric[2,3]); ric1:ratsimp(subst(vx,diff(a,x),rics))$ ric2:ratsimp(subst(vy,diff(a,y),ric1))$ ric3:ratsimp(subst(vz,diff(a,z),ric2))$ ric4:ratsimp(subst(vxx,diff(a,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(a,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(a,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(a,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(a,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(a,y),z),ric8))$ rica:ratsimp(subst(v0,a,ric9)); /* Ora sostituisco ai simboli le vere funzioni dedotte a partire da v0n. */ ric1n:ratsimp(subst(vxn,vx,rica))$ ric2n:ratsimp(subst(vyn,vy,ric1n))$ ric3n:ratsimp(subst(vzn,vz,ric2n))$ ric4n:ratsimp(subst(vxxn,vxx,ric3n))$ ric5n:ratsimp(subst(vyyn,vyy,ric4n))$ ric6n:ratsimp(subst(vzzn,vzz,ric5n))$ ric7n:ratsimp(subst(vxyn,vxy,ric6n))$ ric8n:ratsimp(subst(vxzn,vxz,ric7n))$ ric9n:ratsimp(subst(vyzn,vyz,ric8n))$ rican:ratsimp(subst(v0n,v0,ric9n))$ /* Ecco il test cruciale: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Verifico anche il termine NON DIAGONALE r[2,4] che puo' essere diverso da zero se la funzione non possiede le opportune caratteristiche. */ rics:ratsimp(ric[2,4]); ric1:ratsimp(subst(vx,diff(a,x),rics))$ ric2:ratsimp(subst(vy,diff(a,y),ric1))$ ric3:ratsimp(subst(vz,diff(a,z),ric2))$ ric4:ratsimp(subst(vxx,diff(a,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(a,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(a,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(a,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(a,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(a,y),z),ric8))$ rica:ratsimp(subst(v0,a,ric9)); /* Ora sostituisco ai simboli le vere funzioni dedotte a partire da v0n. */ ric1n:ratsimp(subst(vxn,vx,rica))$ ric2n:ratsimp(subst(vyn,vy,ric1n))$ ric3n:ratsimp(subst(vzn,vz,ric2n))$ ric4n:ratsimp(subst(vxxn,vxx,ric3n))$ ric5n:ratsimp(subst(vyyn,vyy,ric4n))$ ric6n:ratsimp(subst(vzzn,vzz,ric5n))$ ric7n:ratsimp(subst(vxyn,vxy,ric6n))$ ric8n:ratsimp(subst(vxzn,vxz,ric7n))$ ric9n:ratsimp(subst(vyzn,vyz,ric8n))$ rican:ratsimp(subst(v0n,v0,ric9n))$ /* Ecco il test cruciale: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Ora verifico anche il termine NON DIAGONALE r[3,4] che potrebbe essere diverso da zero se la funzione non possiede le opportune caratteristiche. */ rics:ratsimp(ric[3,4]); ric1:ratsimp(subst(vx,diff(a,x),rics))$ ric2:ratsimp(subst(vy,diff(a,y),ric1))$ ric3:ratsimp(subst(vz,diff(a,z),ric2))$ ric4:ratsimp(subst(vxx,diff(a,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(a,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(a,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(a,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(a,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(a,y),z),ric8))$ rica:ratsimp(subst(v0,a,ric9)); /* Ora sostituisco ai simboli le vere funzioni dedotte a partire da v0n. */ ric1n:ratsimp(subst(vxn,vx,rica))$ ric2n:ratsimp(subst(vyn,vy,ric1n))$ ric3n:ratsimp(subst(vzn,vz,ric2n))$ ric4n:ratsimp(subst(vxxn,vxx,ric3n))$ ric5n:ratsimp(subst(vyyn,vyy,ric4n))$ ric6n:ratsimp(subst(vzzn,vzz,ric5n))$ ric7n:ratsimp(subst(vxyn,vxy,ric6n))$ ric8n:ratsimp(subst(vxzn,vxz,ric7n))$ ric9n:ratsimp(subst(vyzn,vyz,ric8n))$ rican:ratsimp(subst(v0n,v0,ric9n))$ /* Ecco il test cruciale: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Per finire ristampo il tensore metrico covariante che ho usato per trovare la metrica del buco nero neutro in coordinate cartesiane. */ lg; /* E per riepilogo ecco anche il tensore metrico in forma controvariante: */ ug; /* AMEN */