function Blatt7
% Test der Funktion
A = [1 2 3 4; 2 29 36 43; 3 36 109 126; 4 43 126 246];
b = [1;0;1;0];
% Cholesky-Zerlegung
L = cholesky(A);
% LGS lösen - A und damit L sind reell
x = L'\(L\b);

% Gegentests
xtest = A\b;
Ltest = chol(A,'lower');
disp(norm(x-xtest))
disp(norm(L-Ltest,'fro')) % chol does upper right triangluar matrix

end


function L = cholesky(A)
% Realisiert die Cholesky-Zerlegung nach Algorithmus 3 der Vorlesung. Alternativ kann auch die Darstellung aus Aufgabe 7.3 umgesetzt werden.
if A(1,1) <= 1e-12 % wieder um Rechenungenauigkeiten abzufangen
  error('Matrix nicht positiv definit!')
end
n = size(A,1); % Dimension der Matrix
l_11 = sqrt(A(1,1));
if n == 1
  L = l_11; % Ausgabe
else
  % Zerlege A
  a_11 = A(1,1);
  A_12 = A(1,2:end);
  A_21 = A(2:end,1);
  A_22 = A(2:end,2:end);
  % Schur Komplement
  L_21 = A_21/l_11;
  S = A_22 - L_21*L_21';
  % Cholsky-Zerlegung des Schurkomplements und damit rekursiver Aufruf
  L_S = cholesky(S);
  % L zusammenbauen
  L = zeros(n,n);
  L(1,1) = l_11;
  L(2:end,1) = L_21;
  L(2:end,2:end) = L_S;
end
end

