/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/
/* [ Created with wxMaxima version 13.04.2 ] */

/* [wxMaxima: comment start ]
Uno studio per la Befana 2015 e rifatto nel 2016...
( mancano 84 anni al 2100 )
   [wxMaxima: comment end   ] */

/* [wxMaxima: title   start ]
Lorentz in modo semplicissimo
   [wxMaxima: title   end   ] */

/* [wxMaxima: section start ]
Prima variante:
   [wxMaxima: section end   ] */

/* [wxMaxima: comment start ]
Questa funzione crea la matrice di Lorentz facendo 
pero' uso della funzione sqrt(...) quindi con un piccolo 
rischio di complicazioni numeriche ossia che Maxima si 
incasini e non riesca a semplificare le espressioni.
---
Questa funzione ha bisogno di due dati:
1) Il vettore che specifica la direzione della trasformazione
ossia un vettore di 4 elementi di cui almeno uno dei primi 
tre elementi non deve essere nullo e l'ultimo, che controlla 
la formula globale, DEVE ESSERE OBBLIGATORIAMENTE POSITIVO,
MAI NULLO.
2) La velocita' della luce ossia un numero positivo e mai nullo.
---
Questa funzione produce tre risultati ossia :
1) La trasformazione di Lorentz.
2) Il quadrivettore che viene "fermato" dalla trasformazione
di Lorentz ossia la trasformazione di Lorentz moltiplicata
per questo vettore da' un vettore con le componenti spaziali
tutte nulle.
3) Il tensore metrico covariante che si usa e che dipende
da quale e' considerata la velocita' della luce nel vuoto.
---
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lsemplice(br,lux):=block([bd,bx,by,bz,cm,sh,lz,uu,gm],
bd:sqrt(br[1]*br[1]+br[2]*br[2]+br[3]*br[3]),
bx:br[1]/bd,
by:br[2]/bd,
bz:br[3]/bd,
cm:(br[4]+1/br[4])/2-1,
sh:(br[4]-1/br[4])/2,
lz:matrix([1+cm,-sh*bx/lux,-sh*by/lux,-sh*bz/lux],
[-lux*sh*bx,1+cm*bx*bx,cm*bx*by,cm*bx*bz],
[-lux*sh*by,cm*bx*by,1+cm*by*by,cm*by*bz],
[-lux*sh*bz,cm*bx*bz,cm*by*bz,1+cm*bz*bz]),
uu:[1+cm,lux*sh*bx,lux*sh*by,lux*sh*bz],
gm:matrix([lux*lux,0,0,0],
[0,-1,0,0],[0,0,-1,0],[0,0,0,-1]),
return ([lz,uu,gm]))$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Verifico che la funzione data funzioni bene scegliendo 
bene i dati in modo da non ottenere radici quadrate.
Quindi Maxima non deve fare praticamente nessuna fatica 
a semplificare i risultati...
Definisco tre vettori il cui significato sara' 
spiegato poi...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
cluce:7;
besea:[3/13,4/13,12/13,9];
beseaq:[3/13,4/13,12/13,81];
beseasq:[3/13,4/13,12/13,3];
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Ecco il calcolo applicato al primo vettore....
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lzz:lsemplice(besea,cluce);
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Verifico che la trasformazione di Lorentz, applicata al 
quadrivettore calcolato, lo fermi veramente ed inoltre la 
trasformazione di Lorentz, applicata al tensore metrico 
covariante, non lo modifica ossia lo lascia immutato...
---
Attenzione. Se la velocita' della luce non vale 1, 
la matrice della trasformazione di Lorentz 
NON E' SIMMETRICA per cui va usata anche la sua 
trasposta ottenuta con la transpose(...) di Maxima.
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
print("La trasformata di Lorentz e' lzz[1] ",lzz[1])$
print("lzz[2] e' il vettore usato= ",lzz[2])$
print("La norma di lzz[2]= ",lzz[2].lzz[3].lzz[2])$
print("Usando lzz[1] il vettore dovrebbe essere ",
  "FERMO ossia zero tutte le sue componenti spaziali")$
unuovo:lzz[1].lzz[2]$
print("unuovo = ",unuovo)$
print("La norma di unuovo deve essere invariata ",
  "ossia unuovo.lzz[3].unuovo = ",
unuovo.lzz[3].unuovo)$
print("Come e' il tensore metrico all'inizio =",
   lzz[3])$
print("Dopo la trasformazione il tens.metrico",
      " deve essere identico")$
transpose(lzz[1]).lzz[3].lzz[1];
print("Ho scritto: transpose(lzz[1]).lzz[3].lzz[1] ")$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Qui mostro come fare il quadrato della trasformazione di
Lorentz ossia cosa viene, applicata due volte di seguito...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lzzq:lsemplice(beseaq,cluce);
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Dimostro che effettivamente lzzq[1] e' il quadrato di lzz[1].
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lzzq[1]-lzz[1].lzz[1];
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Dimostro come si fa la radice quadrata della matrice che 
rappresenta la trasformazione di Lorentz ossia lzzsq[1] 
moltiplicata per se stessa deve dare lzz[1]...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lzzsq:lsemplice(beseasq,cluce);
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Dimostro che realmente lzzsq[1] e' la radice quadrata di lzz[1]...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lzz[1]-lzzsq[1].lzzsq[1];
/* [wxMaxima: input   end   ] */

