#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import numpy.linalg as la
import matplotlib.pyplot as plt

#' ## Explizites Euler-Verfahren (für Aufgabe 9)

def ExpliziterEuler(f, tspan, yinit, N):
    '''
    f : Funktion f(t, y)
    tspan = [t_0, t_N] : Start- und Endzeitpunkt
    yinit = y(t_0)
    N : Anzahl der Schritte
    '''
    def EulerPsi(hn, tn, yn):
        return yn + hn*f(tn, yn)
    y = yinit
    t = tspan[0]
    yvec = [y]
    tvec = [t]
    h = (tspan[1]-t)/N
    for _ in range(N):
        y = EulerPsi(h, t, y)
        t += h
        yvec.append(y)
        tvec.append(t)
    return tvec, yvec

if __name__ == '__main__':
#' ## Beispiel aus (3.1)
    def f(t, y):
        return t**2+y**2
    
    plt.figure()
    tvec, yvec = ExpliziterEuler(f, [-3/2, -1], -1.4, 42)
    plt.plot(tvec, yvec, 'o', label='N=42')
    ts, ys = ExpliziterEuler(f, [-3/2, -1], -1.4, 10)
    plt.plot(ts, ys, 'x', label='N=10')
    plt.legend()
    plt.show()
