Computerorientiertes Problemlösen 23.–27. September 2013 Dr. Robert Strehl WS 2013-2014 1 / 33 Überblick 5. Vorlesung Symbolisches Rechnen Polynome (numerisch/symbolisch) Fehlersuche mit dem Debugger Effizienzsteigerung mit dem Profiler Gleitkommazahlen 2 / 33 Polynome Darstellung von Polynomen der Form p(x) = p1 xn + p2 xn−1 + · · · + pn x + pn+1 mittels Koeffizientenvektor p = [p_1 p_2 ... p_n p_n+1] Auswertung von Polynomen (mittels Horner Schema) >> polyval([1 -8 15], 4) ans = -1 p(x) = x2 − 8x + 15 p(4) = 16 − 32 + 15 = −1 Wird der polyval Befehl mit einem Vektor x oder einer Matrix X aufgerufen, so erfolgt die Polynomauswertung elementweise >> y=polyval([1 -8 15],[1 2; 3 4]) y = 8 3 p(1) = 1 − 8 + 15 = 8 0 -1 p(2) = 4 − 16 + 15 = 3 p(3) = 9 − 24 + 15 = 0 3 / 33 Nullstellen von Polynomen Berechnung aller Nullstellen von Polynomen der Form p(x) = p1 xn + p2 xn−1 + · · · + pn x + pn+1 p(x) = 1 − 8x + 15 = (x − 5) · (x − 3) >> p=[1 -8 15]; >> z=roots(p) z = 5 3 x1 = 5, x2 = 3 Aufstellen des Polynoms zu gegebenen Nullstellen z1 , . . . , zn p(x) = (x − z1 ) · (x − z2 ) · · · (x − zn ) >> z=[5 3]; >> p=poly(z) p = 1 -8 15 p(x) = (x − 5)(x − 3) = x2 − 8x + 15 4 / 33 Ableiten von Polynomen Berechnung der Ableitung von Polynomen der Form p(x) = p1 xn + p2 xn−1 + . . . + pn x + pn+1 p(x)0 = np1 xn−1 + (n − 1)p2 xn−2 + . . . + pn >> p=[1 -8 15]; p(x) = x2 − 8x + 15 >> p1=polyder(p) p1 = 2 -8 p0 (x) = 2x − 8 >> p2=polyder(p1) p2 = 2 p00 (x) = 2 polyder Befehl berechnet die Koeffizienten des abgeleiteten Polynoms, wertet die Ableitung jedoch nicht aus (→ polyval) 5 / 33 Polynommultiplikation conv Befehl (engl. convolution) führt Polynommultiplikation durch >> q=[1 -4]; q(x) = x − 4 >> s=[1 -2 4]; s(x) = x2 − 2x + 4 >> r=[0 0 0 8]; r(x) = 8 >> p=conv(q,s)+r p = 1 -6 12 -8 p(x) = x3 − 6x2 + 12x − 8 Polynome mit gleicher Koeffizientenzahl können addiert bzw. subtrahiert werden (vgl. Rechenregeln für Vektoren) 6 / 33 R MATLAB Symbolic Math Toolbox Erweiterungspaket für symbolisches Rechnen in MATLAB TM Bis MATLAB Version 7.6 (R2008a) wird intern der Maple Kernel (≤ Ver. 3.2.3) benutzt, der teilweise separat erworben werden muss Ab MATLAB Version 7.7 (R2008b) wird intern der MuPAD Kernel (≥ Ver. 4.9) benutzt, der zur MATLAB Standardinstallation gehört Informationen über installierte Toolboxen liefert der ver Befehl >> ver ––––––––––––––––––––––––––––––––––––––––––MATLAB Version 7.13.0.564 (R2011b) ... ––––––––––––––––––––––––––––––––––––––––––MATLAB Version 7.13 (R2011b) Partial Differential Equation Toolbox Version 1.0.19 (R2011b) Symbolic Math Toolbox Version 5.7 (R2011b) 7 / 33 GNU Octave Symbolic Package Für GNU Octave existiert das Paket symbolic, mit dem einfache symbolische Berechnungen durchgeführt werden können Paket symbolic ist nicht kompatibel zur Symbolic Math Toolbox Informationen über die installierten Pakete auflisten >> pkg list Zusätzliche Pakete von Octave-Forge nachinstallieren >> pkg install <paketname> -global -forge Installierte Pakete zur Benutzung laden >> pkg load <paketname> Installierte Pakete beim Start automatisch laden >> pkg rebuild -auto <paketname> 8 / 33 GNU Octave Symbolic Package Die auf der Homepage bereitgestellten GNU Octave Versionen beinhalten die folgenden zusätzlichen Pakete von OctaveForce 9 / 33 Symbolische Variablen sym Befehl deklariert eine einzelne symbolische Variable >> a=sym(’a’); syms Befehl deklariert eine Gruppe von symbolischen Variablen >> syms b c; nicht in Octave verfügbar!!! >> b=sym(’b’); c=sym(’c’); Symbolische Variablen sind vom Datentype „symbolic object” >> whos Name Size a 1x1 b 1x1 c 1x1 Bytes 126 126 126 Class sym sym sym Attributes 10 / 33 Symbolische Zahlen Symbolische Zahlen können mit dem sym Befehl deklariert werden >> x=sym(’2’); y=sym(’1/3’); z=sqrt(x); Symbolische Zahlen bleiben solange „exakt” bis sie mit Hilfe des double Befehls in einen numerischen Wert konvertiert werden >> y y = 1/3 >> double(y) ans = 0.3333 >> z z = 2ˆ(1/2) >> double(z) ans = 1.4142 sym Befehl versucht double Werte als rationale Zahlen darzustellen >> a=cos(pi/4), a = 0.7071 b=sym(a) b = sqrt(1/2) >> sym(cos(pi-0.00000001)) ans = -1 11 / 33 Variablensubstitution Symbolische Funktionen können direkt definiert werden >> a=sym(’a’);b=sym(’b’);c=sym(’c’); f=aˆ2+b*c; Symbolische Variablen können mit subs substituiert >> g=subs(f,a,3) g = 9+b*c >> h=subs(f,{a b},{3 cˆ2}) h = 9+cˆ3 Wenn alle Variablen eines symbolischen Ausdrucks durch Werte ersetzt werden, dann wird das Ergebnis als double ausgegeben >> d=subs(f, {a b c}, {3 4 2}) d = 17 >> whos d f Name Size d 1x1 f 1x1 Bytes 8 190 Class double sym Attributes 12 / 33 Polynome Definition von symbolischen Polynomen der Form p(x) = p1 xn + p2 xn−1 + · · · + pn x + pn+1 >> x=sym(’x’); p=xˆ2-8*x+15 ← p(x) = x2 − 8x + 15 Auswertung von symbolischen Polynomen >> subs(p,x,4) ans = -1 ← p(4) = 42 − 8 · 4 + 15 = −1 Zerlegung in Polynomkoeffizienten pk und Monome xk >> [c m]=coeffs(p,x) c = [1, -8, 15] m = [ xˆ2, x, 1] symbolisches Objekt! symbolisches Objekt 13 / 33 Nullstellen von Polynomen Berechnung aller Nullstellen von Polynomen der Form p(x) = p1 xn + p2 xn−1 + · · · + pn x + pn+1 = (x − z1 ) · (x − z2 ) · · · (x − zn ) >> syms x; >> solve(p) ans = 3 5 p=xˆ2-8*x+15; ← p(x) = (x − 3) · (x − 5) >> solve(p,x) ans = 3 5 >> solve(’xˆ2-8*x+15=0’,’x’) ans = 3 5 ans ist symbolisches Objekt! Wenn keine Variable angegeben ist, dann ruft der solve Befehl intern die findsym Funktion auf, um diejenige symbolische Variable zu bestimmen, die der Variablen x alphabetisch am nächsten ist ;-) 14 / 33 Polynomdivision/-multiplikation „Teilen eines Polynoms p durch q mit Rest r” Zu zwei Polynomen p und q (nicht Nullpolynom) gibt es zwei eindeutig bestimmte Polynome s und r mit deg r < deg q, so dass gilt: p = sq + r. quorem Befehl (engl. quotient und remainder ) führt Polynomdivision für symbolische Polynome durch >> syms x; [s r]=quorem(xˆ3-6*xˆ2+12*x-8, x-4) s = r = 8 xˆ2 - 2*x + 4 symbolisches Objekt! symbolisches Objekt! ? Befehl führt Polynommultiplikation durch >> p=s*(x-4)+r p = (x - 4)*(xˆ2 - 2*x + 4) + 8 15 / 33 Polynomumformungen Ausmultiplizieren von symbolischen Ausdrücken >> syms x; expand((x-4)*(xˆ2-2*x+4)+8) ans = xˆ3 - 6*xˆ2 + 12*x - 8 Faktorisieren von symbolischen Ausdrücken >> syms x; ans = (x - 2)ˆ3 factor(xˆ3-6*xˆ2+12*x-8) Vereinfachen von symbolischen Ausdrücken >> syms x; ans = (x - 2)ˆ3 simplify(xˆ3-6*xˆ2+12*x-8) 16 / 33 Charakteristisches Polynom 1 A = 2 4 0 2 2 1 1 , 1 pA (λ) = det(λI − A) = λ3 − 4λ2 − λ + 4 Definition der symbolischen Matrix A >> A=sym([1 0 1;2 2 1;4 2 1]); Berechnung des charakteristischen Polynoms pA >> p=poly(A) p = xˆ3 - 4*xˆ2 - x + 4 >> p=poly(A,’l’) p = lˆ3 - 4*lˆ2 - l + 4 Bestimmung der Nullstellen des Polynoms pA >> solve(p) ans = -1 1 4 ⇔ >> eig(A) ans = -1 1 4 17 / 33 Fehlersuche mittels Debugger Debugger sind Werkzeuge zur systematischen Fehlersuche Beobachtung des Programms während der Ausführung >> help debug debug List M-file debugging functions dbstop dbclear dbcont dbdown dbmex dbstack dbstatus dbstep dbtype dbup dbquit - Set breakpoint. Remove breakpoint. Resume execution. Change local workspace context. Enable MEX-file debugging. List who called whom. List all breakpoints. Execute one or more lines. List M-file with line numbers. Change local workspace context. Quit debug mode. 18 / 33 R Der MATLAB Debugger R MATLAB enthält einen einfach zu bedienenden grafischen Debugger, der für jede im Editor geöffnete M-Datei verfügbar ist 19 / 33 R Der MATLAB Debugger Breakpoints • sind vom Benutzer aufgestellte ”Stopschilder”, an denen die Programmausführung V angehalten wird An Conditional Breakpoints • wird die Programmausführung angehalten, sofern die zugehörige Bedingung erfüllt ist 20 / 33 R Der MATLAB Profiler Profiler sind Werkzeuge zum Auffinden von ”Bottlenecks” >> profile on >> spoisson(100); >> profile viewer Dokumentation, Tipps und Beispiele >> doc profile 21 / 33 Gleitkommazahlen ⇔ Ax = b Ax − b = 0 >> A=hilb(10); b=ones(10,1); x=A\b; >> norm(A*x-b) ans = 2.3498e-10 ??? Rechner approximieren Zahlen durch Gleitkommazahlen und führen Berechnungen mittels Gleitkommaarithmetik durch; es gilt nicht Assoziativgesetz: (x + y) + z 6= x + (y + z) (x · y) · z 6= x · (y · z) Distributivgesetz: x · (y + z) 6= x · y + x · z Fazit: niemals auf exakte Gleichheit überprüfen falsch: isequal(A*x-b, 0) richtig: norm(A*x-b)< tol 22 / 33 Gleitkommazahlen Beispiel: Lichtgeschwindigkeit im Vakuum 2, 99792458 · 108 [m/s] Basis b = 10 (Computer verwenden i.d.R. das Dualsystem, b = 2) Mantisse m = 2, 99792458 enthält die Ziffern der Gleitkommazahl Exponent e = 8 speichert die genaue Position des Kommas ab Eindeutige Darstellung erhält man durch Normalisierung: Festlegung des Wertebereichs der Mantisse auf richtig: 1 ≤ m = 2, 99792458 < 10 falsch: 1 ≤ m = 29, 9792458 > 10 falsch: 1 ≥ m = 0.29792458 < 10 1≤m<b 23 / 33 Gleitkommazahlen Die Menge der Gleitkommazahlen F ist eine endliche Teilmenge der rationalen Zahlen Q und wird durch folgende Größen charakterisiert b p emin emax Basis Anzahl der Mantissenziffern kleinster Exponent größter Exponent IEEE-754-Standard einfach genau doppelt genau b 2 2 p 24 53 emin -126 -1022 emax 127 1023 MATLAB Datentyp single double MATLAB Kommando isieee liefert Rückgabewert 1 zurück, wenn der IEEE-Standard unterstützt wird MATLAB rechnet intern stets mit doppelter Genauigkeit (double) 24 / 33 Gleitkommazahlen Allgemeine Form einer normalisierten Gleitkommazahl d1 d2 dp−1 x = ± d0 + + 2 + · · · + p−1 be = ±d0 , d1 d2 . . . dp−1 · be b b b für die Mantissenziffern gilt für den Exponenten gilt 0 ≤ dl ≤ b − 1 für l = 1, . . . , p − 1 emin ≤ e ≤ emax Beispiel: Lichtgeschwindigkeit im Vakuum 2.99792458 · 108 = 9 9 7 9 2 4 5 8 + 2+ + + 3 + 4 + 5 + 6 + 7 + 8 108 10 102 10 10 10 10 10 10 Zahl 0 kann nicht normalisiert dargestellt werden 25 / 33 Gleitkommasysteme Anzahl der normalisierten Gleitkommazahlen |Fb,p,[emin ,emax ] | = 2(b − 1)bp−1 (emax − emin + 1) + 1 Vorzeichen V Z ∈ {+, −} erste Mantissenziffer d0 ∈ {1, . . . , b − 1} übrige Mantissenziffern dk ∈ {0, 1, . . . , b − 1} Exponent emin ≤ e ≤ emax Darstellung der Zahl Null 2 Möglichkeiten b − 1 Möglichkeiten je b Möglichkeiten emax − emin + 1 Möglichkeiten +1 IEEE-754-Standard einfach genau |F2,24,[−126,127] | = 4, 261412865 e 09 doppelt genau |F2,53,[−1022,1023] | = 1, 84287296752001 e 19 26 / 33 IEEE-754-Standard Der IEEE-754-Standard nutzt noch einige Besonderheiten aus, die aber zum grundsätzlichen Verständnis von Gleitkommazahlen unerheblich sind: erste Stelle einer normalisierten Mantisse im Binärsystem ist stets 1 und muss daher nicht gespeicher werden → hidden bit Anstatt den Exponenten e (Ganzzahl mit Vorzeichen) emin ≤ e ≤ emax zu speichern, reicht es aus die positive Ganzzahl E =e+B ≥1 und den Biaswert B (Verschiebung emin + B = 1) anzugeben 27 / 33 Runden Wenn eine Zahl x ∈ R nicht exakt durch eine Gleitkommazahl x̂ ∈ F dargestellt werden kann, dann muss gerundet werden: Beispiel: x = π = 3.14159 . . . , x̂ ∈ Fb,p mit b = 10 und p = 4 Runden durch Abschneiden x̂ = 3.141 konventionelles Runden x̂ = 3.142 Regel: Ist d4 < 5 so wird abgerunden, gilt d4 ≥ 5 wird aufgerundet Optimales Runden (mit round to even) x̂ = 3.142 Regel: x ∈ R wird auf die nächstgelegene Gleitkommazahl gerundet; liegt x genau zwischen zwei Gleitkommazahlen, wird diejenige Näherung gewählt, deren letzte Mantissenziffer gerade ist 28 / 33 Absoluter und relativer Fehler Der Fehler zwischen dem exakten Wert x ∈ R und der (gerundeten) Gleitkommazahl x̂ ∈ F kann auf verschiedene Arten gemessen werden: absoluter Fehler errabs = |x − x̂| |π − 3.142| = 4.07346...e-04 |100 · π − 100 · 3.142| = 4.07346...e-02 relativer Fehler errrel = |x − x̂| |x| |π − 3.142| = 1.29662...e-04 |π| |100 · π − 100 · 3.142| = 1.29662...e-04 |100 · π| 29 / 33 Auslöschung (engl. cancellation) → Numerik I Beispiel: Gleitkommasystem b = 10, p = 4 Subtrahiere y = 9.999 · 10−1 von x = 1.000 in Gleitkommaarithmetik exakte Rechnung x y x−y Fehler: Rechnung in Gleitkommaarithmetik x̂ = 1.000 · 100 ŷ = 0.999 · 100 x̂ − ŷ = 0.001 · 100 = 1.000 · 10−3 = 1.000 = 0.9999 = 0.0001 = 1 · 10−4 errabs = 9 · 10−4 , errrel = 9 Bei der Subtraktion zweier fast gleich großer Zahlen werden relevante Ziffern durch die Angleichung der Exponenten ausgelöscht; der relative Fehler kann maximal b − 1 betragen. 30 / 33 Größenordnungen (engl. absorption) Beispiel: Gleitkommasystem b = 10, p = 4 Addiere x = 1.000 und y = 1.000 · 10−4 in Gleitkommaarithmetik exakte Rechnung x y x+y Fehler = = = Rechnung in Gleitkommaarithmetik 1.000 0.0001 1.0001 x̂ ŷ x̂ − ŷ = 1.000 · 100 = 0.000 · 100 = 1.000 · 100 errabs = 1 · 10−4 , errrel = 9.9990001 · 10−5 Bei der Addition/Subtraktion einer betragsmäßig viel kleineren Zahl ändert sich die größere Zahl nicht. Die MATLAB Variable eps gibt die kleinstmögliche Gleitkommazahl an, für die gilt 1 + eps 6= 1. 31 / 33 Nützliche Tipps beim Start von GNU Octave werden automatische Befehle aus der Datei ./Octave/Octave3.6.4_gcc4.6.2/share/ . . . . . . octave/site/m/startup/octaverc gestartet. Hier kann also die Editor Variable mittels EDITOR(’Pfad_zu_meinem_Editor\\meinEditor.exe’); gesetzt werden. mittels addpath(’Pfad_zu_meinen_MDateien’) können entsprechend abgelegte M-Dateien automatisch gefunden und ausgeführt werden (ohne das diese manuell gesucht werden müssen). Um die so temporär modifizierte PATH Variable zu speichern sollte der Befehl savepath ausgeführt werden. 32 / 33 Nicht behandelte Themen Interpolations- bzw. Extrapolationsverfahren → Numerik I (doc polyfit, spline, interp1) Iterative Löser für große lineare Gleichungssystemen → Numerik I (doc bicg, bicgstab, gmres) Numerische Behandlung von gewöhnlichen Differentialgleichung → Numerik II, spezielle MATLAB Funktion (doc ode45) Benutzung des MATLAB-Debuggers und -Profilers MEX-Compiler zum Anbinden von MATLAB and C-Programme Erstellung von grafischen Benutzeroberflächen mit GUIDE 33 / 33