Newsgroup: it.scienza.fisica
Titolo: 1-dim Schroedinger equation solver

Sto cercando un programma, preferibilmente in sorgente C o
C++ (compilabile in Linux sarebbe l'ideale), che trovi gli
autostati di un sistema in una dimensione (per il momento)
con V(x) assegnato numericamente (indipendente dal tempo).
Non ho trovato molto, finora; poca roba e perloppiu' in
Fortran o Java con chiamate a vari strati di librerie
esterne di algebra lineare.
Qualcuno conosce qualcosa di un pelino piu' pratico da
usare per un comune programmatore o devo cominciare a
studiarmi il Fortran e installare mezzo mondo?
Mi servirebbe il sorgente sia perche' mi fido poco a
usare programmi simili senza sorgente, sia per poterlo
eventualmente modificare (es. specificare la V(x) nel
sorgente, usare eventualmente una risoluzione
variabile da zona a zona, eccetera), sia perche' mi
piace capire quello che faccio.
 
Ciao
Paolo Russo

suppongo che tu voglia soluzioni CAS
 
se è così dubito che tu possa riscriverti un software adatto (nel senso che sarebbe un'impresa titanica per una persona sola e nemmeno molto specializzata).
E perchè Java e/o fortran non vanno bene?
 
Se hai avuto la fortuna di trovare un fortran che fa al caso tuo, qual è il problema?

 è il problema?
 
Come faccio a sapere se ho trovato un programma in
Fortran che fa al caso mio, se per saperlo dovrei
prima capirlo e provarlo, il che implica investire
un bel po' di tempo a documentarmi e a installare
roba? E se poi alla fine tutto funziona e voglio
fare un grafico, faccio grafica X o uso tool di
sviluppo vari con il Fortran? O mescolo con il C
e linko assieme? Vado in gdb o ddd saltando da un
mondo all'altro?
Non mi fraintendere: se s'ha da fare, si fa; non
sara' poi peggio che ottimizzare routine di image
processing in assembler Intel con estensioni
sconosciute alla toolchain, o debuggare device
driver privi di sorgente, o patchare bitstream
di FPGA il cui sistema di sviluppo e` andato perso
... (*), ma proprio se s'ha da fare. Devo proprio
complicarmi la vita anche nel tempo libero?
Capisco che il Fortran possa essere la scelta piu'
ovvia per un fisico, ma... per un fisico, appunto.
 
Ciao
Paolo Russo
 
(*) i puntini sostituiscono un'interminabile
sfilza di lavori assurdi, del classico tipo "che
voi umani non potete neanche immaginare".

 ovvia per un fisico, ma... per un fisico, appunto.
 
 
il fortran è proprio semplice
 
ma semplice semplice
 
 

 :)
 
Non mi sono ancora rassegnato...
 
Ciao
Paolo Russo

 
 
Ciao, di programmi in C o C++ non ne conosco, in fortran si'. In ogni
caso, come fatto notare da marcofuics, la complessita' del programma
dipende fortemente da quali funzioni supponi siano disponibili `a
gratis', in altre parole se ti va bene usare librerie (le boost in C)
per cose tipo trovare autovalori/autovettori o se vuoi un programma del
tutto self-contained. In ogni caso il metodo dell'articolo citato (che
ho letto molto velocemente) e' semplice concettualmente ma NON
efficiente per potenziali generici! calcolare f(X) dove X e' una matrice
costa un sacco di operazioni e ci sono metodo molto piu' efficienti. In
particolare, il metodo citato mi pare ad occhio una riscoperta del
metodo DVR (discrete variable representation) cosi' come era stato
scoperto negli anni '60. Se consideri disponibile una routine per
autovalori/vettori di una matrice uno dei metodi migliori IMHO e' il
cosiddetto DVR Colbert-Miller (formula A7 di
http://xbeams.chem.yale.edu/~batista/v572/ColbertMiller.pdf
 , e aggiungi
il potenziale sulla diagonale della matrice), altrimenti se vuoi fare
tutto tu da solo considera raffinamenti del classico metodo di Numerov,
vedi ad es.
http://scitation.aip.org/content/aip/journal/jcp/88/6/10.1063/1.453880
 
 
In ogni caso, a cosa ti serve? Qual'e' la forma del potenziale? Ha
singolarita'? Ti interessano solo gli stati legati? Risonanze?
 
L.

 
 
clapack e gsl. La prima è BLAS (un po' lowlevel), la seconda è abbastanza ad
alto livello da riscrivere le tue otto righe in matlab con una ventina in C
senza ammattire troppo (non garantisco eh, vado ad occhio).
 
Ciao!

 singolarita'? Ti interessano solo gli stati legati? Risonanze?
Oh, finalmente!
Non avevo ancora trovato il tempo, ma friggevo per dire che uno dei
primi insegnamenti in materia di calcolo numerico è che non esistono
metodi buoni per tutte le stagioni.
Invece l'OP ha fatto una richiesta assolutamente (troppo) generica, e
avrebbe dovuto avere subito la risposta che è arrivata soltanto ora.
 
Aggiungerei ancora:
- vuoi *tutti* gli autovalori o solo alcuni?
- con che approssimazione?
 
 
-- 
Elio Fabri

 ad occhio).
 
Grazie, mi guardo la documentazione appena riesco.
Penso che mi saranno molto utili.
 
Ciao
Paolo Russo

 - con che approssimazione?
 
Anche grossolana. Un'approssimazione del 10% non sarebbe
neanche tanto male, voglio giusto farmi un'idea di quel che
succede. Pero` mi interessano anche gli autovettori
corrispondenti; non vorrei che venissero troppo
approssimativi ai bordi ripidi. Come dicevo, temo che questo
mi dara` problemi; probabilmente dovro` aumentare molto la
risoluzione spaziale per limitare l'errore in quelle zone. Un
metodo che mi consentisse una risoluzione spaziale variabile
da zona a zona sarebbe probabilmente l'ideale.
 
Ciao
Paolo Russo

 da zona a zona sarebbe probabilmente l'ideale.
 
 
Ciao, in sintesi:
 
 
 
1) Se il potentiale e' semplice come dici tu, ti interessano cosi' pochi stati e con cosi' poca precisione praticamente qualsiasi metodo "va bene". In pratica lo potresti fare anche con un semplice foglio elettronico (conti del genere venivano addirittura fatti in anni <~1955, per esempio da Hartree per la soluzione nel metodo di Hartree(-Fock) per atomi, dove il problema si riduce proprio a un sistema di equazioni di schrodinger monodimensionali accoppiate, da risolvere  in maniera iterativa). Per esempio questa procedura e' descritta passo-passo nel libro `Quantum Chemistry' di Levine.
 
 
 
2) I bordi ripidi che dici tu, se non hanno discontinuita', non complicano affatto e anzi semplificano; la funzione d'onda quando penetra una zona di potentiale 'proibita' (con V(r) > E, dove E e' l'energia dello stato) decade esponenzialmente e questo comportamento e' facile da descrivere e da una chiara indicazione su come troncare la griglia di punti o il set di funzioni di base usate.
 
 
3) Per i tuoi requisiti un metodo con punti non equispaziati e' esagerazione, praticamente come uccidere un moscerino con la bomba atomica. Comunque se ti va di approfondire guarda ad es. 
http://pra.aps.org/abstract/PRA/v78/i5/e052510
 
 
4) Sarei veramente curioso di sapere a cosa ti serve tutto cio'... da che parte viene il potenziale? Oppure e' un segreto? :-)
 
