clear all                           % Programm zur numerischen Berechnung der zeitabhängigen Wellenfunktion eines Atoms mit Z Elektronen
clc                                 % Programm funktioniert mit beliebiger Anzahl an Elektronen

Z = 1;                              % Ordnungs-/Elektronen-/Protonenzahl des Atomes
e0 = 8.85418781762*10^(0-12);       % Permittivität
me = 9.10938291*10^(0-31);          % Elektronenmasse
h = 6.62606957*10^(0-34);           % planksches Wirkungsquantum
e = 1.602176565*10^(0-19);          % Elementarladung
a0 = 0.52917721092*10^(0-10);       % bohrscher Radius
I = [-1:0.02:1].*(a0.*4);           % Intervall zur numerischen Auswertung Differential
I0 = I(2:(end-1));                  % Intervall zur numerischen Auswertung 2 Elemente weniger, da 2 beim Differenzenquozienten verloren gehen x
I_1= I(1:(end-2));                  % Intervall zur numerischen Auswertung 2 Elemente weniger, da 2 beim Differenzenquozienten verloren gehen x-dx
I1 = I(3:end);                      % Intervall zur numerischen Auswertung 2 Elemente weniger, da 2 beim Differenzenquozienten verloren gehen x+dx
Ik = [I1;I0;I_1];                   % alle 3 Intervalle werden in einer Matrix abgespeichert 
t = [0:0.01:1];                     % Intervall Zeit
dIndizes = 2:(numel(I)-1);          % Vektor zur Indizierung für nicht betroffene x,y,z 1.Ableitung
ddIndizes = 1:(numel(I)-2);         % Vektor zur Indizierung für nicht betroffene x,y,z 2.Ableitung

for k=1:(3.*Z)
   
    dimension = ones(1,3.*Z);              % für reshape, richtet das Intervall in die gewünschte Richtung (Dimension) aus
    dimension(k) = numel(I0);
    matrix = ones(1,3.*Z).*numel(I0);       % für repmat, macht aus dem Vektor eine Matrix in 3Z Dimensionen
    matrix(k) = 1;
    
    X0 = repmat(reshape(I0,dimension),matrix); % 3Z dimensionale Matrix für jede Richtung; enthält Intervall für phi("x")
   
    matrizen0{k} = X0;                        % abspeichern der Intervallmatrizen in eine Zelle, zum leichteren auslesen
  
end

for k=1:(3.*Z)
    
    matrizen=matrizen0;
    
    for m=1:3
    
        dimension = ones(1,3.*Z);               % für reshape, richtet das Intervall in die gewünschte Richtung (Dimension) aus
        dimension(k) = numel(I0);
        matrix = ones(1,3.*Z).*numel(I0);       % für repmat, macht aus dem Vektor eine Matrix in 3Z Dimensionen
        matrix(k) = 1;
    
        X0 = repmat(reshape(Ik(m,:),dimension),matrix); % 3Z dimensionale Matrix für jede Richtung; enthält Intervall für phi("x+dx/x/x-dx"), Auswahl erfolgt mit m 
    
        matrizen{k}=X0;
    
        phi = exp(0-sqrt(matrizen{1}.^2+matrizen{2}.^2+matrizen{3}.^2.)/a0); % Bsp. für H; allgemein : xk=3*(k-1)+1, yk=3*(k-1)+2, zk=3*k

        if m==2                     % Bestimmung des Vorfaktors
            a=0-2;
        else
            a=1;
        end
        
        if k==1 && m==2             % Abspeicherung von phi0
            phi0=phi;
        end
        
        if k==1 && m==1
           ddphi_sum=zeros(size(phi)); 
        end
        
        ddphi_sum=ddphi_sum+(a.*phi)./(0.02.*4.*a0).^2;     % Summenbildung über d²phi/dx² = (phi(x+dx)-2*phi(x)+phi(x-dx))/(Schrittweite des Intervalles)²
        
    end
end

for k=1:Z                                % Berechnung der Abstände Elektron-Kern + Summenbildung aller Terme
    
    rNE = (matrizen0{((k-1).*3+1)}.^2+matrizen0{((k-1).*3+2)}.^2+matrizen0{((k).*3)}.^2).^(1./2);
    
    if k==1
        rNE_sum = zeros(size(rNE));
    end
    
    rNE_sum = rNE_sum + 1./rNE;
    
    if Z==1                                  % Für Z=1 existiert keine Elektron-Elektron- Wechselwirkung --> 0
    rEE_sum = zeros(size(rNE_sum));
    end
    
end

for k=1:(Z-1)                            % Berechnung der Abstände Elektron-Elektron + Summenbildung aller Terme
    for m=2:Z
        
        rEE = ((matrizen0{((k-1).*3+1)}-matrizen0{((m-1).*3+1)}).^2+(matrizen0{((k-1).*3+2)}-matrizen0{((m-1).*3+2)}).^2+(matrizen0{((k).*3)}-matrizen0{((m).*3)}).^2).^(1./2);
        
        if k==1 && m==2
            rEE_sum = zeros(size(rEE));
        end
        
        rEE_sum = rEE_sum + 1./rEE;  
        
    end
end

phi_dt = (rEE_sum.*(e.^2./(h.*2.*e0)).*phi0)./(1i) - (rNE_sum.*(Z.*e.^2./(h.*2.*e0)).*phi0)./(1i) - ((h./(4.*pi.*me)).*ddphi_sum)./(1i); % Wellenfunktion d(phi)/dt

for k=1:numel(t)
    
    PHI_t{k} = phi_dt.*t(k);             % Lösung der zeitabhängigen Wellenfunktion; die Wellenfunktion zum Zeitpunkt t(k) ist in PHI_t{k} gespeichert
    
end