/* [wxMaxima: section start ]
Seconda variante: 
W la razionalita' !!!
   [wxMaxima: section end   ] */

/* [wxMaxima: comment start ]
Questa funzione e' simile a quella precedente ma ha 
il GRANDE PREGIO DI NON FARE USO DELLA sqrt(...).
Per evitare problemi impedisco di usare come primo
argomento il valore zero che darebbe divisione per zero
e dunque dati infiniti ossia errore di calcolo....
Il secondo ed il terzo argomento possono essere dati 
qualsiasi ed il quarto e' la velocita' della luce nel 
vuoto che deve ovviamente non essere mai uno zero..
Se si assegna zero viene usato il valore 1.
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lrazionale(rd,f,h,xlux):=block([r,lux,bx,by,bz,cm,sh,
    lz,uu,gm],
if rd=0 then r:1 else r:rd,
if xlux=0 then lux:1 else lux:abs(xlux),
bx:2*h*(1-f*f)/((1+f*f)*(1+h*h)),
by:4*h*f/((1+f*f)*(1+h*h)),
bz:(1-h*h)/(1+h*h),
cm:(r+1/r)/2-1,
sh:(r-1/r)/2,
lz:matrix([1+cm,-sh*bx/lux,-sh*by/lux,-sh*bz/lux],
[-lux*sh*bx,1+cm*bx*bx,cm*bx*by,cm*bx*bz],
[-lux*sh*by,cm*bx*by,1+cm*by*by,cm*by*bz],
[-lux*sh*bz,cm*bx*bz,cm*by*bz,1+cm*bz*bz]),
uu:[1+cm,lux*sh*bx,lux*sh*by,lux*sh*bz],
gm:matrix([lux*lux,0,0,0],
[0,-1,0,0],[0,0,-1,0],[0,0,0,-1]),
return ([lz,uu,gm]))$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Ecco l'applicazione della funzione che produce 
sempre numeri razionali se gli argomenti di ingresso 
sono anche loro razionali...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lrr:lrazionale(1+random(7)/11,random(19)/17,
    random(23)/19,cluce);
lrr[2].lrr[3].lrr[2];
urnuovo:lrr[1].lrr[2];
urnuovo.lrr[3].urnuovo;
print("Come e' il tensore metrico all'inizio")$
lrr[3];
print("Dopo la trasformazione ",
   " il tens.metrico deve essere identico")$
transpose(lrr[1]).lrr[3].lrr[1];
/* [wxMaxima: input   end   ] */

/* [wxMaxima: input   start ] */
lrra:lrazionale(25,4,7,cluce);
lrraq:lrazionale(25*25,4,7,cluce);
lrrasq:lrazionale(5,4,7,cluce);
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Bene se ottengo solo zeri...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
lrra[1].lrra[1]-lrraq[1];
lrrasq[1].lrrasq[1]-lrra[1];
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Altre funzioni di servizio, utili per gestire i vettori
con le convenzioni usate qui...
   [wxMaxima: comment end   ] */

/* [wxMaxima: comment start ]
Questa piccola funzione normalizza ad 1 la sola parte 
spaziale di un quadrivettore a meno che non abbia tutte 
le componenti spaziali nulle nel qual caso da' 
un vettore di 3 dimensioni di zeri. 
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
v3norma(vv):=block([vsq,vn],
  vsq:sqrt(vv[2]^2+vv[3]^2+vv[4]^2),
  if vsq=0 then return([0,0,0]),
  vn:ratsimp([vv[2]/vsq,vv[3]/vsq,vv[4]/vsq]),
  return (vn))$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
In coordinate sferiche indicate da ra, f ed h puo' 
servire passare alle tradizionali cartesiane...
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
incart(ra,f,h):=block([bx,by,bz],
  bx:2*h*(1-f*f)/((1+f*f)*(1+h*h)),
  by:4*h*f/((1+f*f)*(1+h*h)),
  bz:(1-h*h)/(1+h*h),
  return( [ra*bx,ra*by,ra*bz] ) )$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: section start ]
Conclusione
   [wxMaxima: section end   ] */

/* [wxMaxima: comment start ]
Le due funzioni qui definite e sperimentate:
lsemplice(br,lux) e lrazionale(rd,f,h,xlux)
chiariscono la struttura della trasformazione di Lorentz 
e, la seconda, a mio parere, e' utilissima per lavorare 
solo con numeri razionali e quindi operando con la massima 
precisione possibile su qualsiasi calcolatore.
   [wxMaxima: comment end   ] */

/* [wxMaxima: input   start ] */
print("Qui sono definite due funzioni:")$
print("lsemplice(br,lux)")$
print("lrazionale(rd,f,h,xlux)")$
print("E varie variabili, ad esempio: besea =",besea,
 " e cluce=",cluce)$
print("Matrici lzz[1]=",lzz[1]," e lrra[1]=",lrra[1])$
/* [wxMaxima: input   end   ] */

/* [wxMaxima: input   start ] */
lzz[1].lzz[2];
/* [wxMaxima: input   end   ] */

/* [wxMaxima: comment start ]
Qui sono definite anche le due funzioni ausiliarie
v3norma(vv) e incart(ra,f,h).
   [wxMaxima: comment end   ] */

/* [wxMaxima: comment start ]
Le formule qui applicate sembrano banali, data la
loro semplicita' ma... a me sembra che siano
raramente usate in letteratura e nell'insegnamento...
   [wxMaxima: comment end   ] */

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