Ciao, L.

 che parte viene il potenziale? Oppure e' un segreto? :-)
 
Storia lunga...
Anni fa avevo scritto un programmino che simulava
l'evoluzione temporale di un pacchetto d'onde che trovava
sulla sua strada un qualunque potenziale assegnato, tanto per
divertirmi un po' con cose come effetto tunnel. Dopo un primo
tentativo ingenuo e disastroso di simulazione diretta nel
dominio dello spazio, mi ero reso conto che dovevo ricavarmi
prima gli stati stazionari con sistemi di N equazioni a N
incognite, per poi poter ricavare lo stato del pacchetto in
qualsiasi istante sommando le soluzioni base con le fasi
opportune. Ricordo che all'epoca mi aveva colpito molto il
fatto che il modo migliore di calcolare uno stato futuro non
fosse quello di passare per gli stati intermedi, cosa che mi
ha pure ispirato nello scrivere un racconto di fantascienza
basato proprio sull'idea che un ipotetico fenomeno capace di
cambiare la fase degli stati stazionari consentisse a un
sistema di passare direttamente a uno stato futuro senza
passare per quelli intermedi.
 
Piu' recentemente ho letto un articolo (non recentissimo)
che ho trovato interessante per certi aspetti, ma le cui
conclusioni non mi hanno convinto del tutto. L'articolo
faceva tutta una serie di assunzioni e semplificazioni, che
onestamente sono incapace di seguire, per risolvere il
sistema analiticamente.
Mi sono detto "perche' non usare il mio vecchio programma per
verificare numericamente un po' di cosette, tra cui l'effetto
reale di certe assunzioni e condizioni al contorno?" ma ci ho
messo poco a rendermi conto che il mio vecchio programmino
non faceva quello che mi serviva. Avrei potuto rinunciare ma
ormai mi ero messo in testa di farlo.
Per quanto riguarda l'articolo che vorrei rianalizzare,
preferirei non citarlo, anche perche' potrebbero arrivarmi
opinioni e consigli, mentre questa e` una cosuccia che mi
sono ripromesso di fare il piu' possibile da solo; diciamo
che nel (poco) tempo libero sto giocando al piccolo fisico.
Ecco, magari per cose come programmi e algoritmi numerici
generici mi pareva assurdo reinventare l'acqua calda, ma
per quanto riguarda il contenuto scientifico in se' vorrei
davvero fare da solo.
 
Vorra` dire che se mai ne dovessi cavar fuori un paperello,
evenienza che considero a dir poco improbabile, vi citero`
nei ringraziamenti. :-)
 
Ciao
Paolo Russo