Im Folgenden soll ein Teil einer Kurvendiskussion mittels eines eigenen Jupyter Notebooks in Verbindung mit einem C++ angefertigt werden. Gegeben sei die Funktion $f(x)$ $$ \begin{equation} f(x) = e^{-x^2/4} \cdot \hbox{sin}(x/10) \cdot \left( x^4 -q\,x^2 - 5 \right) \quad . \end{equation} $$
Nullstellensuche mit Jupyter und Sympy
Betrachten Sie sich die Funktion in ihrem gesamten Definitionsbereich ($x \in$ ℝ) und berechnen Sie für beliebige Parameter $q \in$ ℝ die Nullstellen der Funktion $f(x)=0$. Wie lauten die Nullstellenwerte für $q=9$ ?
Darstellung von $f(x)$, $f^\prime(x)$ und $f^{\prime\prime}(x)$ mittels Jupyter
Stellen Sie nun die Funktion $f(x)$ und die erste und zweite Ableitung der Funktion im Teilintervall $x \in [-7,7]$ grafisch in drei x-y-Diagrammen dar (benutzen Sie dafür wieder den festen Parameterwert $q=9$). Versuchen Sie die Maxima der Funktion (mit $q=9$) mittels Sympy zu bestimmen.
C++ Programm zur Bestimmung der Hochpunkte der Funktion
Berechnen Sie die x-Werte der Hochpunkte der Funktion $f(x)$ mittels der Methode der Bisektion (Intervallhalbierungsverfahren) unter Verwendung eines C++ Programms.
Wir definieren die Funktion und die Gleichung für die Nullstellensuche lautet:
from sympy import *
init_printing()
x = symbols('x')
q = symbols('q')
f = exp(-x**2/4)*sin(x/10)*(x**4 -q*x**2 - 5)
Gl_Nullstelle = Eq(f, 0)
Gl_Nullstelle
Durch die Multiplikation mit dem Sinus entstehen ja im Prinzip unendlich viele Nullstellen bei den Werten $x_i= +/- \, i \cdot 10 \,\pi \, , \,\, i \in$ ℤ . Die ersten beiden positive Nullstellen des Beitrages vom Sinus lauten z.B $x_0=0$ und $x_1= 10 \,\pi \approx 31.4159$. Die weiteren Nullstellen ergeben sich durch die Nullstellen des Termes $\left( x^4 -q\,x^2 - 5 \right)$, den man einfach mittels einer Variablensubstitution bestimmen kann. In Abhängigkeit vom Parameter $q$ erhält man mittels des Befehles 'solve(...)' die folgenden Lösungen:
Loes_Gl_Nullstelle=solve(Gl_Nullstelle,x)
Loes_Gl_Nullstelle
Für $q=9$ erhalten wir vier reellwertige Lösungen $x_0=0$, $x_1=31.4159265358979$ $x_2=-3.08624979717463$ und $x_3=3.08624979717463$
set_q = 9
for L in Loes_Gl_Nullstelle:
print(L.subs(q,set_q).evalf())
Drei dieser Nullstellen erkennt man auch in der folgenden Grafik:
plot(f.subs(q,set_q),xlim=(-7,7),ylim=(-2.5,2.5));
Darstellung von $f(x)$, $f^\prime(x)$ und $f^{\prime\prime}(x)$ mittels Jupyter
Stellen Sie nun die Funktion $f(x)$ und die erste und zweite Ableitung der Funktion im Teilintervall $x \in [-7,7]$ grafisch in drei x-y-Diagrammen dar (benutzen Sie dafür wieder den festen Parameterwert $q=9$). Versuchen Sie die Maxima der Funktion (mit $q=9$) mittels Sympy zu bestimmen.
Die erste Ableitung lautet:
diff(f,x)
bzw. mittels 'simplify()'
diff(f,x).simplify()
Wir stellen uns die Ableitung $f^\prime (x)$ für $q=9$ im Teilintervall $x \in [-7,7]$ grafisch dar.
plot(diff(f,x).subs(q,set_q),xlim=(-7,7),ylim=(-2.5,2.5),ylabel=r"$f^\prime (x)$");
Die zweite Ableitung $f^{\prime \prime} (x)$ lautet:
diff(f,x,x)
Wir stellen uns die zweite Ableitung $f^{\prime \prime} (x)$ für $q=9$ im Teilintervall $x \in [-7,7]$ grafisch dar.
plot(diff(f,x,x).subs(q,set_q),xlim=(-7,7),ylim=(-3.5,3.5),ylabel=r"$f^{\prime \prime} (x)$");
Wir versuchen nun die Maxima der Funktion (mit $q=9$) mittels Sympy zu bestimmen. Dazu definieren wir zunächst die Gleichung $f^{\prime \prime} (x) = 0$ und benutzen dann, wie sonst auch, den Befehl 'solve(...)':
Gl_Extrema = Eq(diff(f,x).subs(q,set_q),0)
Gl_Extrema
solve(Gl_Extrema,x)
... leider ist die Gleichung zu kompliziert um sie auf symbolischem, analytischem Weg zu lösen ...
C++ Programm zur Bestimmung der Hochpunkte der Funktion
Die Berechnung der x-Werte der Hochpunkte der Funktion $f(x)$ wird unter folgendem Link mittels der Methode der Bisektion (Intervallhalbierungsverfahren) in einem C++ Programm berechnet (siehe Musterlösung zum Übungsblatt 7 und das C++ Programm A7_1_Bisektion.cpp).
Es berechneten sich die folgenden beiden x-Werte für die Hochpunkte: $x_{H_1} = -1.8178520203$ und $x_{H_2} = 3.9772608131$. Die berechneten Werte stimmen gut mit den Hochpunkten der Funktion überein, wie man in der folgenden Abbildung sieht.
plot(f.subs(q,set_q),xlim=(-2,4.5),ylim=(-2.5,2.5));