/* Mio modello di linearizzazione della Relatività Generale

Un mio semplice modello per fare RG con molti buchi neri...

Per usare questo documento con wxMaxima eliminare l'estensione .html e dargli l'estensione .mac e poi fare la load di questo documento e fare tutti i controlli che si desiderano fare...
*/

/*

Modello di linearizzazione della RG

*/ /* Giampaolo Bottoni - 11 aprile 2010 + spiegazioni nel 20140220 Propongo un modo innovativo per linearizzare ( in modo NON lineare ) le equazioni della Relatività Generale. Con questo modello potrei studiare le interazioni gravitazionali tra buchi neri ed il pregio del modello e' che, nel caso in cui uno solo dei buchi neri sia nettamente prevalente su tutti gli altri, le equazioni ottenute tendono ad essere quelle ESATTE ossia tali per cui il tensore di Ricci risulti ovunque nullo. Nelle vicinanze di un singolo buco nero l'azione del buco nero e' nettamente prevalente rispetto a quelle di tutti gli altri e dunque questo modello fornisce una ottima approssimazione delle equazioni della RG tanto migliore quanto piu' la RG si discosta dal classico modello gravitazionale newtoniano. */ /* In altre parole , con questo modello si fanno muovere i buchi neri come se ciascuno di essi non influenzasse la metrica prodotta da tutti gli altri e poi, in questo modo si puo' studiare il moto di un pianeta nello spazio deformato da tante Stelle, non un solo Sole... */ (if atom(lg) then load(ctensor)); /* Inizializzo cosi' la libreria ctensor di wxMaxima. */ init_ctensor(); /* Definisco una funzione del tutto generica delle coordinate oltre alla funzione di servizio rq. */ rq:x^2+y^2+z^2; /* La funzione U(x,y,z) del tutto generica e' ricavata dalla classica funzione potenziale newtoniana. Specifico genericamente le variabili da cui dipende. */ depends(U,[x,y,z]); /* La funzione b mi serve solo per semplificare l'input. */ b:U/(U-1); /*

Ecco la proposta !

*/ /* Di una semplicita' APPARENTE estrema... */ lgmia: matrix ( [ 1-U, 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 alla libreria ctensor 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... */ ratsimp(ug . lg); /*

Per capire se l'ideuzza va bene...

*/ /* 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. */ /* Viene fuori una SBRODOLATA PAZZESCA ma QUESTA E' LA RG, bambola ! */ 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])]; /* Splendido ! ottengo una lista di 5 zeri ! */ /* Controllo che il tensore di Ricci sia 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]) ]; /* Splendido ! ottengo 3 zeri ! */ /* Questi non sono zeri ma se la funzione U(x,y,z) assume dei valori adeguati lo debbono diventare... Intanto li stampo... per far capire quanto sono complicati... */ 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]); /*

Nel caso di un singolo buco nero...

*/ /* Questo deve giustificare la mia proposta di generalizzazione */ /* Ora mi preparo a specificare cosa deve valere la funzione U(x,y,z) per fare in modo che la metrica sia quella di un singolo 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(U,x),rics))$ ric2:ratsimp(subst(vy,diff(U,y),ric1))$ ric3:ratsimp(subst(vz,diff(U,z),ric2))$ ric4:ratsimp(subst(vxx,diff(U,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(U,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(U,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(U,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(U,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(U,y),z),ric8))$ rica:ratsimp(subst(v0,U,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))$ /*

Questi sono controlli importantissimi...

*/ /* Ecco il TEST CRUCIALE: sostituendo e sostituendo alla fine viene zero o cosa vien fuori ? */ ratsimp(rican); /* Splendido: ottengo zero ! */ /* Ripeto tutta la procedura con ric[2,2] */ rics:ratsimp(ric[2,2]); ric1:ratsimp(subst(vx,diff(U,x),rics))$ ric2:ratsimp(subst(vy,diff(U,y),ric1))$ ric3:ratsimp(subst(vz,diff(U,z),ric2))$ ric4:ratsimp(subst(vxx,diff(U,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(U,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(U,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(U,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(U,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(U,y),z),ric8))$ rica:ratsimp(subst(v0,U,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); /* Splendido: ottengo zero ! DUNQUE L'APPROSSIMAZIONE IN QUESTO CASO E' ESATTA ! */ /* Ripeto tutta la procedura con ric[3,3] */ rics:ratsimp(ric[3,3]); ric1:ratsimp(subst(vx,diff(U,x),rics))$ ric2:ratsimp(subst(vy,diff(U,y),ric1))$ ric3:ratsimp(subst(vz,diff(U,z),ric2))$ ric4:ratsimp(subst(vxx,diff(U,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(U,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(U,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(U,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(U,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(U,y),z),ric8))$ rica:ratsimp(subst(v0,U,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); /* Splendido: ottengo zero ! */ /* Ripeto tutta la procedura con ric[4,4] */ rics:ratsimp(ric[4,4]); ric1:ratsimp(subst(vx,diff(U,x),rics))$ ric2:ratsimp(subst(vy,diff(U,y),ric1))$ ric3:ratsimp(subst(vz,diff(U,z),ric2))$ ric4:ratsimp(subst(vxx,diff(U,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(U,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(U,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(U,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(U,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(U,y),z),ric8))$ rica:ratsimp(subst(v0,U,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); /* Splendido: ottengo zero ! */ /* 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(U,x),rics))$ ric2:ratsimp(subst(vy,diff(U,y),ric1))$ ric3:ratsimp(subst(vz,diff(U,z),ric2))$ ric4:ratsimp(subst(vxx,diff(U,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(U,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(U,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(U,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(U,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(U,y),z),ric8))$ rica:ratsimp(subst(v0,U,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); /* Splendido: ottengo zero ! */ /* 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(U,x),rics))$ ric2:ratsimp(subst(vy,diff(U,y),ric1))$ ric3:ratsimp(subst(vz,diff(U,z),ric2))$ ric4:ratsimp(subst(vxx,diff(U,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(U,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(U,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(U,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(U,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(U,y),z),ric8))$ rica:ratsimp(subst(v0,U,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); /* Splendido: ottengo zero ! */ /* 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(U,x),rics))$ ric2:ratsimp(subst(vy,diff(U,y),ric1))$ ric3:ratsimp(subst(vz,diff(U,z),ric2))$ ric4:ratsimp(subst(vxx,diff(U,x,2),ric3))$ ric5:ratsimp(subst(vyy,diff(U,y,2),ric4))$ ric6:ratsimp(subst(vzz,diff(U,z,2),ric5))$ ric7:ratsimp(subst(vxy,diff(diff(U,x),y),ric6))$ ric8:ratsimp(subst(vxz,diff(diff(U,x),z),ric7))$ ric9:ratsimp(subst(vyz,diff(diff(U,y),z),ric8))$ rica:ratsimp(subst(v0,U,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); /* Splendido: ottengo zero ! */ /*

In conclusione...

*/ /* Per finire ristampo il tensore metrico covariante che ho usato per trovare la metrica del buco nero neutro in coordinate cartesiane. */ lg; /* Ossia:
 
Q = (1 −U)·(x2 + y2 + z2 )/U
gh,k= lg =






1 − U 0 0 0





0 −1 − x2/Q x·y/Q x·z/Q
0 x·y/Q −1 − y2/Q y·z/Q
0 x·z/Q y·z/Q −1 − z2/Q
*/ /* E per riepilogo ecco anche il tensore metrico in forma controvariante: */ ug; /* Ossia:
 
W = U/(x2 + y2 + z2 )
gh,k= ug =






1/(1 − U) 0 0 0





0 −1 + x2·W x·y·W x·z·W
0 x·y·W −1 + y2·W y·z·W
0 x·z·W y·z·W −1 + z2·W
*/ /*

Questa proprieta' e' importantissima !

*/ /* Una caratteristica fondamentale di questa metrica e' il fatto che il determinante vale -1 ossia e' identico a quello della metrica pseudoeuclidea. */ ratsimp(determinant(lg)); ratsimp(determinant(ug)); /*

Amen documento alla mia proposta di linearizzazione delle equazioni della Relativita' Generale.

Non resta che applicarlo ad una moltitudine di buchi neri per i quali la funzione U sara' una sommatoria di funzioni 1/r
*/