#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue May  2 12:26:00 2023

@author: Christoph Matern
"""

import numpy as np
import matplotlib.pyplot as plt

def polyinterpol(x, y, X):
    """
    Auswertung eines Interpolationspolynom zu den Daten (x_k,y_k), k=0,..,N
    an den Stellen X_j.

    Parameters
    ----------
    x : np.ndarray
        Numpy-Array, welches N Stützstellen enthält.
    y : np.ndarray
        Numpy-Array, welches die N Funktionswerte an den Stützstellen x entält
    X : np.ndarray
        Numpy-Array mit den auzuwertenden Stellen.

    Returns
    -------
    np.array
        Numpy-Array, welches die Auswertungen des Interpolationspolynoms
        an X enthält.

    """
    # Für ein gegebenes np.array y= [ y_0,... , y_N] berechnet Deltas(y) ein array
    # mit [Delta^0 y_0, Delta^1 y_0, ..., Delta^N y_0] (siehe 8.3)
    deltas = lambda y: y if len(y)==1 else np.append(y[0], deltas(y[1:]-y[:-1]))

    def fakultaeten(k):
        """
        Berechnet alle Fakultäten 0!, 1!, 2!,... bis k!

        Parameters
        ----------
        k : INT
            gegebene natürliche Zahl.

        Returns
        -------
        np.ndarray
            Numpy-Array, welches die berechneten Fakultäten [0!, 1!, ..., k!]
            enthält.

        """
        if k==0:
            return np.ones(1, dtype=object)
        tmp=fakultaeten(k-1)
        return np.append(tmp,tmp[-1]*k)

    # AB HIER AUFGABE
    # fehlenden Code hier ergänzen
    #
    #
    #


    return #Y


# b) Ihr Test


# zusätzlicher Test
f=lambda x: np.sin(2*x**2)+5*np.exp(.1*x**2)
x=np.linspace(-1,2,8)
X=np.linspace(-1,2,2000)

plt.figure(2)
plt.clf()
plt.plot(X,f(X),X,polyinterpol(x,f(x),X),'--r',x,f(x),'*')

plt.legend((r'$\sin(2x^2)+5\exp(0,\!1x^2)$','Interpolationspolynom'))
