[WS] Grundlegende Algorithmen in der Numerik |
27.08.2008, 16:44 | 42 | Auf diesen Beitrag antworten » | |||||||||||||||
[WS] Grundlegende Algorithmen in der Numerik ich möchte euch heute ein paar grundlegenden numerische Algorithmen vorstellen. Dieser Artikel soll weniger die Theorie behandeln, sonder eher wie man diese konrekt Umsetz. Dazu wird hier Java verwendet, sollte aber einem leicht fallen dieses in eine andere Sprache zu portieren. Dieser Workshop ist nur als kleine, praxisnahe Einführung gedacht. Außergewöhnliches Hochschulwissen braucht man nicht, nur etwas programmieren sollte man können. Nullstellen finden per Binärteilung Nullstellen spielen einen zentrale Rolle. Wenn man einen Algorithmus findet, der Effektiv die Nullstellen einer beliebigen Funktion findet, lassen sich damit sehr viele Probleme lösen. Möchte man dann z.B. die Wurzel 2 ziehen, muss man nur die Nullstelle von x^2 - 2 finden. Mit Binärteilung kann man relativ effizient eine Nullstelle finden, sofern die Funktion bestimmte Voraussetzungen erfüllt. Zuerst einmal sollte es eine stetige (reelle) Funkion sein. Für die Binärteilung müssen wir einen negativen und einen positiven Funktionswert finden, nach dem Zwischenwertsatz weiß man dann, dass zwischen diesen beiden Stellen min. eine Nullstelle liegt. Sollten mehr als eine Nullstelle in dem Abschnitt existieren, so findet unsere Binärteilung eine Nullstelle, wir wissen aber nicht welche. Was mit der Binärteilung nicht funktioniert, ist nur 'Berührungspunkte' des Graphen mit der x Achse zu finden. Algorihmus - Abstrakt: Man hat ein Intervall [a,b] gegeben, wobei f(a) und f(b) verschiedene Vorzeichen haben müssen. Dann berechnet man die Mitte des Intervalls, also und berechnet dann f(m). Haben f(a) und f(m) das selbe Vorzeichen, so verschiebt man die linke Seite, also a, nach m, denn wir wissen, dass die Nullstelle im Intervall [m, b] liegen muss. Haben die verschiedene Vorzeichen, ist das neue Intervall indem die Nullstelle liegt [a, m]. Dies kann man nun beliebig oft wiederhohlen, mit jedem Schritt halbiert sich die größe unserer Intervalls, weswegen wir sehr schnell eine guten Wert für die Nullstelle erhalten. Algorithmus - Java: In Java sieht das ganze so aus:
Mit diesem kleinen Code lässt sich z.B. die Wurzel (sqrt) aus einer beliebigen Zahl bestimmen. Denn die Wurzel aus c, ist einfach die Nullstelle von x^2 - c. Man weiß, dass die Nullstelle von x^2 - c im Intervall [0, c] liegen muss. Maximum per Dreiteilung finden Hier gehen wir davon aus, dass in dem Intervall [a,b] ein lokales Maximum liegt, welches wir finden möchten. Sind mehrere lokale Maxima enthalten, wird nur eins gefunden, wovon wir aber nicht sagen können welches. Deswegen ist es ratsam, wenn nur eins in [a,b] enthalten ist ![]() Algorithmus - Abstrakt: Man unterteil das Intervall [a, b] in drei gleichgoße Teile. Dazu berechnet man den Abstand dx von a und b und drittelt diesen, also . Anschließend berechnet man die Funktionswerte f(a+dx) und f(b-dx). Ist f(a+h) größer als f(b-h), so zieht man die rechte Grenze des Intervalls, also b, dran, also b bekommt dann den Wert b-h. Ist es anderes herum, zieht man a dran. Dies kann man sich am besten mal bei einer umgedrehten Parabel (z.B. -x^2 + 10) veranschaulichen. Algorithmus - Java:
numerische Integration Sicher kennt jeder noch die Verfahren, bei denen man diese kleinen Rechtecke oder Trapeze unter einen Graphen einzeichnet und ausmisst, um so Näherungsweise den Flächeninhalt zu bekommen. Da ich momentan keine Lust mehr habe dazu viel zu schreiben, hier nur der Code:
Vielleicht kann ich das später noch ergänzen. |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|