Skip to main content

SchrodingerSolver

Struct SchrodingerSolver 

Source
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: f32

Pas spatial dx (en mètres ou en unités réduites selon le système).

§hbar: f32

Constante de Planck réduite ħ (en J·s ou unités réduites).

§mass: f32

Masse de la particule m (en kg ou unités réduites).

Implementations§

Source§

impl<const N: usize> SchrodingerSolver<N>

Source

pub fn new(potential: [f32; N], dx: f32, hbar: f32, mass: f32) -> Self

Crée un nouveau solveur.

§Arguments
  • potential — valeurs de V(xᵢ) aux N points 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);
Source

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.

Source

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.
Source

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 avec hbar/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);

Auto Trait Implementations§

§

impl<const N: usize> Freeze for SchrodingerSolver<N>

§

impl<const N: usize> RefUnwindSafe for SchrodingerSolver<N>

§

impl<const N: usize> Send for SchrodingerSolver<N>

§

impl<const N: usize> Sync for SchrodingerSolver<N>

§

impl<const N: usize> Unpin for SchrodingerSolver<N>

§

impl<const N: usize> UnsafeUnpin for SchrodingerSolver<N>

§

impl<const N: usize> UnwindSafe for SchrodingerSolver<N>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.