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
*/