pub struct SchrodingerSolver<const N: usize> {
pub potential: [f32; N],
pub dx: f32,
pub hbar: f32,
pub mass: f32,
}Expand description
Solveur de l’équation de Schrödinger indépendante du temps en 1D.
La résolution est basée sur la méthode de tir (shooting method) combinée à une dichotomie binaire de 30 itérations.
L’implémentation est entièrement no_std, sans libm ni liaison C.
Toute opération de racine carrée est déléguée à
embedded-f32-sqrt, qui utilise
l’algorithme de Newton-Raphson sur f32 IEEE 754.
§Paramètre générique
N : nombre de points de la grille spatiale (doit être ≥ 3).
§Exemple
use embedded_schrodinger::SchrodingerSolver;
const N: usize = 100;
// Puits de potentiel infini (V = 0 à l'intérieur)
let potential = [0.0f32; N];
// Unités atomiques : ħ = 1, m = 1, dx = 0.01
let solver = SchrodingerSolver::new(potential, 0.01, 1.0, 1.0);
let mut psi = [0.0f32; N];
let energy = solver.find_eigenstate(0.1, 20.0, &mut psi)
.expect("Pas de solution trouvée dans l'intervalle donné");
// En unités atomiques, E₁ ≈ π²/2 ≈ 4.935 pour L = 1 (N·dx = 1.0)
assert!((energy - 4.935).abs() < 0.5);Fields§
§potential: [f32; N]Tableau du potentiel discret V(xᵢ) sur la grille spatiale.
dx: f32Pas spatial dx (en mètres ou en unités réduites selon le système).
hbar: f32Constante de Planck réduite ħ (en J·s ou unités réduites).
mass: f32Masse de la particule m (en kg ou unités réduites).
Implementations§
Source§impl<const N: usize> SchrodingerSolver<N>
impl<const N: usize> SchrodingerSolver<N>
Sourcepub fn new(potential: [f32; N], dx: f32, hbar: f32, mass: f32) -> Self
pub fn new(potential: [f32; N], dx: f32, hbar: f32, mass: f32) -> Self
Crée un nouveau solveur.
§Arguments
potential— valeurs deV(xᵢ)auxNpoints de la grille.dx— pas spatial uniforme.hbar— constante de Planck réduiteħ.mass— masse de la particule.
§Exemple
use embedded_schrodinger::SchrodingerSolver;
let solver = SchrodingerSolver::<64>::new([0.0f32; 64], 0.01, 1.0, 1.0);Sourcepub fn integrate_wavefunction(&self, energy: f32, psi: &mut [f32; N]) -> f32
pub fn integrate_wavefunction(&self, energy: f32, psi: &mut [f32; N]) -> f32
Intègre la fonction d’onde de gauche à droite pour une énergie energy donnée.
Applique la relation de récurrence issue de la discrétisation de l’équation de Schrödinger par différences finies centrées :
ψᵢ₊₁ = 2ψᵢ − ψᵢ₋₁ − (2m·dx²/ħ²)(E − V(xᵢ))ψᵢLes conditions aux limites initiales sont celles d’un puits infini :
ψ(0) = 0, ψ(1) = 0.001 (impulsion de départ arbitraire).
§Valeur de retour
Valeur de ψ au dernier point de la grille (ψ[N-1]).
Si la propagation diverge (NaN ou infini), la dernière valeur saine est renvoyée.
Sourcepub fn normalize(&self, psi: &mut [f32; N]) -> Result<(), &'static str>
pub fn normalize(&self, psi: &mut [f32; N]) -> Result<(), &'static str>
Normalise la fonction d’onde ψ selon la condition ∫|ψ|² dx = 1.
L’intégration numérique est effectuée par la méthode des rectangles.
La racine carrée est calculée via
embedded_f32_sqrt::sqrt (Newton-Raphson, aucun recours à libm).
§Erreurs
"Erreur mathématique lors du calcul de la norme (NaN/Infinity)"si la somme produit une valeur non-numérique."Impossible de normaliser une fonction d'onde de norme nulle"si la norme calculée est nulle.
Sourcepub fn find_eigenstate(
&self,
e_min: f32,
e_max: f32,
psi: &mut [f32; N],
) -> Result<f32, &'static str>
pub fn find_eigenstate( &self, e_min: f32, e_max: f32, psi: &mut [f32; N], ) -> Result<f32, &'static str>
Recherche un état propre (énergie + fonction d’onde) par la méthode de tir.
L’algorithme effectue une dichotomie binaire sur l’intervalle [e_min, e_max].
À chaque itération, il intègre ψ et analyse la valeur frontière droite pour
déterminer de quel côté se trouve la valeur propre recherchée.
30 itérations donnent une précision de l’ordre de 2⁻³⁰ de l’intervalle
initial, soit la précision machine du type f32.
§Arguments
e_min— borne basse de la plage de recherche (unité cohérente avechbar/mass).e_max— borne haute de la plage de recherche.psi— tampon mutable où sera écrite la fonction d’onde normalisée.
§Valeur de retour
Ok(energy)— énergie propre convergée en unité choisie.Err(msg)— si la normalisation finale échoue.
§Exemple
use embedded_schrodinger::SchrodingerSolver;
const N: usize = 200;
let solver = SchrodingerSolver::new([0.0f32; N], 0.005, 1.0, 1.0);
let mut psi = [0.0f32; N];
let e1 = solver.find_eigenstate(1.0, 10.0, &mut psi).unwrap();
// En unités atomiques, E₁ ≈ π²/2 ≈ 4.935
assert!((e1 - 4.935).abs() < 0.3);