Matlab-Praktikum zur Numerik

Transcrição

Matlab-Praktikum zur Numerik
Matlab-Praktikum
zur Numerik
Sommersemester 2007
M.Sc. Ivan Cherlenyak
Prof. Dr. Hans-Jürgen Reinhardt
Fachbereich Mathematik
Universität Siegen
Version: 17 September 2007
Inhaltsverzeichnis
1 Einführung in MATLAB und Octave
1.1 Was ist MATLAB und Octave? . . . . . . . . . . .
1.2 Grundlagen . . . . . . . . . . . . . . . . . . . . . .
1.2.1 Vektoren . . . . . . . . . . . . . . . . . . . .
1.2.2 Matrizen und Manipulationen mit Matrizen
1.2.3 Datentypen in MATLAB . . . . . . . . . . .
1.2.4 Logische Operationen und Relationen . . . .
1.2.5 Steuerstrukturen . . . . . . . . . . . . . . .
1.2.6 Visualisieren mit MATLAB (Octave) . . . .
1.2.7 Dateien lesen und schreiben . . . . . . . . .
1.3 m-Files: Matlab als Programmiersprache . . . . . .
1.3.1 Scripts . . . . . . . . . . . . . . . . . . . . .
1.3.2 Definition von Funktionen . . . . . . . . . .
2 Numerische Algorithmen, ihre Komplexität
2.1 Numerische Algorithmen und Fehlerquellen .
2.2 Computerarithmetik . . . . . . . . . . . . .
2.3 Zur Komplexität numerischer Algorithmen .
und
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
6
6
7
8
9
9
10
14
14
14
15
Fehleranalyse
19
. . . . . . . . . . . . . . 19
. . . . . . . . . . . . . . 22
. . . . . . . . . . . . . . 23
3 Graphische Benutzeroberflächen und MATLAB
3.1 Erstellung einer GUI mit MATLAB . . . . . . . . . . . . . . . . . . . . .
3.1.1 GUI Elemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Darstellung kontrollieren (Größe, Position, Farben, Eigenschaften
ändern) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles) .
3.2.1 Darstellung von Daten in Grafiken . . . . . . . . . . . . . . . . .
4 Einfache numerische Algorithmen mit MATLAB
4.1 Polynome . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.1 Berechnung von Polynomwerten. Horner-Schema
4.1.2 Polynome in MATLAB . . . . . . . . . . . . . .
4.2 Nullstellenberechnung . . . . . . . . . . . . . . . . . . .
4.2.1 Bisektions-Methode . . . . . . . . . . . . . . . .
4.2.2 Methode der sukzessiven Approximation . . . .
4.2.3 Newton-Verfahren . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
. 27
. 27
. 30
. 31
. 33
.
.
.
.
.
.
.
35
35
35
37
38
38
40
41
INHALTSVERZEICHNIS
4.3
4.2.4 Die Sekantenmethode (Regula falsi) . . . . . . . . . . . . .
Lineare Gleichungssysteme: Direkter und iterativer Löser . . . . .
4.3.1 Inverse Matrix, Normen und Konditionszahl der Matrix . .
4.3.2 Direkte Verfahren . . . . . . . . . . . . . . . . . . . . . . .
4.3.3 Iterative Verfahren zur Lösung linearer Gleichungssysteme
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
42
43
43
44
46
II
Kapitel 1
Einführung in MATLAB und Octave
1.1
Was ist MATLAB und Octave?
MATLAB ist ein sehr leistungsfähiges Softwaresystem für technische Berechnungen. Der
Name MATLAB kommt von MATrix-LABoratory. Grundelemente sind Matrizen und
ihre Manipulationen, die in numerischen Verfahren optimal eingesetzt werden können.
Typische Anwendungen sind
• Numerische Berechnungen aller Art
• Entwicklung von Algorithmen
• Modellierung, Simulation und Entwicklung von Prototypen technischer Probleme
• Analyse, Auswertung und grafische Darstellung von Datenmengen; Visualisierung
• Wissenschaftliche und technische Darstellungen
• Applikationsentwicklung mit Aufbau einer grafischen Benutzerschnittstelle
Berechnung MATLAB verfügt über eine numerische - qualitativ hochwertige - Progammsammlung. Dem Benutzer bleibt es dadurch erspart, Standardalgorithmen neu programmieren zu müssen.
Visualisierung MATLAB verfügt über moderne Visualisierungsmöglichkeiten. Dadurch
ist der Benutzer in der Lage, Daten auf verschiedene Weisen zu visualisieren.
Programmierung MATLAB verfügt über eine eigene Programmiersprache. Dadurch
stellt MATLAB ein offenes System dar. Der Benutzer hat somit die Möglichkeit, die
Funktionalität von MATLAB durch eigene Programme beliebig zu erweitern. Dies kann
dadurch geschehen, dass er MATLAB-Programme schreibt - sogenannte m-Files - oder Cbzw. Fortran-Codes einbindet.
Folgende Punkte tragen außerdem zum Erfolg von MATLAB bei:
1
1.1 Was ist MATLAB und Octave?
• Syntax MATLAB besitzt eine benutzerfreundliche, intuitive Syntax, die kurz und
einfach ist. Sie lehnt sich stark an die mathematischen Schreibweisen an.
• Toolboxen In Form sogenannter Toolboxen lässt sich der Funktionsumfang von
MATLAB auf vielen Gebieten erweitern. Unter anderem stehen folgende Toolboxen zur Verfügung: (Extended) Symbolic Math Toolbox, Financial Toolbox, Image
Processing Toolbox, Neural Network Toolbox, Optimization Toolbox, Partial Differential Equation Toolbox, Spline Toolbox, Wavelet Toolbox, Image Processing
Toolbox, Statistic Toolbox.
• Matrizen Grundlage von MATLAB sind reelle und komplexe (einschließlich dünn
besetzter) Matrizen. Die Einführung einer Matrix als grundlegendes Datenelement
hat sich nicht nur in der (numerischen) Mathematik, sondern in vielen anderen rechnerorientierten Bereichen als sehr vorteilhaft herausgestellt.
• Prototyprealisierung In der Praxis kommt es vor, daß man - aus den verschiedenen Gründen heraus - darauf angewiesen ist, Algorithmen in anderen Programmiersprachen, wie zum Beispiel C/C++,Fortran, Pascal oder Java, zu implementieren.
Aber auch dann ist es vorteilhaft, einen Prototyp des Verfahrens in MATLAB zu
realisieren, da dies meist sehr schnell möglich ist, bevor man den Algorithmus überträgt bzw. automatisch übertragen lässt.
• Grafiken bearbeiten Das MATLAB-Grafiksystem umfasst Hochsprachenbefehle
für die Bildverarbeitung, für Trickbewegungen und Präsentationsgrafiken. Hierzu
gehören auch einfache Befehle, mit denen sich Grafiken kundenspezifisch gestalten
oder auch vollständig grafische Benutzerschnittstellen für eigene Applikationen aufbauen lassen.
• Bibliothek von mathematischen Funktionen MATLAB verfügt über eine umfangreiche Sammlung von mathematischen Algorithmen und Funktionen. Diese Funktionalität reicht von elementaren Funktionen über Eigenwertberechnungen bis hin
zur schnellen Fourier-Transformation.
• Simulink Simulink - ein Partnerprogramm zu MATLAB - ist ein blockorientiertes, interaktives System zur Simulation linearer und nicht lineare dynamischer Systeme. Es handelt sich um ein mausgesteuertes Grafikprogramm, das ein Modell
eines technischen oder physikalischen Systems, das als Blockdiagramm auf dem
Bildschirm darzustellen ist, unter dynamischen Einwirkungen nachbildet. Grundlage
sind MATLAB-Funktionen zur Lösung gewöhnlicher Differentialgleichungen (ODELöser).
2
Kapitel 1. Einführung in MATLAB und Octave
• Platformunabhängig MATLAB läuft sowohl unter Windows als auch unter Linux.
Octave Octave ist ein linuxbasiertes Softwaresystem, das freizugänglich ist, ein sogenanntes Open Source Produkt. Genauso wie MATLAB besitzt Octave eine interaktive
Scriptsprache, die speziell für vektorisierbare Berechnungen optimiert ist und dabei Standardroutinen der numerischen Mathematik (z.B. Eispack oder Lapack) auf einfache Weise
zugänglich macht.
Der Syntax von Octave ist der von MATLAB sehr ähnlich, d.h. ein Octave Programm
kann meist auch von MATLAB ausgeführt werden. Die Rückwärtskompatibilität ist nicht
immer gegeben, da MATLAB besonders im Grafikbereich um einen erheblich größeren
Funktionsumfang verfügt. Die KDE-Komponente von Octave heißt Koctave und sollte
extra installiert werden. Das Octave-Forge Paket ist für mehr Kompatibilität mit MATLAB zuständig.
Starten und Beenden
Bei vielen kommandoorientierten Rechnersystemen wird MATLAB bzw. Octave durch das
Kommando matlab bzw. octave gestartet. Oder - bei grafischen Oberflächen - klickt man
nach dem Start auf ein entsprechendes MATLAB- oder Octave-Icon bzw. Koctave-Icon.
Dann sollten Sie den MATLAB Prompt » oder den Octave Prompt octave:1> sehen, der
auf ihre erste Eingabe wartet. Mit der Kommando quit verlassen sie beide Programme.
Eingabekonventionen
• Alle Befehle können sowohl interaktiv als auch über Skriptdaten (m-Files von MATLAB) eingelesen werden
• Skripts (m-Files) sind Textdateien mit dem Suffix .m. Sie werden durch Aufruf des
Dateinamens ohne Suffix eingelesen, und verhalten sich so, als ob ihr Inhalt Zeile
für Zeile am Prompt eingegeben würde.
• ; trennt mehrere Befehle in einer Zeile, und unterdrückt die Ausgabe von Werten.
• , trennt Befehle, gibt aber Werte aus.
• ... am Zeilenende bedeutet, dass der Ausdruck in der nächsten Zeile weitergeht.
3
1.1 Was ist MATLAB und Octave?
• Kommentare werden mit % eingeleitet. Auf vielfachen Kundenwunsch wurde ab
Release 14 eine Möglichkeit für blockweise Kommentare im MATLAB Editor eingeführt. Das Anfangszeichen ist „%} “ das Endzeichen „%} “.
• MATLAB und Octave unterscheiden zwischen Groß- und Kleinbuchstaben.
Hilfe
MATLAB verfügt über umfangreiche Online-Hilfen. Mit diesen erhalten Sie detaillierte
Informationen zur Funktionalität von MATLAB. Die Hilfsysteme können mit den Kommandos help, helpwin und helpdesk usw. aufgerufen werden. Jetzt wollen wir detailliert
einige Informationsdienste vorstellen:
• Das help- Kommando.
>> help name gibt Hilfetext zur Variable oder Funktion „name“ aus.
Alle MATLAB-Funktionen sind in logische Gruppen(Themen) eingeteilt, und die
MATLAB-Verzeichnisstruktur basiert auf dieser Einteilung. Gibt man alleine help
ein, so wird diese Gruppierung angezeigt. Hiermit kann man sich nun weiter vortasten. Gibt man zum Beispiel help elmat ein, so erhält man alle zur Verfügung
stehenden MATLAB-Funktionen zum Bereich Grundlegende Matrizen und Matrixmanipulationen.
• Das lookfor- Kommando
Basierend auf einem Schlüsselwort können Sie mit dem lookfor-Kommando nach
Funktionen suchen. Dabei wird die erste Zeile des help-Textes jeder MATLABFunktion ausgegeben, die das angegebene Schlüsselwort beinhaltet. Sucht man zum
Beispiel Informationen über Splines, dann gibt man am Prompt >> lookfor spline
an. Will man, dass alle help-Zeilen durchsucht werden, so muss man im Aufruf die
Option -all verwenden.
• Das Hilfefenstersystem helpwin
Gibt man den Befehl
helpwin
ein, so wird ein neues Windowsfenster geöffnet, das verwenden werden kann, um
interaktive Hilfe über MATLAB Funktionen zu erhalten. Das helpwin-System ist
das interaktive Analog des help-Systems. Durch Doppelklicken auf ein Thema in
diesem Textfenster, erhält man eine Liste zu diesem Thema. Der helpwin-Befehl
läßt sich analog dem help-Befehl mit dem gewünschten Thema bzw. der gewünschten Funktion direkt aufrufen.
• Das Hilfesystem helpdesk
Das MATLAB-Hilfesystem helpdesk liefert HTML-basierte Hilfe. Diese HTML-Dokumente
4
Kapitel 1. Einführung in MATLAB und Octave
haben den Vorteil, dass sie Grafiken beinhalten können und Verweise auf andere Dokumente leicht machbar sind. Hilfesystem helpdesk-Befehle:
helpdesk
ruft Hilfefenster mit Themenliste auf
doc < F unktionsname >
Gibt Informationen über diese Funktion
• Die Mathworks Webseite
http : //www.mathworks.com
Zahlen und Formate
MATLAB arbeitet mit Dezimalzahlen. Alle Zahlen werden im double-Format gemäß der
Spezifikation durch die Gleitpunktform der IEEE abgespeichert. Vordefinierte Zahlenausgaben in MATLAB erfolgen nach mehreren Regeln. Eine ganze Zahl wird ganzzahlig
ausgegeben. Reelle Zahlen aus dem Bereich [10−3 , 103 ] werden auf 4 Dezimalen gerundet
ausgegeben. Andernfalls gibt MATLAB Zahlen in exponentieller Form aus, z.B.
>> 2.374e-5, 3.1829e+4.
Man kann das Ausgabeformat mit Hilfe des Befehls format variieren. Um Speicherplatz
zu sparen sind in MATLAB noch weitere Zahlentypen implementiert. Diese sind
• single
• int8, uint8, int16, uint16, int32, uint32
Für weitere Informationen siehe doc datatypes.
Komplexe Zahlen können in MATLAB wie folgt eingegeben werden:
a1= 7-8i, b1 = -21+3*j
√
Die imaginäre Zahl i = −1 kann als i oder j eingegeben werden.
Variable und Standardoperationen
• varname = expression weist varname den Wert expression zu.
• Es gibt die „üblichen“ Operationen und Funktionen +, −, ∗, /,, , sin, cos, usw. Weitere Informationen unter Aufruf von : helpwin ops und helpwin elfun.
• Die elementaren logischen Operatoren werden auch nach Aufruf helpwin ops angezeigt.
• Allgemeine Kommandos ( General Purpose Commands) sind unter helpwin general
aufrufbar.
Beispiele:
>> x_1 = 12/34, xStr = ’Ein String’,
>> im = sqrt(-1)-i
5
1.2 Grundlagen
Und hier ist ein Script test1, der in m-File test1.m gespeichert ist:
>>a = 12;
>>b = 13;
>>s = a + b;
>> p = a * b;
>>disp(’Die Summe ist’); disp(s);
>>disp(’Der Produkt ist’); disp(p);
1.2
1.2.1
Grundlagen
Vektoren
Zeilen- oder Spaltenvektoren
>> x1 = [ 1 3 5 7]
Erzeugt einen Zeilenvektor mit angegebenen Elementen.
>> x2 = [1; 3; 5; 7]
Erzeugt einen Spaltenvektor. Beachte x2 entspricht x10 (’ bewirkt Transponation).
>> x = Komponente1:KomponenteN
Erzeugt einen Zeilenvektor x, der mit Komponente1 beginnt, um 1 erhöht wird und mit
oder vor KomponenteN endet.
>> x = Komponente1:Schrittweite:KomponenteN
Erzeugt einen Zeilenvektor x, der mit Komponente1 beginnt, um Schrittweite erhöht
wird und mit oder vor KomponenteN endet.
>> x =linspace(Komponente1,KomponenteN,n)
Erzeugt einen äquidistanten Zeilenvektor x der mit Komponente1 beginnt und mit der
KomponenteN endet, wobei der Vektor n Komponenten hat.
>> x =logspace(start,end,n)
Erzeugt einen Zeilenvektor x der mit Komponente 10start beginnt und mit der Komponente
10end endet, wobei der Vektor n Komponenten hat.
6
Kapitel 1. Einführung in MATLAB und Octave
1.2.2
Matrizen und Manipulationen mit Matrizen
Befehl
A = [1 2 3; 4 5 6]
B =[1 2]+ i*[5 6]
zeros(3,4)
zeros(3)
eye
ones
rand
randn
hadamard
v(k)
A(k,l)
v(m:n)
A(k,:)
A(:,l)
A(3:7,2:5)
A(2:4,[1 3 5:7])
A(k,:)=[]
diag
rot90
fliplr
flipud
repmat
reshape
tril
triu
A(:)
size
length
isempty
Aktion
Zuweisung einer Matrix
Zuweisung eines komplexen Vektors
Nullmatrix mit 3 Zeilen und 4 Spalten
quadratische Nullmatrix der entsprechenden Größe
Einheitsmatrix , Syntax wie zeros
Matrix mit allen Elementen 1, Syntax wie zeros
Gleichmäßigverteilte Zufallsmatrix
Normalverteilte Zufallsmatrix
Hadamard-Matrix
das k-te Element des Zeilen- oder Spaltenvektors v
das Matrixelement akl
Teilvektor des Vektors v
die k-te Zeile der Matrix A
die l-te Spalte der Matrix A
Zugriff auf Matrixbereich(Teilmatrix);
... auch mit beliebigen Indexvektoren
Löschen eine Matrixzeile
Extrahiert Diagonale oder erzeugt Diagonalmatrix
Drehung um 90◦
Vertauscht Spalten von links nach rechts
Vertauscht Zeilen von oben nach unten
Erzeugt Blockmatrix
Ändert die Struktur
Untere Dreiecksmatrix
Obere Dreiecksmatrix
Formt Matrix zu Spaltenvektor um
Ermittelt Matrixgröße
Länge eines Vektors
Wahr, wenn Matrix leer ist
Andere Matrizen bekommt man mit Hilfe des Befehles
>> helpwin elmat
7
1.2 Grundlagen
Matrixoperationen
Symbol
Operation
+
Addition
Subtraktion
*
Multiplikation
rechte Division
/
\
linke Division
Potenzieren
^
’
Konjugiert Transponieren
.’
Transponieren
kron
Kronecker Tensorprodukt
MATLAB Syn.
A+B
A-B
A*B
A/B
A\B
A^p
A’
Math. Syntax
A+B
A-B
AB
Löst XA=B mit Lösung X
Löst AX = B mit Lösung X
Ap
(Ā)T
A.’
kron(A,B)
AT
A⊗B
Bemerkung
x = A\B löst Ax = b mit Hilfe des Gauss-Verfahrens. Es ist sogar erlaubt, dass LGS
mehrere rechte Seiten besitzt. Deshalb steht in der Tabelle ein großes B.
Matrixaddition und -Subtraktion sind elementweise definiert. Die Multiplikation und andere dagegen nicht, es sind echte Matrixoperationen. Es ist möglich, die Operationen
.∗, .ˆ, .\, ./ elementweise durchzuführen.
Beispiel: A = [1 2; 3 4]; B = [5 6;7 8].
Dann ist
A.*B=[5 12; 21 32];
A./B=[0.2000 0.3333; 0.4286 0.5000];
A.^B=[1 64; 2187 65536].
1.2.3
Datentypen in MATLAB
Es gibt in MATLAB mehrere Datentypen (Klassen), die alle durch ein mehrdimensionales
Feld(Array) dargestellt werden. Vektoren und Matrizen sind die bekanntesten Beispiele
für Felder. Unter anderem sind dies: double, char, sparse, cell und struct.
Typ
double
char
sparse
cell
struct
Beschreibung
Internes MATLAB-Zahlenformat
Zeichen(ketten) Format
Format für dünn besetzte Matrizen
Zelle besteht aus Feldern des Typs double und char
verschiedene Typen
struct ist ein Datentyp, welcher verschiedene Werte von verschiedenen Typen beinhalten kann. Der MATLAB-Typ struct ist mit dem Datentyp Record in der Sprache
Pascal vergleichbar.
8
Kapitel 1. Einführung in MATLAB und Octave
Beispiele:
a = 10.5 (double)
c = ’Zeichenkette’ (char)
b = sparse(2,3) (sparse)
d = {1:5,’Matlab’,ones(3)} (cell)
1.2.4
Logische Operationen und Relationen
Die logischen Operatoren sind in MATLAB aus Sonderzeichen aufgebaut. Werden Matrizen mit logischen Operatoren verknüpft, so geschieht dies komponentenweise. Folgende
Tabelle zeigt die logischen Operatoren.
Logische Operatoren
&
|
~
Logische Funktionen
iscell
ischar
isempty
isieee
xor
Relationen
==
~=
>=
<=
>
<
1.2.5
Beschreibung
logisches UND
logisches ODER
logisches NICHT
Beschreibung
WAHR, falls Argument cell-Feld
WAHR, falls Argument char-Feld
WAHR, falls Argument leeres Feld
WAHR bei Rechnern mit IEEE-Standard
Exklusives ODER
Beschreibung
gleich
nicht gleich
größer oder gleich
kleiner oder gleich
größer
kleiner
Steuerstrukturen
Programmiersprachen erlauben es, den Ablauf eines Programms zu steuern. Man spricht
von einer Steuerstruktur, die aus mehreren Steuerelementen bestehen kann. Diese sind
Verzweigungen und Schleifen.
9
1.2 Grundlagen
Schleifen
Befehle
for n=3:10
i=i*n
end
while <Ausdruck>
<Anweisung(en)>
end
Aktion
for-Schleife
while-Schleife; <Ausdruck> wird vor der Ausführung der
<Anweisungen> ausgewertet. Solange der <Ausdruck> ungleich 0 ist, werden die <Anweisungen> ausgeführt.
Die break-Anweisung ist eine Sprunganweisung und dient dazu, aus einer Schleife
herauszuspringen. Liegt eine geschachtelte Schleife vor, so springt MATLAB aus dieser in
die nächstübergeordnete.
Verzweigungen
If-Anweisung
Befehle
if <Test_1>
<Anweisungen_1>
elseif<Test_2>
<Anweisungen_2>
else
<Anweisungen_3>
end
Switch-Anweisungen
Befehle
switch <Ausdruck>
case<Konstante_1>
<Anweisungen>
case <Konstante_2>
<Anweisungen>
otherwise
<Anweisungen>
end
1.2.6
Aktion
Ist der <Test_1> ungleich 0 (WAHR), so werden
<Anweisungen_1> ausgeführt. Ist <Test_1> gleich 0, so wird
<Test_2> ausgewertet und <Anweisungen_1> nicht ausgeführt. Ist jetzt der <Test_2> ungleich 0, so werden
<Anweisungen_2> ausgeführt. Andernfalls führt das Programm <Anweisungen_3> aus.
Aktion
switch lässt Gruppen von Anweisungen entsprechend
dem Wert einer Variablen (hier <Konstante_1> oder
<Konstante_2>) oder eines Ausdrucks ausführen. Es
wird nur die erste Übereinstimmung ausgeführt.
Visualisieren mit MATLAB (Octave)
Was ist wissenschaftliches Visualisieren? Diese Frage kann mit der Darstellung von Daten
beantwortet werden. Wozu ist wissenschaftliche Visualisierung nützlich? Hierzu gibt es
folgende Gründe:
• Man erkennt Strukturen und Merkmale in den Daten.
10
Kapitel 1. Einführung in MATLAB und Octave
• Man identifiziert Trends.
• Man kann komplexe Informationen vergleichen.
• Man kann Gegenstände untersuchen, die physikalisch nicht untersuchbar sind.
2D-Grafiken
Die plot-Funktion ist eine der grundlegenden Grafikfunktionen in MATLAB. Wenn x
und y zwei Vektoren der gleichen Länge sind, dann öffnet der Befehl plot(x,y) ein Grafikfenster mit einer entsprechenden Grafik.
Beispiel
>> x =[0 0.1 0.2 0.3 0.4 0.5]
>> y =[10 18 12 -3 8 25]
Der mögliche Aufruf des plot-Befehls mit Optionen und mehreren Grafiken:
>> plot(x1,y1,linspec1,x2,y2,linspec2,x3,y3,linspec3)
Damit definieren wir, dass in einem Fenster drei Grafiken gezeichnet werden. Die Option
linspec* beschreibt Farbe, Gestaltung der Linie und Markierung von Punkten der jeweiligen Grafik.
Markierung von Punkten Gestaltungsvarianten für Linien
Sym.
Bed.
Sym. Bedeutung
’o’
◦
’-’
Linie(Default)
×
’x’
’––’ gestrichelte Linie
’+’
+
’:’
punktierte Linie
∗
’*’
’square’
’diamond’
Farben
Sym.
’r’
’g’
’b’
’k’
Bedeutung
rot
grün
blau (Default)
schwarz
Andere nützliche Funktionen zum plot-Befehl sind in der folgenden Tabelle aufgelistet:
Funktion
subplot
hold on
hold off
grid
text
title
xlabel
ylabel
11
Bedeutung
ermöglicht ein Grafikfenster in mehrere Figuren zu unterteilen
gibt die Möglichkeit weitere Plots zum aktiven Fenster einfügen
schaltet hold on ab
erzeugt ein Gitter
positioniert Text an spezifizierten Koordinaten
erzeugt eine Überschrift
Beschriftung der x-Achse
Beschriftung der y-Achse
1.2 Grundlagen
Beispiel
%-----------------------------------------------% Test1.m m-File zum Erzeugung verschiedener Grafiken
%-----------------------------------------------x = linspace(-10,10,50);
y1 = x.^2 + 5.*x + 7;
y2 = exp(2.*x).*cos(4.*x);
y3 = (x.^2-3.*x)./(x.^2+7.*x)
subplot(2,2,1)
plot(x,y1,’ro’)
grid on
title(’Quadratisches Polynom’)
xlabel(’x’), ylabel(’y1’)
subplot(2,2,2)
plot(x,y1,’ro’,x,y2,’--k*’);
grid on
title(’Zwei verschiedene Grafiken in einem Plotfenster’)
subplot(2,2,3)
plot(x,y2-y1,’:g’)
grid on
title(’ Grafik der y2-y1’)
subplot(2,2,4)
plot(y3)
Funktionsgraphen im R2 mit ezplot
Mit dem ezplot-Befehl lassen sich auch Graphen von Funktionen zeichnen. Ein möglicher Aufruf für eine Grafik im ersten Subplot des vorigen Beispiels wäre:
>>ezplot(’x^2+5*x+7’,[-10,10])
Die Funktion ezplot erlaubt auch das Zeichnen von Kurven im R2 , die implizit definiert
sind und sowohl parametrisierte Kurven als auch Kurven in Polarkoordinaten sein können:
Bedeutung
Funktion
ezplot(’-x^2/4+y^2/25=1’,
implizit definierte Kurve
[-15,15])
ezplot(’t-sin(t)’,
parametrisierte Kurve (Zykloide)
’1-cos(t)’,[0,4*pi])
Kurven in Polarkoordinaten (Kardioide)
ezpolar(’1+cos(phi)’)
3D-Grafiken
Damit man die Funktionswerte einer Funktion f(x,y) zweier unabhängiger Variablen ausrechnen kann, muss man zunächst ein zweidimensionales Gitter in der xy-Ebene erzeugen.
Dann kann man die Funktion in diesen Gitterpunkten berechnen. Somit hat man Punkte
auf der Fläche der Funktion bestimmt, und man kann dann den Graphen der Funktion
zeichnen. Ein zweidimensionales Gitter in der xy-Ebene wird in MATLAB durch zwei
Matrizen definiert. Eine Matrix besteht aus den x-Koordinaten und die andere aus den
12
Kapitel 1. Einführung in MATLAB und Octave
y-Koordinaten aller Gitterpunkte.
Das Erzeugen dieser Matrizen kann mit der meshgrid-Funktion automatisiert werden.
Hierzu muss man die Vektoren x und y der Funktion als Argumente übergeben. Wenn
wir z.B. den Bereich [2, 7] × [1, 6] mit 40 Punkten diskretisieren wollen, dann geben wir
folgende Befehle an:
>> x = 2:0.5:7;
>> y = 1:0.5:6;
>> [X,Y] = meshgrid(x,y);
Nun können wir die Funktionswerte einer zweidimensionalen Funktion ausrechnen. Beachte, dass X,Y Matrizen sind; deswegen benutze man elementweise Operationen. Wollen
wir etwa die Funktionswerte von
f (x, y) = x2 − y 2
auf obigem Gitter bestimmen, so geht das in einer Zeile:
>> Z = X.^2-Y.^2.
In der Matrix Z stehen die Funktionswerte der entsprechenden Gitterpunkte. In MATLAB
stehen mehrere Funktionen zur Verfügung, um den Graphen von f zu zeichnen. Wir geben
zwei Möglichkeiten an
Erzeugt eine 3D-Darstellung (offenes Gitter) der Fläche
mesh
surf
Erzeugt eine 3D-Darstellung (schattiertes Gitter) der Fläche
Funktionsgraphen im R3
ezmesh(’x^2-y^2’)
ezsurf(’x*exp(y^2)’)
ezmeshc(’2+x^2-y^2’)
ezplot3(’cos(t)’,
’sin(t)’,’2*t’,[0,20])
plot3(2,3,4)
13
zeichnet die Fläche der angegebenen Funktion(offenes Gitter)
zeichnet die Fläche der angegebenen Funktion(schattiertes Gitter)
zeichnet den Graphen einer Sattelfläche mit Höhenlinien
zeichnet eine 3D-Kurve
zeichnet einen Punkt im R3 mit den Koordinaten
(2, 3, 4)
1.3 m-Files: Matlab als Programmiersprache
1.2.7
Dateien lesen und schreiben
In MATLAB kann man Daten- bzw. Textdateien lesen und schreiben. Hierbei kann man
zwischen binärem MATLAB- und lesbarem ASCII-Format wählen. Binärdateien haben gegenüber ASCII-Dateien die Vorteile, dass sie weniger Speicherplatz benötigen und schneller gelesen und geschrieben werden können.
Aktion
Befehl
save myfile.mat
komplette Sitzung in Datei speichern (MATLABFormat)
Variable M in Datei speichern (MATLAB-Format)
save(’c:\temp
\myfile2.mat’,’M’)
save myfile3.mat p
Variable p in Datei speichern (ASCII-Format)
-ascii
Einlesen (default: MATLAB-Format)
load myfile3.mat
importiert Daten aus den verschiedenen Formaten
importdata(’f1.m’)
print -depsc myplot.eps
aktuellen Plot speichern als Farb-EPS
Plot Nr. 4 speichern als 24bit-JPEG
print -djpeg -f4
myplot.eps
1.3
1.3.1
m-Files: Matlab als Programmiersprache
Scripts
Bisher wurden Anweisungen zeilenweise eingegeben und von MATLAB verarbeitet. Diese
interaktive Arbeitsweise ist unzweckmäßig für Algorithmen, die mehrere Programmzeilen
benötigen und wieder verwenden sollen. Hierfür eignen sich so-genannte m-Files, die mit
einem Editor erzeugt werden und unter einem Filenamen mit dem Kürzel .m abgespeichert
werden. Es gibt zwei Arten von m-Files: die Script-Files und die Function-Files.
Script-Files Ein Script-File ist eine Folge von MATLAB-Anweisungen. Die Anweisungen in einem Script-File werden ausgeführt, wenn man den File-Namen ohne den Suffix
.m angibt. Ist zum Beispiel der File-Name test1.m, so gibt man einfach test1 ein. Variablen in einem Script-File sind global. Auch kann in einem Script-File ein anderes m-File
aufrufen. Einige nützliche Funktionen für Programmieren mit m-Files sind in der folgenden Tabelle zusammengefasst.
Beschreibung
MATLAB-Funktion
disp
Zeigt Resultate am Bildschirm
Kontrolle der Bildschirmausgabe
echo
input
Wartet auf Eingabe
iöh keyboard
Kontrolle auf Tastatur
pause
Pause bis Tastendruck
pause(n)
Pause für n Sekunden
waitforbuttonpress Pause bis Mausklick oder Tastendruck
14
Kapitel 1. Einführung in MATLAB und Octave
1.3.2
Definition von Funktionen
Wenn man intensiver mit MATLAB arbeitet, dann wird man bald feststellen, dass es nicht
für alle Wünsche eingebaute Funktionen oder Kommandos gibt. In diesem Fall kann man
sich eigene Funktion schreiben und damit die Funktionalität von MATLAB erweitern.
Variable in Function-Files sind lokale Variable. Die Übergabe einzelner Variablen erfolgt
über eine Parameterliste im Funktionsaufruf. Die allgemeine Form von Functions-Files
ist:
function [out_1,...,out_n] = Name(In_1,...,In_m)
Um einen Funktion-file zu schreiben, muss man ein paar Regeln beachten:
• Der File-Name und der Funktionsname müssen übereinstimmen.
• Der Name darf bis zu 31 Zeichen haben. Das erste Zeichen muss ein Buchstabe sein.
Ziffern und Unterstrich dürfen verwendet werden.
• Das Schlüsselwort function muss in der erste Zeile stehen. Dort sind auch die Einund Ausgabeargumente anzugeben.
• Die Kommentarzeilen nach der ersten Zeile dienen als Hilfstext. Man bekommt sie
mit help < functionname> am Bildschirm angezeigt.
• Funktionen können untereinander auch mit dem MATLAB-Workspace über globale
Variable kommunizieren.
• Ein Funktion-File muss kein Eingabe- oder Ausgabeargument haben.
• In einem Funktion-File können mehrere Funktionen stehen. Dabei gibt es eine Erstfunktion und weitere Unterfunktionen. Diese Unterfunktionen können von der Erstfunktion aufgerufen werden und sich gegenseitig aufrufen. Wie alle Funktionen so
haben auch Unterfunktionen ihren eigenen Workspace.
Beispiel: Berechne die zwei Lösungen einer quadratischen Gleichung x2 + px + q = 0
function [x1,x2] = testfunktion2(p,q)
x1 = -p/2 + sqrt(p^2-4*q)/2;
x2 = -p/2 - sqrt(p^2-4*q)/2;
Achtung: Bei einem Aufruf
>>testfunktion2(0,-1)
15
1.3 m-Files: Matlab als Programmiersprache
wird nur der erste Ausgabeparameter am Bildschirm ausgegeben. Um beide zu bekommen, muss die Funktion mittels
>>[a,b]=testfunktion2(0,-1)
aufgerufen werden.
Funktionen von Vektoren und Matrizen
Wenn eine reellwertige Funktion mit einem Vektor oder einer Matrix als reellwertigem
Argument aufgerufen wird, wird die Funktion elementweise für jeden Eintrag des Vektors
oder der Matrix ausgeführt. Dies muss man auch bei selbst geschriebenen Funktionen
beachten. Wenn man dabei nur bereits (korrekt!) definierte mathematische Operationen
verwendet, genügt es, alle Multiplikationen, Divisionen und Potenzierungen mit dem „. “
zu versehen.
function y = vektorfunktion1(x)
y = x.^2+2.*x+1;
Das sollte man auch bei selbst geschriebenen Funktionen beachten. Wenn man in der
Funktion „if“-Anweisungen verwendet, muss man dann etwas komplizierter programmieren. Die bereits bekannte (reelle) Betragsfunktion kann man wie folgt modifizieren, damit
sie auch für Matrizen korrekt funktioniert:
function y = vektorfunktion2(x)
s = size(x)
size liefert die Anzahl von Zeilen und Spalten von x in einem 2-dimensionalen Vektor
zurück . Jetzt kann man den reellen Betrag komponentenweise berechnen:
for i=1:s(1)
for j=1:s(2)
if x(i,j)>0
y(i,j) = x(i,j);
else y(i,j) = -x(i,j);
end
end
end
Funktionen von Funktionen
Die Funktion eval
Die Funktion eval stellt in Verbindung mit Textvariablen(Zeichenketten) ein leistungsfähiges Makro zur Textverarbeitung dar. Der Ausdruck bzw. die Anweisung
eval(s)
lässt mit Hilfe des MATLAB-Interpreters den Ausdruck auswerten oder die Anweisungen
ausführen, die in der Textfolge s enthalten sind.
Die Funktion feval
Die Funktion feval evaluiert eine Funktion, die mit einer Zeichenkette (String) spezifiziert ist. Zum Beispiel ist
>>a = feval(’TestFunktion1’,x)
zu
16
Kapitel 1. Einführung in MATLAB und Octave
>>a = TestFunktion1(x)
gleichwertig. feval erlaubt auch mehrere Ein- und Ausgabeargumente. Zum Beispiel sind
>>[a,b] = feval(’TestFunktion2’,x,y,z)
und
>>[a,b] = TestFunktion2(x,y,z)
äquivalent. Viele eingebaute MATLAB-Funktionen wie z.B. fzero,fplot,fminbnd verwenden diese Programmiertechnik.
Inline-Funktionen
Benötigt man während einer MATLAB-Sitzung eine Funktion, so kann man die inline
Funktion verwenden. Ist zum Beispiel
>> f = inline(’sqrt(x.^2+y.^2)’,’x’,’y’)
dann kann man diese Funktion in gewohnter Weise auswerten
>>f(4,5)
Bisher haben wir Funktionen benutzt, deren Parameter Zahlen bzw. Vektoren oder Matrizen waren. Es gibt in MATLAB aber auch die Möglichkeit, ganze Funktionen an andere
Funktionen als Parameter zu übergeben. Als Beispiel für eine Anwendung programmieren
wir hier eine Funktion, die eine gegebene Funktion plottet. Ein Beispielaufruf lautet
>>funplot(’sin(x)’,1,5,100)
Der erste Parameter bestimmt die zu plottende Funktion, der zweite und dritte die untere
bzw. obere Intervallgrenze des zu plottenden Bereichs. Der vierte Parameter bestimmt die
Anzahl der Stützstellen, die in der Grafik verwendet werden sollen.
function funplot(fun,a,b,n,format)
inline wandelt den übergebenen Funktionsnamen in eine ausführbare MATLAB Funktion
um,
g = inline(fun);
Wie üblich erzeugen wir den Vektor der Stützstellen
t = [a:(b-a)/(n-1):b];
dazu den Vektor von Funktionswerten
y = g(t);
und plotten das Ganze. plot(t,y,format)
Diese Beispielfunktion funplot plottet eine Funktion mit abhängiger Variable x. Beispielaufruf:
>>funplot(’sin(x)’,0,2*pi,50,’-’)
>>input(´Druecke RETURN´)
Eine wichtige Operation mit Funktionen ist die Integration. Die MATLAB Routine zur
Integration lautet quad, da numerische Integration üblicherweise als „Quadratur“ bezeichnet wird.
>> x = quad(’sin’,0,2*pi)
input(’Druecke RETURN’)
17
1.3 m-Files: Matlab als Programmiersprache
18
Kapitel 2
Numerische Algorithmen, ihre
Komplexität und Fehleranalyse
2.1
Numerische Algorithmen und Fehlerquellen
• Numerische Mathematik beschäftigt sich mit Entwicklung und Analyse numerischer
Algorithmen.
• Mathematische Größen sind meist stetiger Natur.
• Zahlen werden in Computern in Registern oder Zahlenspeichern aufbewahrt.
• Computerzahlen können nur eine feste endliche Anzahl von Ziffern aufnehmen.
• Man unterscheidet zwischen iterativen und exakten Verfahren.
Unter einem numerischen Algorithmus versteht man einer Rechenvorschrift, die aus
einer endlichen Folge elementarer Rechenschritte besteht und jede dabei auftretende Rechenoperation nach Art und Reihenfolge eindeutig festlegt.
Probleme:
• Nicht jede reelle Zahl kann exakt in einem digitalen Computer dargestellt werden.
• Komplexe Probleme stetiger Natur sollen durch diskrete einfachere Probleme ersetzt
werden.
• Iterative Methoden sind theoretisch unendlich.
19
2.1 Numerische Algorithmen und Fehlerquellen
Lösungsstrategien
• Approximative Darstellung der reellen Zahlen.
• Man ersetzt Funktionen durch einfachere Funktionen, z.B durch Polynome.
• Man ersetzt nichtlineare Probleme durch lineare Probleme.
• Man ersetzt Differentialgleichungen durch algebraische Gleichungen.
• Man ersetzt unendlich-dimensionale Räume durch endlich-dimensionale.
• Man ersetzt einen unendlichen Prozess durch einen endlichen, z.B. eine unendliche
Summe durch eine endliche oder die Ableitungen durch Differenzenquotienten.
Fehlerquellen
Mögliche Fehlerquellen sind
a) Modellierungsfehler: Einige physikalische Eigenschaften des Problems oder des
Systems müssen vereinfacht oder weggelassen werden.
b) Reale Messfehler: Laborinstrumente haben nur endliche Genauigkeit. Aus Kostengründen werden oft nur wenige Messreihen durchgeführt.
c) Eingabefehler: Eingabedaten sind oft selbst nur Näherungen.
Fehler, die beim Rechnen entstehen
• Diskretisierungsfehler: Mathematische Modelle müssen oft genähert werden. Zum
Beispiel muss man den Differentialquotienten durch den Differenzenquotienten annähern.
• Abbruchfehler: Bei iterativen Verfahren müssen Abbruchkriterien verwendet werden.
• Rundungsfehler: Die Darstellung reeller Zahlen im Computer und die Rechnung
mit ihnen ist im allgemeinen unexakt.
Beispiel
Sei f : R → R eine Funktion und x, x̃ ein exakter bzw. ungenauer Eingabewert. Zudem
20
Kapitel 2. Numerische Algorithmen, ihre Komplexität und Fehleranalyse
sei f˜ eine Approximation an f . Dann setzt sich der Gesamtfehler aus Rechenfehler und
Datenfehler zusammen:
Gesamtfehler = f˜(x̃) − f (x)
= f˜(x̃) − f (x̃) + (f (x̃) − f (x))
= Rechenfehler + Datenfehler
Rechenfehler = Diskretisierungsfehler + Rundungsfehler
• Ein Diskretisierungsfehler ist die Differenz zwischen dem wahren Ergebnis und
dem Ergebnis, das man erhalten würde, wenn man mit einem gegebenen Algorithmus
am Computer exakt rechnen könnte.
• Ein Rundungsfehler ist die Differenz zwischen dem exakt berechneten Ergebnis
und dem Ergebnis, das ein gegebener Algorithmus in endlich genauer Arithmetik
berechnet.
Absoluter und relativer Fehler
Ist b ein Näherungswert einer Zahl a, dann gibt es zwei mögliche Wege, den Grad der
Abweichung von b gegenüber a zu messen.
Absoluter Fehler = |a − b|.
Relativer Fehler =
Absoluter Fehler
|a − b|
=
.
|a|
Wahrer Wert
Die Kondition eines Problems
Kondition =
Relative Änderung im Ergebnis
Relative Änderung in den Eingangsdaten
Ein mathematisches Problem mit kleiner Konditionszahl heißt gut konditioniert, und
entsprechende Probleme mit großen Konditionszahlen nennt man schlecht konditioniert.
Beispiel
Das Problem zur Berechnung der Funktionswerte der Kosinusfunktion für Argumente in
der Nähe von π/2. Es gilt:
Kondition =
cos(x+h)−cos(x)
cos(x)
(x+h)−x
x
≈
−h sin(x)
cos(x)
h
x
=
− tan(x)
≈ ∞(x → π/2).
x
Dies bedeutet, dass kleine Störungen in x ≈ π/2 relativ große Änderungen in cos(x)
verursachen, unabhängig davon mit welchem Verfahren man die Rechnung durchführt.
21
2.2 Computerarithmetik
2.2
Computerarithmetik
Will man auf einem Computer zwei reelle Zahlen addieren oder irgendeine andere arithmetische Operation ausführen, so muss man die reellen Zahlen in den Rechner eingeben.
Der Rechner aber kann im allgemeinen eine reelle Zahl nicht genau darstellen. Z.B. Periodische Zahl 1.112 hat unendlich viele Ziffern und kann somit nicht exakt abgebildet
werden. Deshalb müssen reelle Zahlen zur Darstellung im Rechner approximiert wiedergegeben werden. Diese Zahlen nennt man Maschinenzahlen.
Digitaler Rechner benutzen Gleitpunktarithmetik (Fließpunktarithmetik), das heißt, man
kann nur endlich viele Zahlen mit endlicher Genauigkeit darstellen. Dies führt auf Phänomene wie Rundungsfehler, Underflow und Overflow.
Gleitpunktzahlen
Idee: eine dezimale Zahl als Potenz von 10 zu schreiben.
z.B 125678 = 1.25678 ∗ 105 , 0.000000123 = 1.23 ∗ 10−7 .
In diesem Format bewegt sich (gleitet oder fließt) der Dezimalpunkt entsprechend der
Änderung der Potenz von 10.
Jede Zahl x aus einem Gleitpunktsystem lässt sich wie folgt darstellen:
x = ±(d0 +
dn−1
d1 d2
+ 2 + ... + n−1 ) ∗ β e = ±d0 .d1 d2 ...dn−1 ∗ β e ,
β
β
β
wobei di ∈ {0, ..., β − 1} für i = 0, ..., n − 1 und emin ≤ e ≤ emax gilt.
Die Ziffernfolge d0 .d1 d2 ...dn−1 bezeichnet man als Mantisse, e ist der Exponent, β die
Basis, n die Mantissenstellenzahl („Genauigkeit“) und {e ∈ Z | emin ≤ e ≤ emax } der
Exponentenbereich, wobei auch emin , emax ∈ Z.
Computer verwenden heutzutage fast ausschließlich binäre Arithmetik, das heißt β =
2. Taschenrechner dagegen benutzen aus nahe liegenden Gründen dezimale Arithmetik
(β = 10). Unabhängig davon, welche Basis ein Computer verwendet, konvertiert er bei
einer Eingabe eine dezimale Zahl in die entsprechende Maschinenzahl und wieder in eine
dezimale Zahl zurück.
Ein Gleitpunktsystem ist normalisiert, wenn die erste Ziffer d0 der Mantisse ungleich
Null ist, sofern die darzustellende Zahl nicht gerade die Null ist. Für die Mantisse m gilt
dann immer
1 ≤ m < β.
Normalisierte Gleitpunktsysteme haben folgende Eigenschaften:
• Die Darstellung ist eindeutig.
• Die Genauigkeit ist maximal, weil keine Ziffer durch führende Nullen unnötig verbraucht wird.
• In einem binärem Gleitpunktsystem ist die führende Ziffer immer 1. Deshalb muss
man sie nicht explizit speichern und gewinnt ein zusätzliches Bit, um die Genauigkeit
zu erhöhen.
22
Kapitel 2. Numerische Algorithmen, ihre Komplexität und Fehleranalyse
Kann eine gegebene reelle Zahl x nicht als Gleitpunktzahl dargestellt werden, so muss
sie approximiert werden. Diese Gleitpunktnäherung bezeichnet man mit f l(x) und der
Prozess heißt Runden. Der Fehler, der dadurch entsteht, heißt Rundungsfehler.
Die Genauigkeit eines Gleitpunktsystems kann durch eine Größe charakterisiert werden,
die man Maschinengenauigkeit nennt. Den Wert bezeichnen wir mit εM . Alle in MATLAB abgebildeten reellen Zahlen sind mit einem relativen Fehler kleiner oder gleich
εM = 2−52 ≈ 2.2204 ∗ 10−16
behaftet. Es ist also wenig sinnvoll, mehr als sechzehn Stellen in der Mantisse ein - oder
auszugeben.
Computerarithmetik in MATLAB
In MATLAB ist der IEEE-Standard 754 mit doppelter Genauigkeit(64Bit) realisiert, wann
immer Hardware und Software dies zulassen. Deshalb hat in MATLAB jede Zahl x die
Form:
x = ±(1 + f ) · 2e ,
wobei f =
d1
2
+ ... +
d52
.
252
MATLAB-Name
εM
realmin
realmax
Für die Exponenten e gilt −1022 ≤ e ≤ 1023.
Beschreibung
Maschinengenauigkeit; IEEE: 2−52 ≈ 2.2 · 10−16
Kleinste positive reelle Zahl; IEEE: 2−1022 ≈ 2.2 · 10−308
Größte positive reelle Zahl; IEEE: (2 − 2−52 ) · 21023 ≈ 1.8 · 10308
In MATLAB spricht man von flints, wenn man eine Gleitpunktzahl meint, deren Wert
eine ganze Zahl ist. Bei flint-Zahlen gibt es keine Rundungsfehler.
Die IEEE-Gleitpunktarithmetik erlaubt spezielle Werte für folgende Ausnahmefälle:
• Inf für unendlich, zum Beispiel wenn eine Zahl durch Null dividiert wird.
• N aN für not-a-number, wenn Operation undefiniert oder unbestimmt ist, wie 0/0
oder 1/0 Zeichen0 .
2.3
Zur Komplexität numerischer Algorithmen
Für Probleme der numerischen Mathematik gibt es meist mehr als einen Lösungsweg.
Wählt man zur Lösung einen Algorithmus aus mehreren aus, dann benutzt man dafür
drei Hauptkriterien: Geschwindigkeit, Speicheraufwand und Stabilität.
Zählen arithmetischer Gleitpunktoperationen
In weiteren werden wir n-Vektoren und n × n−Matrizen benutzen, um die Anzahl der
23
2.3 Zur Komplexität numerischer Algorithmen
Operationen zu zählen.
Addition zweier Vektoren. Für die Berechnung der Summe werden n Additionen benötigt.
Skalarprodukt benötigt:
• n Additionen
• n Multiplikationen
Addition zweier quadratischer Matrizen. Hier sind n2 Additionen notwendig.
Multiplikation zweier quadratischer Matrizen Matrix C = A ∗ B hat n2 Elemente, und ein Element beinhaltet ein Skalarprodukt zweier Vektoren. Damit benötigt der
Algorithmus
• n3 Additionen
• n3 Multiplikationen
Lösen eines linearen Systems mit Dreiecksmatrix. Das Lösen eines linearen GS
mit dreiecksförmiger Matrix folgende Operationen benötigt:
• 1/2n2 − 1/2n Additionen
• 1/2n2 -1/2n Multiplikationen
• n Divisionen
Der dominante Term.
Für große n ist der Term 21 n2 im Ausdruck 12 n2 − 21 n dominant gegenüber dem Term 21 n.
Ist z. B. n = 100, so ist das Verhältnis hundert zu eins. Den variablen Faktor im dominanten Term - hier n2 nennt man den dominanten Term des Algorithmus. Damit ist die
Ordnung des Algorithmus zur Lösung eines linearen Systems mit Dreiecksmatrix von der
Ordnung n2 ,das Skalarprodukt die Ordnung n hat. Hierfür benutzt man die sogenannten Landauschen Symbole und schreibt gewöhnlich O(n2 ) bzw. O(n). Der Faktor 1/2 im
Term 1/2n2 heißt die Ordnungskonstante. Es stellt sich heraus, dass man die Ordnung
Algorithmus oft leicht bestimmen kann, die Ordnungskonstante aber nicht. Aus diesem
Grund wird sie oft unterdrückt und nicht angegeben. Sie ist dann von der Bedeutung,
wenn man zwei Algorithmen gleicher Ordnung vergleichen will.
Traditionell wurden in der numerischen Mathematik vorwiegend die Multiplikation
und Divisionen gezählt, da sie gewöhnlich rechenintensiver als Additionen und Subtraktionen sind, und weil bei vielen Algorithmen ähnlich viele Additionen bzw. Subtraktionen
24
Kapitel 2. Numerische Algorithmen, ihre Komplexität und Fehleranalyse
wie Multiplikationen bzw. Divisionen auftreten. Neuerdings gibt es kaum noch nennenswerte Unterschiede zwischen Additionen bzw. Subtraktionen und Multiplikationen bzw.
Divisionen. Daher wird zunehmend jede arithmetische Operation gezählt. Gleitpunktoperationen heißen im Englischen floating point operations oder kurz flops. Jede Addition, Subtraktion, Multiplikation, Division und das Berechnen der Quadratwurzel zählt
als eine Gleitpunktoperation(flop). Die MATLAB-Funktion flops kann (approximativ)
die Anzahl der Gleitpunktoperationen zählen.
25
2.3 Zur Komplexität numerischer Algorithmen
26
Kapitel 3
Graphische Benutzeroberflächen und
MATLAB
3.1
Erstellung einer GUI mit MATLAB
Grafische Benutzeroberflächen (GUI) vereinfachen die Verwendung von MATLAB-Programmen und machen sie anderen Benutzern zugänglich. MATLAB bietet ein einfaches
und leicht erlernbares Konzept zur GUI-Entwicklung.
• GUI Elemente
• Darstellung kontrollieren (Größe, Position, Farben, Eigenschaften ändern)
• Programmierung (Callbacks, Datenstruktur, Spezialfunktionen, handles)
• Darstellung von Daten in Grafiken
3.1.1
GUI Elemente
1. Starten Sie MATLAB
2. Rufen Sie im MATLAB-Command-Window das Programm guide auf
>>guide
3. Auf der nun erschienenen Arbeitsfläche können verschiedene GUI Elemente positioniert
werden. Um die Namen der GUI -Komponenten anzeigen zu lassen, wähle in Menu File
Zeile Preferences und in aufgemachtem Fenster setze das Häkchen in Show names in
27
3.1 Erstellung einer GUI mit MATLAB
component palette. Wir stellen einzelne GUI-Komponenten dar.
Die Beschreibungen einzelner Komponenten wurden aus der MATLAB-Hilfe in englischer Sprache entnommen.
• Push Button Push buttons generate an action when clicked. For example, an OK
button might close a dialog box and apply settings. When you click a push button,
it appears depressed; when you release the mouse, the button appears raised and
its callback executes.
• Toggle Button Toggle buttons generate an action and indicate whether they are
turned on or off. When you click a toggle button, it appears depressed, showing that
it is on. When you release the mouse button, the toggle button’s callback executes.
However, unlike a push button, the toggle button remains depressed until you click
the toggle button a second time. When you do so, the button returns to the raised
state, showing that it is off, and again executes its callback.
• Radio Button Radio buttons are similar to check boxes, but are typically mutually
exclusive within a group of related radio buttons. That is, you can select only one
button at any given time. To activate a radio button, click the mouse button on the
28
Kapitel 3. Graphische Benutzeroberflächen und MATLAB
object. The display indicates the state of the button.
• Check Box Check boxes generate an action when checked and indicate their state
as checked or not checked. Check boxes are useful when providing the user with a
number of independent choices that set a mode, for example, displaying a toolbar
or generating callback function prototypes.
• Edit Text Edit text controls are fields that enable users to enter or modify text
strings. Use edit text when you want text as input. The String property contains
the text entered by the user. The callback executes when you press Enter for a
single-line edit text, Ctl+Enter for a multi-line edit text, or the focus moves away.
• Static Text Static text controls display lines of text. Static text is typically used
to label other controls, provide directions to the user, or indicate values associated
with a slider. Users cannot change static text interactively and there is no way to
invoke the callback routine associated with it.
• Slider Sliders accept numeric input within a specific range by enabling the user
to move a sliding bar, which is called a slider or thumb. Users move the slider by
pressing the mouse button and dragging the slider, by clicking in the trough, or by
clicking an arrow. The location of the slider indicates a percentage of the specified
range.
• List Box List boxes display a list of items and enable users to select one or more
items.
• Pop-Up Menu Pop-up menus open to display a list of choices when users click the
arrow.
• Axes Axes enable your GUI to display graphics (e.g., graphs and images). Like
all graphics objects, axes have properties that you can set to control many aspects
of its behavior and appearance. See ’Axes Properties’ in the MATLAB Graphics
documentation for more information on axes objects.
• Panel Panels group GUI components. Panels can make a user interface easier to
understand by visually grouping related controls. A panel can have a title and
various borders. Panel children can be panels and button groups as well as axes and
user interface controls. The position of each component within a panel is interpreted
relative to the panel. If you move the panel, its children move with it and maintain
their positions on the panel.
29
3.1 Erstellung einer GUI mit MATLAB
• Button Group Button groups are like panels but can be used to manage exclusive selection behavior for radio buttons and toggle buttons. For radio buttons and
toggle buttons that are managed by a button group, you must include the code to
control them in the button group’s SelectionChangeFcn callback function, not in
the individual uicontrol Callback functions. A button group overwrites the Callback
properties of radio buttons and toggle buttons that it manages.
• ActiveX Component ActiveX components enable you to display ActiveX controls
in your GUI.
ActiveX components are available only on the Microsoft Windows platform.
3.1.2
Darstellung kontrollieren (Größe, Position, Farben, Eigenschaften ändern)
Die Eigenschaften der GUI - Komponenten können in Property Inspector angesehen
und geändert werden. Der Property Inspektor wird aktiviert durch Doppelklick auf der
ausgewählten Komponente.
Alle GUI-Komponente besitzen folgende Eigenschaften:
Tag Die Tag-Eigenschaft ist ein Identifikationswert für die Komponente. Der wird von
dem MATLAB Guide selbst benannt (z.B. pushbutton1), wenn man die Komponente auf das Layout setzt. Mit diesem Tag wird dann auch der Callback-Name der
Komponente erweitert ( pushbutton1_Callback). Man sollte die Tag’s abändern,
damit sie leichter mit den Komponenten und Callbacks identifiziert werden können (z.B. Okbutton, quitbutton_Callback). Wenn Sie den Tag der Komponenten
geändert haben, wird der entsprechende Name des Callbacks beim Speichern auch
geändert.
String Die String-Eigenschaft enthält Text und wird in der Komponente oder bei der Komponente eingeblendet.
Value Die Value-Eigenschaft enthält den numerischen Wert der Komponenten, deren Bereich mit den Eigenschaften Max und Min spezifiziert ist.
Für Radio Button und Check Box sind Max und Min mit 1 und 0 voreingestellt.
Die Value-Eigenschaft ist 1, wenn Radio Button oder Check Box gewählt ist.
30
Kapitel 3. Graphische Benutzeroberflächen und MATLAB
Callback Die Callback-Eigenschaft bestimmt die Callback-Funktion, die im GUI M-File aufgerufen wird, wenn der Benutzer diese Komponente aktiviert. GUI-Komponenten
benutzen Callbacks um seine Mission zu erfüllen. Solche Aktionen sind z.B. Klick der
Push Button- Taste, Auswahl eines Menüpunktes, Aktivierung der Radio Button-Taste
oder Verschiebung des Schiebereglers. Neben der Callback-Funktion, die durch die
Callback-Eigenschaft der Komponente bestimmt wird, haben verschiedene graphische Objekte noch zusätzliche Callbacks wie z.B. CreateFcn, DeleteFcn, ResizeFcn.
In diesen Callback-Funktionen beschreibt man die Anweisungen, die beim Erzeugen
der Komponente (CreateFcn) oder bei der Vernichtung der Komponente (DeleteFcn)
usw. durchgeführt werden.
3.2
Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles)
Nachdem die Grafische Benutzeroberfläche entworfen ist und die Eigenschaften der Komponenten gesetzt sind, fängt man an, GUI zu programmieren. Der Programmcode zum
31
3.2 Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles)
Gui befindet sich im Gui M-File. Wenn man das GUI speichert oder startet, generiert
MATLAB das GUI M-File. In diesem File befindet sich der Initialisierungscode und die
Callbacks zu den einzelnen Komponenten. Der generierte Initialisierungscode sollte nicht
geändert werden.
Daten-Freigabe mit der Handles-Struktur
Wenn man GUI startet, erzeugt MATLAB die handles -Struktur. Diese beinhaltet alle
Komponenten des gestarteten GUI, z.B. Menüs, Push Buttons, Edit Text und Axes. Wir
können handles-Strukturen benutzen für
• Freigabe der Daten zwischen Callbacks
• Zugriff auf GUI-Data
• Zum Speichern der Variable X:
handles.current_data = X;
guidata(hObject,handles);
• Zum Abrufen der im handles gespeicherten Daten:
X = handles.current_data;
Zugriff auf GUI-Data
Wir können die Information der GUI-Komponenten aus der handles-Struktur bekommen:
val = str2double(get(handles.edit1,’String’));
Funktionen und Callbacks im M-File
Man kann den Code zu den folgenden Teilen des M-Files addieren.
• Opening Funktion wird durchgeführt, bevor GUI für den Benutzer sichtbar wird.
Man hat hier schon Zugriff auf alle GUI-Komponenten, weil diese schon vor dem
Aufruf OpeningFcn erzeugt sind. Man kann hier den Code hineinschreiben, um alle
Aufgaben zu erledigen, die man am Anfang machen will. Z.B. gibt man am Anfang
in Edit Text etwas aus, zeichnet Grafiken in Axes, blockiert GUI mit dem uiwaitBefehl.
functionmy_gui_OpeningFcn(hObject,eventdata,handles,varargin)
my_gui(’Position’, [71.8 44.9 74.8 19.7]).
• Output Funktion gibt die Output-Argumente in die Kommandozeile zurück. Es
kann nützlich sein, wenn man von einer GUI zu einer anderen etwas übergeben will.
• Callbacks: Callbacks benutzt man, um mit Hilfe von GUI-Komponenten die Ausführung des Programms zu steuern.
Jetzt stellen wir die drei wichtigsten Befehle beim Arbeiten mit GUI vor:
32
Kapitel 3. Graphische Benutzeroberflächen und MATLAB
1) findobj h = findobj(objhandles,’PropertyName’,PropertyValue,...)
Findobj findet alle grafischen Objekte mit vorgegebenen Eigenschaften und
gibt Objekt-Handles zurück.
2) get a=get(h,’PropertyName’) - gibt den Wert des grafischen Objekts h
zurück.
3) set set(H,’PropertyName’,PropertyValue,...) - setzt in Objekt H die Eigenschaft ’PropertyName’ auf den Wert PropertyValue.
3.2.1
Darstellung von Daten in Grafiken
Zur Darstellung von Grafiken benutzen wir die GUI-Komponente Axes\index{Axes}. Damit wird definiert, in welchem Objekt der Plot eigentlich dargestellt werden soll. Die Erzeugung von Grafiken übernehmen die Befehle plot(), surf(), ezplot(), plot3d()
mit Parametern in der Form, die wir schon in Abschnitt Visualisieren mit MATLAB kennen gelernt haben, z.B.
axes(handles.axes1);
plot(xDataFull(xIndex),Y2,’-.r’,uax_out(:,3),uax_out(:,2),’-’).
33
3.2 Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles)
34
Kapitel 4
Einfache numerische Algorithmen mit
MATLAB
4.1
Polynome
Polynome spielen in der Mathematik eine wichtige Rolle. Durch Polynome lässt sich eine
große Klasse von Funktionen approximieren. Polynome lassen sich einfach differenzieren
und integrieren, und man kann leicht die Nullstellen der Polynome numerisch approximieren. Wenn man mit Polynomen höherer Ordnung arbeitet, ist es wichtig, effiziente
Methoden zur Auswertung der Polynomwerte zu haben. Dies hat vor allem in Hinsicht auf
Rundungsfehler bei Fließkommazahlen große Bedeutung. Im wissenschaftlichen Rechnen
ist es darüber hinaus wichtig, die Anzahl der Rechenoperationen einzelner Berechnungen
zu minimieren.
4.1.1
Berechnung von Polynomwerten. Horner-Schema
Eine effiziente Auswertung eines Polynoms und seiner Ableitungen an bestimmten Stellen
wird im Horner-Schema realisiert.
Idee des Horner-Schemas:
Die Berechnung des Polynoms
p(x) = a0 + a1 x + a2 x2 + a3 x3 + a4 x4
an einer Stelle x0 liefert uns folgendes Ergebnis:
p(x) = a0 + a1 x0 + a2 x20 + a3 x30 + a4 x40 = a0 + (a1 + (a2 + (a3 + a4 x0 )x0 )x0 )x0 .
Die Verallgemeinerung des obigen Rechenvorschrifts in der rekursiven Schreibweise liefert
uns folgende Resultat.
35
4.1 Polynome
Sei p ein Polynom (an 6= 0)
p(x) =
n
X
ak x k .
k=0
Zur Auswertung von p an der Stelle x0 setze a0k = ak , k = 0, ..., n, und
a1n = a0n
a1j = a0j + a1j+1 x0
für j = n − 1, ..., 0.
Dann gilt p(x0 ) = a10 . Mit Hilfe des Horner-Schemas lässt sich das Polynom durch den
linearen Faktor (x − x0 ) teilen. Seien
pn (x) =
pn−1 (x) =
n
X
j=0
n
X
a0j xj
a1j xj−1
j=1
Dann gilt für beliebiges x0 und nach obigem Schema entwickelten a10 :
pn (x) = pn−1 (x)(x − x0 ) + a10 .
Jetzt sind wir in der Lage, das vollständige Horner-Schema zu präsentieren. Für k =
0, ..., n und j = k, .., n definieren wir
ak+1
= akj + ak+1
j
j+1 x0 .
Diese Rekursionformel bedeutet nun, dass das Element ak+1
sich aus der Summe des
j
darüberstehenden Elements und des links danebenstehenden Elements multipliziert mit
x0 ergibt. Wir stellen das vollständige Horner-Schema tabellarisch dar.
x0
x0
x0
..
.
a0n
a1n
a2n
a3n
..
.
a0n−1
a1n−1
a2n−1
a3n−1
..
.
a0n−2
a1n−2
a2n−2
a3n−2
..
.
...
...
...
...
a02
a12
a22
a32
a01
a11
a21
a00
a10
x0 an−1
an−1
an−1
n−1
n−2
n
x0 ann ann−1
x0 an+1
n
Als Anwendung lassen sich die Koeffizienten einer Taylorreihe durch das Horner-Schema
berechnen,
n
X
p(k) (x0 )
Tx0 p(x) =
(x − x0 )k .
k!
k=0
Hierbei ergibt sich
p(k) (x0 ) = k! · ak+1
k .
36
Kapitel 4. Einfache numerische Algorithmen mit MATLAB
4.1.2
Polynome in MATLAB
Polynome werden in MATLAB durch einen Zeilenvektor repräsentiert, wobei die Komponenten des Vektors die Koeffizienten des Polynoms darstellen. Die Reihenfolge ist absteigend festgelegt z.B. die Polynome p1 (x) = 3x2 − 2 und p2 (x) = 14x4 − 7x2 + 9x − 6
werden durch folgende Vektoren in MATLAB gegeben:
>>p1 = [3 0 -2]
>>p2 = [14 0 -7 9 -6]
Die Nullstellen des Polynoms lassen sich anhand der Funktion roots() berechnen.
>> r = roots(p1)
Mit dem Befehl poly() können wir aus den Nullstellen das Polynom konstruieren. Da
ein Polynom aber durch seine Nullstellen nur bis auf ein Vielfaches eindeutig bestimmt
ist, wählt MATLAB das Polynom mit Koeffizient 1 vor dem höchsten Monom.
In MATLAB sind andere nützliche Funktionen, die dem Anwender das Arbeiten mit
Polynomen erleichtern implementiert. Die folgende Tabelle fasst die Funktionen zusammen:
Funktion
Beschreibung
conv()
Multipliziert Polynome
deconv()
Dividiert Polynome
poly()
Berechnet Polynom aus Nullstellen
polyder() Berechnet die Ableitung eines Polynoms
polyval() Berechnet Polynomwerte
roots()
Berechnet Nullstellen eines Polynoms
37
4.2 Nullstellenberechnung
4.2
Nullstellenberechnung
Wir betrachten eine nichtlineare Funktion f : Rd → Rd und die damit resultierende
nichtlineare Gleichung
f (x) = 0
(4.1)
Wir nennen x eine Nullstelle der nichtlinearen Gleichung (4.1), wenn x eine Lösung der
Gleichung (4.1) ist.
Unser Ziel ist es verschiedene Methoden zur Lösung solcher Gleichungen vorzustellen.
Bevor man zur Vorstellung einzelner Methoden übergeht, diskutieren wir die Fragen der
Existenz und Eindeutigkeit der Lösung. Im Falle linearer Probleme haben wir bekannte
Ergebnisse, z.B. hat ein lineares Gleichungssystem entweder keine, eine oder unendlich
viele Lösungen. Für die Eindeutigkeit der Lösung muss die Matrix regulär sein. Im nichtlinearen Fall können die Gleichungen jede Anzahl von Lösungen haben. Darüber hinaus
können nichtlineare Gleichungen mehrfache Nullstellen besitzen.
Lineare Gleichungen bzw. lineare Gleichungssysteme lassen sich in endlich vielen Schritten
lösen. Dagegen sind nichtlineare Gleichungen nicht immer direkt lösbar. Diese Gleichungen
können im allgemeinen nur approximativ gelöst werden, und zwar durch die Anwendung
des geeigneten iterativen Verfahrens.
4.2.1
Bisektions-Methode
Als Einführung in die Problematik stellen wir das Intervallschachtellungsverfahren (BisektionsMethode) vor. Im folgenden interessieren wir uns nur für reelle Nullstellen nichtlineare
Gleichungen im R1 .
Idee der Bisektions-Methode: Wechselt eine stetige Funktion f auf einem Intervall ihr
Vorzeichen, so muss sie nach dem Zwischenwertsatz (ZWS) in diesem Intervall mindestens
eine Nullstelle haben.
Algorithmus der Bisektions-Methode
Angenommen f sei eine stetige Funktion auf dem Intervall [a0 , b0 ] mit mindestens einer
Nullstelle in [a0 , b0 ].
Die Bisektions-Methode hat dann folgende Form:
1) Für n = 0, 1, 2, 3, ...
2) berechne Mittelpunkt mn =
an +bn
.
2
3) Wenn f (mn )f (an ) < 0 ist, dann liegt die Nullstelle in [an , mn ]; bn+1 := mn , an+1 :=
an . Gehe zu 1) und erhöhe n um 1.
5) Wenn f (mn )f (bn ) < 0 ist, dann liegt die Nullstelle in [mn , bn ]; bn+1 := bn , an+1 :=
mn . Gehe zu 1) und erhöhe n um 1.
38
Kapitel 4. Einfache numerische Algorithmen mit MATLAB
Konvergente iterative Methoden erzeugen eine Folge von Approximationen {xn }n∈N ⊂ R,
so dass mit der Nullstelle x gilt
lim xn = x
(4.2)
n→∞
Weil iterative Methoden theoretisch unendlich viele Schritten haben, muss man ein Abbruchkriterium festlegen. Für die Bisektions-Methode werden wir folgendes Abbruchkriterium verwenden:
Führe den Algorithmus solange durch, bis |a − b| kleiner als eine vorgegebene Zahl tol ist.
Wie schon erwähnt wurde, konvergiert die Iterationsfolge. Es stellt sich die Frage nach
Konvergenzgeschwindigkeit der Methode. Es lässt sich leicht zeigen, dass
1
1
|xn − x| ≤ (bn − an ) = n+1 (b0 − a0 )
2
2
(4.3)
gilt, wobei xn der Intervallmittelpunkt des Intervalls (an , bn ) und x die Nullstelle der
nichtlinearen Gleichung ist. Diese Abschätzung nennt man a-priori-Fehlerabschätzung,
und damit sind wir in der Lage zu sagen, wie viele Schritte höchstens erforderlich sind,
um eine Approximation der Nullstelle x mit einer vorgegebener Genauigkeit zu berechnen.
Fassen wir zusammen: Für die Implementierung einer iterativen Methode sollten folgende
Fragen beantwortet werden.
• Angabe des Startpunktes bzw. Startintervalls des Verfahrens.
• Konvergiert die Iterationsfolge? Wenn die Folge konvergiert, ermitteln wir die Konvergenzgeschwindigkeit der Methode.
• Wann wird die Iterationsfolge abgebrochen?
Für die Charakterisierung der Konvergenzgeschwindigkeiten führen wir folgende Definitionen ein.
Definition 4.1 Eine Iterationsfolge {xn }n∈N konvergiert linear mit der Rate c (0 ≤ c <
1) gegen die Nullstelle x, wenn
lim sup
n→∞
|xn+1 − x|
=c
|xn − x|
(4.4)
gilt.
Definition 4.2 Eine Iterationsfolge {xn }n∈N konvergiert mindestens mit der Ordnung p
und der Rate c (0 ≤ c < 1) gegen die Nullstelle x, wenn
|xn+1 − x| p
lim sup
≤c
|xn − x|
n→∞
39
(4.5)
4.2 Nullstellenberechnung
gilt. Ist p = 2, so ist die Ordnung mindestens quadratisch usw. Gilt sogar
|xn+1 − x| p
= c 6= 0
lim sup
|xn − x|
n→∞
(4.6)
so konvergiert die Folge genau mit der Ordnung p. Ist c = 0 so nennt man die Konvergenz
superlinear (p = 1), superquadratisch (p = 2) usw.
Aus (4.3) erhalten wir unmittelbar, dass die Konvergenzgeschwindigkeit der BisektionsMethode linear mit p = 1 und c = 0.5 ist.
Vorteile und Nachteile der Bisektions-Methode
Ein Vorteil der Bisektions-Methode ist ihre globale Konvergenz; ein Nachteil ist ihre langsame lineare Konvergenzgeschwindigkeit.
4.2.2
Methode der sukzessiven Approximation
Sei F : Rd → Rd eine skalare(d = 1) oder vektorwertige(d > 1) Funktion.
Definition 4.3 Eine Zahl x∗ ∈ Rd heißt Fixpunkt von F , wenn x∗ Lösung der folgenden
Gleichung ist:
x∗ = F (x∗ )
(4.7)
Die Iterationsvorschrift der Methode der sukzessiven Approximation (Fixpunktiteration) hat die Form
xn+1 = F (xn ), n = 0, 1, 2, ...
(4.8)
Dabei ist x0 die Anfangsapproximation. Jetzt stellt sich die Frage, ob die Fixpunktiteration eine konvergente iterative Methode ist. Die Antwort ist ja, wenn die Funktion F eine
Kontraktion ist.
Satz 4.4 (Theorem 5.7 in [Pla00]) Sei M ⊂ Rd eine abgeschlossene Teilmenge, und
die Abbildung F : M → M sei bezüglich einer Vektornorm k.k : Rd → R eine Kontraktion, das heißt, für eine Konstante 0 < L < 1 sei
kF (x) − F (y)k ≤ Lkx − yk x, y ∈ M,
(4.9)
erfüllt. Dann gilt folgendes:
a) F besitzt genau einen Fixpunkt x∗ ∈ M ;
40
Kapitel 4. Einfache numerische Algorithmen mit MATLAB
b) Für jeden Startwert x0 ∈ M liefert die Fixpunktiteration (4.8) eine gegen x∗ konvergierende Folge, und es gelten die Fehlerabschätzungen
kxn − x∗ k ≤
Ln
L
kxn − xn−1 k ≤
kx1 − x0 k,
1−L
1−L
n = 1, 2, 3, ...
(4.10)
Für stetig differenzierbare Funktionen F können wir ein wichtiges Kriterium für die
Lipschitz-Bedingung (4.9) angeben.
Satz 4.5 ([SH82] S. 35) Die Funktion F sei stetig differenzierbar auf der Teilmenge
M = Kρ (c) = {x ∈ Rd | kx − ck ≤ ρ}. Dann ist die Bedingung
kF 0 (x)k ≤ L,
x ∈ M,
(4.11)
notwendig und hinreichend für die Lipschitz-Bedingung (4.9):
kF (x) − F (y)k ≤ Lkx − yk x, y ∈ M.
Auf der Basis der Methode der sukzessiven Approximation lassen sich vergleichsweise
effiziente Methoden zur Nullstellenberechnung bilden. Die Nullstellen von f : M → Rd
sind gerade die Fixpunkte der folgenden Funktion F :
f (x) = 0 ⇔ x = F (x), F (x) = x − Cf (x), x ∈ M.
Dabei ist M eine abgeschlossene Teilmenge des Rd und C eine reguläre d × d−Matrix.
4.2.3
Newton-Verfahren
Die Iterationsfolge des Newtonsverfahrens ist im R1 durch folgende Formel definiert:
xn+1 = xn −
1
f 0 (x
n)
f (xn ),
n = 0, 1, 2, ...
(4.12)
Im weiteren bezeichnet G eine offene Teilmenge des R. Folgender Satz sichert uns die Konvergenz der Newton-Methode mit quadratischer Konvergenzgeschwindigkeit für einfache
Nullstelle unter den im Satz getroffenen Voraussetzungen.
Satz 4.6 ([SH82], S. 39) Die Funktion f ∈ C 2 (G) möge mit positiven Zahlen m, M den
Bedingungen genügen
|f 0 (x)| ≥ m, |f 00 (x)| ≤ M, x ∈ G.
(4.13)
Zu jeder Nullstelle z ∈ G gibt es dann eine Umgebung Kρ (z) ⊆ G, ρ > 0, so dass z
die einzige Nullstelle von f in Kρ (z)ist, für jeden Anfangswert x0 ∈ Kρ (z) die Näherungen x1 , x2 , ... in Kρ (z) bleiben und gegen die Nullstelle z konvergieren mit der a-prioriFehlerabschätzung
q=
41
M
|x0 − z| < 1,
2m
|xn − z| ≤
2m 2n
q , n = 0, 1, 2, ...,
M
4.2 Nullstellenberechnung
und den a-posteriori-Fehlerabschätzungen
|xn − z| ≤
1
M
|f (xn )| ≤
|xn − xn−1 |, n = 0, 1, 2, ....
m
2m
Bei einer einfachen Nullstelle ist das Newton-Verfahren lokal quadratisch konvergent. Bei
einer mehrfachen Nullstelle x∗ konvergiert das Newton-Verfahren superlinear,
xn+1 − x∗
1
= 1 − , x∗ m-fache Nullstelle.
n→∞ xn − x∗
m
lim
Kennt man m nicht, so kann man mit Hilfe der Asymptotik
xn−1 − xn
1
xn − xn−2
≈1−
⇒ m≈
xn−2 − xn
m
xn−1 − xn−2
m approximieren. Wenn x∗ eine m − f ache Nullstelle ist, dann können wir das NewtonVerfahren beschleunigen:
f (xn )
.
xn+1 = xn − m 0
f (xn )
Diese modifizierte Iterationsfolge konvergiert quadratisch gegen eine m−fache Nullstelle
x∗ .
Vorteile und Nachteile des Newton-Verfahrens
Vorteil
• Bei einfacher Nullstelle lokal quadratisch konvergent
Nachteile
• Benötigt Ableitungswerte
• Nur lokal konvergent
4.2.4
Die Sekantenmethode (Regula falsi)
Wenn man die in der Newton-Methode benötigte Ableitung f 0 nicht ausrechnen kann, so
approximiert man die Ableitung f 0 durch einen Differenzenquotienten. Damit erhält man
folgende Iterationsformel:
xn+1 = xn − f (xn )
xn − xn−1
,
f (xn ) − f (xn−1 )
n = 0, 1, 2, ...
(4.14)
Dabei benötigt die Sekantenmethode zwei Anfangswerten x0 , x1 . Der Konvergezsatz
für die Sekantenmethode lässt sich ganz analog wie beim Newton-Methode formulieren
und beweisen. Einzige Unterschied stellt die Konvergenzgeschwindigkeit dar. Es lässt sich
zeigen, dass Sekantenmethode superlinear gegen die einfache Nullstelle x∗ konvergiert.
42
Kapitel 4. Einfache numerische Algorithmen mit MATLAB
Vorteile und Nachteile der Sekantenmethode
Vorteile
• Benötigt keine Ableitung der Funktion
• Benötigt nur eine neue Funktionsauswertung pro Iteration
• Bei einfacher Nullstelle superlinear konvergent
Nachteil
• Nur lokal konvergent
4.3
4.3.1
Lineare Gleichungssysteme: Direkter und iterativer
Löser
Inverse Matrix, Normen und Konditionszahl der Matrix
Zuerst betrachten wir
MATLAB-Name
dot(a,b)
norm(b)
norm(b,p)
cross(a,b)
det(A)
inv(A)
eye(n)
norm(A)=norm(A,2)
norm(A,1)
norm(A,inf)
cond(A)=cond(A,2)
cond(A,1)
cond(A,inf)
einige nützliche Funktionen:
Bedeutung
Skalarprodukt zwei Vektoren
Euklidische Länge eines Vektors
P
1
kbkp = ( ni=1 |bi |p ) p
Kreuzprodukt
Determinant von A
Inverse von A
n × n Einheitsmatrix
Spektralnorm
P
maxj P ni=1 |aij |
maxi nj=1 |aij |
Konditionszahl von A bezüglich der Spektralnorm
cond(A) bzgl. der Spaltensummennorm k.k1 .
cond(A) bzgl. der Zeilensummennorm k.k∞ .
Man kann lineare Gleichungssysteme Ax = b mittels der Inversen der Matrix A lösen:
x=inv(A)*b. Dies ist aber numerisch ineffizient im Vergleich zu anderen Vorgehensweisen.
43
4.3 Lineare Gleichungssysteme: Direkter und iterativer Löser
4.3.2
Direkte Verfahren
MATLAB hat eine Reihe von Algorithmen zur Lösung von linearen Gleichungssystemen
und verwandten Problemen eingebaut. Sei
A = [ 1 5 6; 7 9 6; 2 3 4], b = [29; 43; 20].
Der Grundbefehl zur Lösung eines linearen Gleichungssystems ist der umgekehrte Schrägstrich
x=A\b
Die Rechnung wird mit der Gauß-Elimination (mit Pivotierung) durchgeführt. Wenn A
in obererer oder unterer Dreiecksform vorliegt, wird Rückwärts- bzw. Vorwärtseinsetzen
durchgeführt.
Anmerkung: Wenn A nicht quadratisch ist, wird keine Fehlermeldung ausgegeben, sondern automatisch das zugehörige lineare Ausgleichsproblem gelöst (Verallgemeinerte bzw.
Quasi-Lösung).
Vorwärtseinsetzen
Wir betrachten zunächst untere
System gegeben:

