%% Dieses Skript lässt sich auch wieder auf 
%% http://octave-online.net ausführen:

% 1. Gehen Sie auf die Seite  http://octave-online.net/
% 2. "Dismissen" Sie die Kommentar-Fenster (kein "Sign in" nötig)
% 3. "Copy&Pasten" Sie den Text dieser Datei in die Kommandozeile
%    am unteren Ende der Seite 
% 4. Drücken Sie "Enter" und warten Sie die Ergebnisse ab

% Aufgabe 4 Distanzgeometrieproblem lösen.
% Hier zunächst die paarweisen Distanzen eines 4-atomigen Moleküls
% als 4x4-Matrix

D = [[0 2 sqrt(3) sqrt(5)];[2 0 sqrt(11) sqrt(17)]; ...
    [sqrt(3) sqrt(11) 0 sqrt(6)];[sqrt(5) sqrt(17) sqrt(6) 0]];


% Aus dieser Matrix wird die sogenannte Gram-Matrix M berechnet.
% Dabei nimmt man an, dass das Atom mit den 3D-Koordinaten x1 im 
% Ursprung liegt... x1=0. Lesen Sie die Rechengesetze von 
% Skalarprodukten!

% Mij = 1/2 * (d1i^2 + dj1^2 - dij^2)
%     = 1/2 * (<x1-xi|x1-xi> + <x1-xj|x1-xj> - <xi-xj|xi-xj>)
%     = ... = <xi|xj>

M=zeros(4,4);
for i=1:4
    for j=1:4
        M(i,j)=1/2*(D(1,i)^2 + D(j,1)^2 - D(i,j)^2);
    end
end
M

% M = X'*X = Y * LAMBDA * Y'
% (M ist symmetrisch, daher ist Y orthogonal und das Inverse ist Y')
% Daher kann man X über das Eigenwertproblem ausrechnen

[Y, LAMBDA] = eigs(M, 3, 'lm'); % nur die drei größten Eigenwerte


% Die Y-Vektoren auf die Länge 1 bringen

for i=1:3
    Y(:,i) = Y(:,i)/norm(Y(:,i));
end

% die 3 dimensionalen Vektoren ausrechnen
X = sqrt(LAMBDA) * Y'

% 4 Spaltenvektoren mit je den 3 Dimensionen der Atome.
% Probe: M-Matrix muss X'*X sein

Probe = X'*X