#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Dec  8 11:48:47 2017

@author: troll
"""

'''
In dieser Datei sehen Sie zwei Varianten zum Erstellen der Matrix.
Man kann die Matrix auch mit Hilfe von Schleifen füllen, die Befehle
np.diag, np.eye, np.kron erleichtern Ihnen die Arbeit jedoch enorm.
'''

import numpy as np # falls numpy anders importiert wurde

#Author: Sebastian Sansalone
def diskreter_LaplaceV1(N):
    # M = diskreter_Laplace(N) erstellt Diskretisierungsmatrix für Laplace
    # mit Dimension N^2 x N^2
    # S Block
    S = np.diag(-4*np.ones(N)) \
        + np.diag(np.ones(N-1), -1) \
        + np.diag(np.ones(N-1), 1)
    # Einheitsmatrix mit S kroneckern
    L = np.kron(np.eye(N), S)
    # Nebendiagonalen kroneckern und dranbauen
    L += np.kron(np.eye(N, k=1), np.eye(N))
    L += np.kron(np.eye(N, k=-1), np.eye(N))
    return L


#Author: Andreas Troll
# Alles in einer Zeile als lambda-Funktion (dafür müssen einige Befehle aber unnötig oft ausgeführt werden)
diskreter_LaplaceV2 = lambda N: np.kron(np.eye(N), np.diag(-4*np.ones(N))+np.eye(N, k=1)+np.eye(N, k=-1))+np.kron(np.eye(N, k=1),np.eye(N))+np.kron(np.eye(N, k=-1),np.eye(N))