l11
 l21
l31
Dreieckssysteme Lx = b. Hierzu sei folgendes 3 × 3
 

0 0
x1
b1
l22 0   x2  =  b2 
l32 l33
x3
b3
Die Unbekannten x1 , x2 und x3 können wie folgt berechnet werden:
b1
l11
b2 − l21 x1
=
l22
b3 − l31 x1 − l32 x2
=
l33
x1 =
x2
x3
Rückwärtseinsetzen
Das Lösen eines linearen Systems U x = b mit einer oberer Dreiecksmatrix U geschieht
analog zum unteren Dreiecksfall.


 

u11 u12 u13
x1
b1
 0 u22 u23   x2  =  b2 
0
0 u33
x3
b3
Die Unbekannten x1 , x2 und x3 können wie folgt berechnet werden:
44
Kapitel 4. Einfache numerische Algorithmen mit MATLAB
b3
u33
b2 − u23 x3
=
u22
b3 − u12 x2 − l13 x3
=
u11
x3 =
x2
x1
Die Grundlage der Gauss-Elimination Methode bildet eine LU-Zerlegung. Die Matrix A
lässt sich in ein Produkt
A = LU
einer unteren Dreiecksmatrix L und einer oberen Dreiecksmatrix U zerlegen. Ist nun eine
LU −Faktorisierung gegeben, dann kann man das lineare Gleichungssystem Ax = b auch
als LU x = b schreiben. Damit läßt sich das untere Dreieckssystem Ly = b durch Vorwärtseinsetzen und das obere Dreieckssystem U x = y durch Rückwärtseinsetzen lösen.
Bei Vertauschung (P A = LU ) muss Ly = P b durch Vorwärts- und dann U x = y durch
Rückwärtseinsetzen gelöst werden. Vereinbart man noch, dass bei L nur jeweils 1 in der
Diagonale steht, dann ist die obige Zerlegung eindeutig.
LU-Zerlegung in MATLAB In MATLAB erfolgt eine LU-Zerlegung einer Matrix
A mit dem Befehl lu(A). Je nach Anzahl der Ausgabeargumente erhält man unterschiedliche Antwortmatrizen.
>>[L,U,P] =lu(A)
Mit Hilfe von 3 Ausgabeargumenten erhält man die untere Dreiecksmatrix L, die obere
Dreiecksmatrix U sowie die Permitationsmatrix P. Es gilt dann P A = LU.
>>[L,U] =lu(A)
Hier bekommt man die obere Dreiecksmatrix U und die verallgemeinerte Dreiecksmatrix
L. A = LU.
>>Y=lu(A)
Man findet im oberen Teil der Matrix Y die obere Dreiecksmatrix U wieder und unter der
Hauptdiagonalen die untere Dreiecksmatrix L ohne Hauptdiagonale als Untermatrizen.
Deswegen ist Y = U+L-eye(size(X)), wenn [L,U,P] = lu(X) gilt.
45
4.3 Lineare Gleichungssysteme: Direkter und iterativer Löser
4.3.3
Iterative Verfahren zur Lösung linearer Gleichungssysteme
Die direkten Verfahren stellen bei einer kleinen Anzahl von Unbekannten oftmals eine
effiziente Vorgehensweise dar. Iterative Methoden lösen ein lineares System dadurch, dass
sie mit einem Startpunkt beginnen und diesen solange sukzessiv verbessern, bis die gewünschte Genauigkeit erreicht ist. Theoretisch müssen unendlich viele Iterationsschritte
durchgeführt werden. In der Praxis aber hört man auf, sobald das Residuum kb − Axk
oder ein anderes Fehlermaß klein genug ist.
MATLAB stellt eine Reihe von Verfahren zur iterativen Lösung linearer Gleichungssysteme zur Verfügung. Wir werden nun einige wichtige Verfahren durchgehen, die alle - im
Gegensatz zum Jacobi oder Gauss-Seidel Verfahren - für allgemeine quadratische Matrizen funktionieren. Alle diese Methoden basieren sich auf die Methode der konjugierten
Gradienten.
Die Methode der konjugierten Gradienten
Die Methode der konjugierten Gradienten basiert auf Ideen der mathematischen Optimierung. Sie ist anwendbar auf lineare Systeme mit symmetrischen und positiv definiten
Matrizen. In exakter Arithmetik konvergiert das Verfahren in einer endlichen Anzahl von
Schritten. Aufgrund von Rundungsfehlern auf dem Computer muss die Methode jedoch
als ein iteratives Verfahren betrachtet werden.
Algorithmus zur Lösung des GS Ax = b
Ist x0 der Startpunkt und p0 = r0 = b − Ax0 , dann wiederholt man für k =0,1,... folgende
Schritte bis Konvergenz eintritt:
1. αk =
rkT rk
pT
k Ask
(Schrittweite)
2. xk+1 = xk + αk pk (Approximierte Lösung, Iterierte)
3. rk+1 = rk − αk Apk (Residuum)
4. βk+1 =
T
rk+1
rk+1
rkT rk
5. pk+1 = rk+1 + βk+1 pk (Schrittrichtung)
Verfahren für reguläre Matrizen
Zunächst definieren wir uns ein Beispiel-Gleichungssystem und zwar eins, das sehr schlecht
konditioniert ist
A = [0.7800.563; 0.913 0.659];
b = [0.217; 0.254];
cond(A,2)
Die exakte Lösung dieses Systems ist [1; -1]. Wir stellen jetzt cg- basierte Verfahren dar.
Im Einzelnen sind dies
bicgstab - „stabilisiertes bikonjugiertes Gradientenverfahren “
46
Kapitel 4. Einfache numerische Algorithmen mit MATLAB
cgs -„quadriertes konjugiertes Gradientenverfahren “
bicg-„bikonjugiertes Gradientenverfahren“
gmres - „verallgemeinertes Minimalresiduumsverfahren“
Bei dem ersten Beispiel, dem ´´bicgstab´´ Verfahren, betrachten wir genauer, welche Parameter angegeben werden können. Alle Verfahren haben die gemeinsame Eigenschaft,
dass sie verschiedene Abbruchkriterien verwenden. Nach Abbruch des Verfahrens wird
ausgegeben, aus welchem Grund die Iteration beendet wurde.
1) Abbruch bei erreichter gewünschter Genauigkeit: Hier wird für eine vorgegebene Toleranz ´´tol´´ so lange iteriert, bis das relative Residuum kAx − bk/kbk < tol (für die
2-Norm) ist. Der Vorteil dieses Verfahrens liegt darin, dass sich der Fehler in der Lösung
dann aus der Kondition der Matrix A abschätzen lässt. Die gewünschte Genauigkeit ist
mit 10−6 voreingestellt.
2) Abbruch nach maximaler Anzahl an Iterationen: Wenn eine maximale Anzahl von
Iterationen erreicht ist, wird das Verfahren in jedem Fall abgebrochen, auch wenn die
gewünschte Genauigkeit noch nicht erreicht ist. Die maximale Anzahl der Iterationen ist
mit n (=Dimension des Problems) voreingestellt.
3) Abbruch bei Stagnation: Wenn sich das Residuum nicht mehr verbessert, wird ebenfalls
abgebrochen, auch wenn die gewünschte Genauigkeit noch nicht erreicht ist.
Wir illustrieren nun die verschiedenen Abbruchkriterien. Beachte: Die Anzahl der Iterationen, die nach dem Abbruch angegeben wird, kann ein nichtganzzahliger Wert sein, da
viele Verfahren mehrstufige Iterationsschritte durchlaufen, die nach einem Teildurchlauf
abgebrochen werden können. Wir rufen das Verfahren zunächst ohne weitere Paremeter
auf.
>> bicgstab(A,b) input(’druecke RETURN’)
Hier tritt nun ein Abbruch wegen erreichter maximaler Anzahl der Iterationen auf. Als
optionale Parameter können nun die Toleranz als drittes Argument und die maximale Anzahl der Iterationen als viertes Argument angegeben werden. Wir erhöhen nun die Anzahl
der Iterationen und belassen die Toleranz bei dem voreingestellten Wert 1e-6.
>>bicgstab(A,b,1e-6,20) input(’druecke RETURN’)
Hier tritt ein Abbruch bei erreichter Genauigkeit ein, das Ergebnis ist aber noch nicht
zufriedenstellend, da A schlecht konditioniert ist. Wir erhöhen also die gewünschte Toleranz:
>>bicgstab(A,b,1e-10,20) input(’Druecke RETURN’)
Jetzt kann man mit dem Ergebnis zufrieden sein. Wir verwenden jetzt den gleichen Aufruf
für andere Verfahren
>>cgs(A,b,1e-10,20) input(’Druecke RETURN’)
>>bicg(A,b,1e-10,20) input(’Druecke RETURN’)
>>qmr(A,b,1e-10,20) input(’Druecke RETURN’)
Eine Ausnahme macht das gmres-Verfahren, das eine verschachtelte Iteration verwendet.
Hier muss als dritter Parameter die maximale Anzahl der Schritte der inneren Iteration
angegeben werden.
>>gmres(A,b,3,1e-10,20) input(’Druecke RETURN’)
Welches Verfahren für welche Problemklasse am angemessensten ist, hängt stark vom
betrachteten Problem ab.
47
4.3 Lineare Gleichungssysteme: Direkter und iterativer Löser
48
Literaturverzeichnis
[DR05] F.-J. Delvos, H.-J. Reinhardt, Numerik I, Skript, Universität Siegen, August 2005.
[GW00] G. Gramlich, W. Werner, Numerische Mathematik mit Matlab: eine Einführung
für Naturwissenschaftler und Ingenieure, dpunkt-Verlag, 2000.
[MF99] J. H. Mathews, K. D. Fink, Numerical Methods using MATLAB, Prentice Hall,
1999.
[Mat05a] Matlab: Mathematics, The MathWorks, Natick, MA, USA, 2005. htpp://www.mathworks.de
[Mat05b] Matlab: Graphics,
pp://www.mathworks.de
The
MathWorks,
Natick,
MA,
USA,
2005.
ht-
[Mat05c] Matlab: Programming, The MathWorks, Natick, MA, USA, 2005. htpp://www.mathworks.de
[Mol04] C. Moler, Numerical Computing with MATLAB, SIAM, 2004.
[Pla00] R. Plato, Numerische Mathematik kompakt, Vieweg, Wiesbaden, 2000.
[SH82] F. Stummel, K. Hainer, Praktische Mathematik, B.G. Teubner, Stuttgart, 1982.
49
Stichwortverzeichnis
Algorithmus, 19
Callback, 31
Datentyp, 8
Fehler
absoluter, 21
relativer, 21
Datenfehler, 21
Rechenfehler, 21
Rundungsfehler, 23
File
Funktion-File, 15
Script-File, 14
findobj, 33
flop, 25
for, 10
Format
double-Format, 5
MATLAB-Format, 14
Zahlenformat, 5
ASCII-Format, 14
Funktion
von Funktionen
eval, 16
feval, 16
inline, 17
von Vektoren und Matrizen, 16
Gauss-Algorithmus, 44
get, 33
Gleitpunktsystem, 22
Gleitpunktzahl
Basis, 22
Exponent , 22
Mantisse, 22
Grafik
2D-Grafik, 11
3D-Grafik, 12
Funktionsgraph im R2 , 12
Funktionsgraph im R3 , 13
GUI, 27
Gui Element
Axes, 29, 33
Button Group, 30
Edit Text, 29
Panel, 29
Push Button, 28
Radio Button, 28
Static Text, 29
Handles, 32
help, 4
helpdesk, 4
helpwin, 4
IEEE, 5
IEEE-Standard, 23
if, 10
KDE, 3
Koctave, 3
Kommentar, 4
Kondition, 21
Kontraktion, 40
Konvergenzgeschwindigkeit, 40, 41
Lapack, 3
linspec, 11
lookfor, 4
LU-Zerlegung, 45
Maschinengenauigkeit, 23
Matrix, 2, 7
meshgrid, 13
Methode
50
STICHWORTVERZEICHNIS
Bisektions-Methode, 38
Methode der konjugierten Gradienten,
46
Methode der sukzessiven Approximation, 40
Newton-Verfahren, 41
Sekantenmethode, 42
Nullstelle, 38
Octave, 3
Operation
logische, 9
Standardoperation, 5
elementweise Operation, 8
Ordnung des Algorithmus, 24
Ordnungskonstante, 24
plot, 11
Polynom
Horner-Schema, 35
Polynome in Matlab, 37
Property Inspektor, 30
Prototyp, 2
set, 33
Simulink, 2
Steuerstruktur
Schleife, 9
Sprunganweisung, 10
Verzweigung, 10
switch, 10
Toolbox, 2
Variable, 5
Vector, 6
Visualisierung, 1, 10
while, 10
51