23.–27. September 2013 - Mathematik, TU Dortmund

Werbung
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
Herunterladen