Ebbene sì, oggi abbiamo superato noi stessi. Lo scopo è dimostrare che un'applicazione di meccanica quantistica, è possibile da realizzare anche in COBOL, linguaggio decisamente macchinoso e limitato, inadatto a tale scopo. Analogamente ad altri casi come COBOL - irraggiamento termico, a scopo dimostrativo lo facciamo rientrare nel "Just for Fun".
Effetto tunnel (Quantum tunnelling): premesse
Senza dilungarci troppo, vediamo per prima cosa il tema in questione. L'effetto tunnel è quel fenomeno unicamente quantistico (non ha un corrispettivo nella fisica classica) secondo il quale una particella abbia una probabilità sempre maggiore di zero di superare una determinata barriera (barriera di potenziale) anche se la propria energia sarebbe inferiore! Nella fisica classica, mondo macroscopico (e non scala atomica) la meccanica quantistica resta valida ma la una tale probabilità risulterebbe del tutto infinitesima e quindi si approssima allo zero, la fisica classica è infatti sufficientemente accurata per la nostra vita di tutti i giorni. Quando andiamo a considerare una singola particella però le cose cambiano, come vedremo poi anche da un esempio numerico. A livello concettuale è utile anche l'animazione che segue, tratta da Wikipedia (si vede che l'onda, particella, è in grado - almeno in parte, perdendo energia - di superare la barriera).
Effetto tunnel: ipotesi e dati di studio
Senza dilungarci troppo, occorre comunque fare delle precisazioni matematiche, fornire tutti i riferimenti.
- si parte dalla nota equazione di Schrödinger, caso 1D:
- ipotesi di stazionarietà (indipendenza dal tempo), quindi ∂/∂t=0
- h = costante di Planck, 6.62607015 * 10-34 J*s
- ħ = h/(2π), costante di Planck ridotta
- m = massa della particella: consideriamo un elettrone, massa pari a 9.11 * 10-34 kg
- V = barriera di potenziale, pari a 10-37 J
- definisco per comodità: k = 2mV/ħ2
- Xinf = 0 m
- Xsup = 0.5 m
Nota: visti i numeri in gioco, costante di Planck, massa dell'elettrone, barriera di potenziale, anziché creare tutte le variabili nel codice COBOL che segue, è stato più comodo definire k (non a caso, la scelta del valore di V è stata fatta per "bilanciare" le dimensioni dei termini), altrimenti ci può essere difficoltà nella rappresentazione e gestione di tutte queste cifre decimali e i numeri risultanti.
Con queste ipotesi ottengo: k=16.40088 m-2
Andando avanti con il formalismo matematico:
- sappiamo che l'equazione viene risolta (analiticamente in questo caso, altrimenti per via numerica) nella variabile Ψ, funzione d'onda
- il risultato finale che ci interessa è la probabilità che la particella riesca a superare la barriera entro un range Xinf e Xsup (Xinf pari a zero ovvero semplicemente "superare la barriera" nel nostro caso, fino al valore di Xsup); nel caso si voglia semplicemente discriminare il passaggio attraverso la barriera (qualunque profondità), Xinf=0 e Xsup=∞, cosa che semplificherebbe alcuni termini. In ogni caso, la probabilità è data da:
- la risoluzione analitica dell'equazione di Schrödinger è: Ψ(x)=C1e√k*x+C2e-√k*x, C1 e C2 costanti da determinare
- deve avere forma di esponenziale decrescente (quindi non può divergere ma deve anzi tendere a zero per x che tende ad infinito) e per x=0 abbiamo Ψ=1 dato che P=|Ψ|2=1, risulta: Ψ(x)=e-√k*x quindi P( x=[Xinf : Xsup] ) = (1/(2√k)) * (e-2√k*Xinf - e-2√k*Xsup), dato che l'integrale consente in questo caso risoluzione analitica.
COBOL: effetto tunnel - esempio numerico
Si riporta dunque tutto il codice, compilato tramite GnuCOBOL (cobc) 3.1.2.0, che richiede la scomoda identazione (ogni riga deve iniziare con un numero identificativo es. 000100, 000200 e così via, cosa che altri compilatori più moderni non richiedono).
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. QUANTUM-TUNNELLING.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 e PIC 9V9(16) VALUE 2.7182818284590452.
000600 01 k PIC 999V9(21) VALUE 16.4008799945.
000700 01 Xinf PIC 9V9(12) VALUE 0.
000800 01 Xsup PIC 99V9(12) VALUE 0.5.
000900 01 P PIC 9V9(24).
001000 01 TEMP1 PIC 9(14)V9(24).
001100 01 TEMP2 PIC 9(14)V9(24).
001200 PROCEDURE DIVISION.
001300 COMPUTE TEMP1=k**0.5.
001400 MULTIPLY TEMP1 BY -1 GIVING TEMP1.
001500 MULTIPLY TEMP1 BY 0.5 GIVING TEMP1.
001600 MULTIPLY TEMP1 BY Xsup GIVING TEMP2.
001700 MULTIPLY TEMP1 BY Xinf GIVING TEMP1.
001800 COMPUTE TEMP1=e**TEMP1.
001900 COMPUTE TEMP2=e**TEMP2.
002000 SUBTRACT TEMP2 FROM TEMP1 GIVING TEMP1.
002100 COMPUTE P=k**0.5
002200 DIVIDE P INTO 1 GIVING P.
002300 MULTIPLY P BY 0.5 GIVING P.
002400 MULTIPLY P BY TEMP1 GIVING P.
002500 DISPLAY "P=" P.
002600 STOP RUN.
002700
Con questi valori di esempio, caso di studio indicativo, si ottiene un valore di probabilità di superare la barriera pari a circa 0.216 (21,6%) quindi tutt'altro che trascurabile (questo è indicativo, viste poi le grandezze in gioco, a seconda dei byte di memoria che allochiamo alle singole variabili possiamo avere risultati un po' differenti, il concetto comunque è questo)!
Provando ad inserire nella formula numeri diversi, a cui siamo abituati nel mondo macroscopico (NB magari anche "a mano", non tramite COBOL) si ottengono valori perfettamente in linea con la realtà classica ovvero assolutamente prossimi allo zero. Esempio: se una singola particella (elettrone), con questi dati, ha una probabilità del 21% circa, dieci particelle uguali avrebbero una probabilità di passare tutte pari a 0.2110, meno di una probabilità su un milione. Se consideriamo poi miliardi di particelle, è chiaro che la fisica quantistica per il mondo macroscopico diventa del tutto trascurabile.