import numpy as np # eine haeufig verwendete Art, NumPy einzubinden. Das Synonym np erspart Tipparbeit
from scipy import optimize # aus dem SciPy-Paket wird nur das optimize-Modul eingebunden
import matplotlib.pyplot as plt # einbinden der Plot-Funktionalitaet von Matplotlib zur graphischen Funktionsdarstellung

def f(x): # unsere Beispielfunktion
    return x**2 + 10*np.sin(x) # beachte: weil die Funktion ndarrays verarbeiten soll, muss auch die Sinusfunktion von NumPy verwendet werden

x = np.arange(-10, 10, 0.1) # Datenbereich fuer einen ersten, einfachen Plot
plt.plot(x, f(x)) # Matplotlib in seiner simpelsten Form: x-Daten, y-Daten, fertig
plt.show() # und den Plot anzeigen... An dieser Stelle wird das Skript pausiert. Es geht erst weiter, wenn das Fenster mit dem Plot geschlossen wird.

minimum1 = optimize.fmin_bfgs(f, 0) # fmin_bfgs stellt einen Mininierer zur Verfuegung, der ausgehend von einem vordefinierten Startwert den naechsten lokalen Minimumwert der uebergebenen Funktion findet
minimum2 = optimize.fmin_bfgs(f, 3) # ein weiteres Minimum

print("Minima: ", minimum1, minimum2)

nullstelle1 = optimize.fsolve(f, 1) # eine Nullstelle, gesucht wird ab Startwert 1
nullstelle2 = optimize.fsolve(f, -3) # zweite Nullstelle

print("Nullstellen: ", nullstelle1, nullstelle2)

# Eine Dokumentation zu allen diesen Funktionen erhalten sie auf der Kommandozeile mit help(), z.B. help(optimize.fsolve)
