#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jun  6 14:40:10 2019

@author: troll
"""
import numpy as np
import math


def cholesky_numerisch(A):
    '''Berechnet die untere Dreieckmatrix L der Cholesky-Zerlegung LL^T=A einer
    Matrix A (hierbei wird angenommen, dass A symmetrisch und positiv
    definit ist).
    Eingabe: Matrix A als array
    Rückgabe: untere Dreiecksmatrix L als array'''
    # Cholesky-Faktor erstellen
    L=0.*A
    # Algorithmus aus der Vorlesung
    for k in range(len(A)):
        # Falls es Probleme beim Wurzelziehen gibt, wird eine
        # aussagekräftige Fehlermeldung ausgegeben.
        # (Mit "try/except" kann man Fehler abfangen)
        try:
            L[k,k]=math.sqrt(A[k,k]-np.sum(L[k,:k]**2))
        except:
            raise ValueError('Problem beim Wurzelziehen!')
        for i in range(k+1,len(A)):
            assert L[k,k] != 0, 'Durch 0 geteilt'
            L[i,k]=(A[i,k]-np.sum(L[i,:k]*L[k,:k]))/L[k,k]
    return L



# (a)

# Erstelle die (n x n) Hilbert-Matrix A
def hilbertmatrix(n):

    return # Hilbert-Matrix


# (b)
# Erstellt L der Cholesky-Zerlegung der (n x n) Hilbert-Matrix
def cholesky_exakt(n):

    return # L der Cholesky-Zerlegung



# 4x4 Hilbert-Matrix (zum Vergleichen)
A_4=1/np.array(((1,2,3,4),(2,3,4,5),(3,4,5,6),(4,5,6,7)))
