Skip to content

6. VQE Molecolare e Ottimizzazione Adam

tatopenn-cell edited this page Jul 22, 2026 · 2 revisions

6. VQE Molecolare e Ottimizzazione Adam

vqe_silicon_molecular.py mappa la curva di energia potenziale (PEC) Born-Oppenheimer di un dimero di silicio su una catena di 6 qubit:

$$E(R,\theta) = -\frac{t(R)}{2}K(\theta) + V_{rep}(R), \qquad t(R) = t_0 e^{-\beta(R-R_0)}, \quad V_{rep}(R) = V_0 e^{-\gamma(R-R_0)}$$

con $t_0=2.11\text{ eV}$, $\beta=1.5\ \text{Å}^{-1}$, $R_0=2.35\ \text{Å}$, $V_0=5.4\text{ eV}$, $\gamma=3.0\ \text{Å}^{-1}$, e $K(\theta)$ il termine cinetico $\langle XX+YY\rangle$ dell'ansatz (catena aperta CX–RY($\theta$)–CX–RY($-\theta$)–CX su 5 legami). Lo script originale usa un angolo variazionale fisso, $\theta=0.38\text{ rad}$, su tutti i 3.500 punti $R \in [1.2, 4.5]\ \text{Å}$.

vqe_silicon_molecular_optimized.py — ottimizzazione Adam reale

Sostituisce il $\theta$ fisso con una vera ottimizzazione Adam per ogni $R$, usando il gradiente esatto a regola della catena (stessa macchina del capitolo 3, verificato contro differenze finite e contro vqe_silicon_molecular.calcola_energia_molecolare a $\sim 10^{-9}$).

Tutti i punti $R$ sono ottimizzati in parallelo: ogni epoca di Adam raggruppa il $\theta$ corrente di ogni $R$ in un'unica chiamata run_parametric_batch_jit() (forma (n_R \times 21, 10)), non un ciclo annidato $R \times$ epoche.

Una scoperta fisica, non solo un numero migliore

Ottimizzando 200 punti $R$ indipendentemente, ci si aspetterebbe una curva $\theta^(R)$ variabile. Invece tutti convergono allo stesso $\theta^ \approx 0.613\text{ rad}$.

Il motivo è nella struttura dell'equazione: $t(R) > 0$ sempre, e $V_{rep}(R)$ non dipende da $\theta$. Quindi il minimo di $E$ rispetto a $\theta$ coincide sempre con il massimo di $K(\theta)$ — una condizione completamente indipendente da $R$, perché $R$ entra solo come prefattore moltiplicativo positivo davanti a un termine che dipende solo da $\theta$. Non è un bug dell'ottimizzatore: è una proprietà del modello.

Verificato indipendentemente: una scansione fine di $K(\theta)$ dà il vero massimo a $\theta=0.6129$; l'ottimizzatore converge a $0.613$.

L'impatto pratico resta reale

$\theta=0.38$ non era quel punto. Usare il $\theta^*$ corretto approfondisce la buca di legame: il minimo globale passa da $-0.302\text{ eV}$ a $R\approx3.32\ \text{Å}$ (fisso) a $-0.4615\text{ eV}$ a $R\approx3.17\ \text{Å}$ (ottimizzato), con un miglioramento che supera i $3\text{ eV}$ a corto raggio dove domina il termine cinetico.

Copertura test

tests/test_vqe_molecular_optimized.py: il gradiente batchato è verificato contro differenze finite e contro la funzione reale vqe_silicon_molecular.calcola_energia_molecolare (import diretto, non copiata); un run Adam a scala ridotta verifica che il gradiente si riduca sostanzialmente e che l'energia ottimizzata non sia mai peggiore del punto di partenza $\theta=0.38$.


vqe_silicon_molecular_optimized_per_bond.py — un angolo indipendente per legame

Il $\theta$ condiviso sopra è indipendente da $R$ per costruzione: $R$ entra solo come prefattore scalare positivo, quindi la posizione del massimo di $K$ non può dipendere da $R$, qualunque sia la forma di $K$. Una domanda più interessante: dando a ciascuno dei 5 legami il proprio angolo di Givens indipendente ($\theta_0,...,\theta_4$), invece di forzarli tutti uguali, l'ottimo trovato resta uniforme o si differenzia?

Si differenzia, in modo pulito: $\theta_0,...,\theta_4 \approx 0.234, 0.439, 0.632, 0.818, 1.024\text{ rad}$ — spaziatura quasi perfettamente costante di $\approx 0.2\text{ rad}$. Il minimo si approfondisce ulteriormente: da $-0.4615\text{ eV}$ (condiviso, ottimizzato) a $-0.6685\text{ eV}$ (per legame, ottimizzato).

La scoperta: l'ottimizzatore ritrova da solo lo stato fondamentale di una catena tight-binding

La spaziatura quasi lineare tra gli angoli non è il fenomeno di fondo — è un effetto collaterale di cosa l'ottimizzatore sta davvero trovando. L'ansatz a rotazioni di Givens sequenziali (CX–RY–CX–RY–CX per legame, a partire da $|100\ldots0\rangle$) può preparare qualsiasi stato normalizzato a singola eccitazione — è un circuito di preparazione universale per quel settore dello spazio di Hilbert. Quindi massimizzare l'energia cinetica totale $K(\vec\theta)$ su questo ansatz è un problema non vincolato: trova il vero massimo di $K$ su tutti i possibili stati a singola eccitazione, che coincide esattamente con il problema dell'autovalore massimo di una catena tight-binding aperta — la stessa matematica di una particella in una scatola. L'ottimizzatore, senza che nessuno gli dica nulla di fisica se non "massimizza questa energia", riscopre da solo lo stato fondamentale della scatola.

L'ampiezza al sito $q$ (0-indicizzato, $N$ siti) si assesta sul primo modo sinusoidale:

$$c_q \propto \sin!\left(\frac{(q+1)\pi}{N+1}\right), \qquad K_{max} = 4\cos!\left(\frac{\pi}{N+1}\right)$$

e l'angolo di Givens per legame che prepara questo profilo tramite la costruzione sequenziale ha a sua volta una forma chiusa ($r_q$ = la norma della coda $\sqrt{\sum_{k=q}^{N-1} c_k^2}$):

$$\theta_q = \arcsin!\left(\frac{c_q}{r_q}\right)$$

Nessun ottimizzatore necessario: inserendo questa formula direttamente nel circuito si riproduce il risultato ottimizzato con Adam a precisione macchina ($\sim 10^{-15}$), e vale per ogni lunghezza di catena testata (4, 5, 6, 7, 8, 10 qubit) — non è una coincidenza specifica di questo esempio a 6 qubit.

theta_ground_state_closed_form() / kinetic_max_closed_form() in vqe_silicon_molecular_optimized_per_bond.py implementano la formula chiusa. tests/test_vqe_molecular_per_bond.py::test_closed_form_ground_state_matches_script_kinetic_maximum e ::test_closed_form_generalizes_across_chain_lengths la verificano esattamente (nessuna tolleranza da ottimizzazione, solo precisione macchina).


Capitolo 5 · Home · Capitolo 7 ▶