AuD Übung 01 (Stefan Bosse) [15.11.2024]
Gruppe und Namen der Mitglieder
Punkte:Total/21./22./23./24./25./2

Übung Numerik (01)

In dieser Übung sollen zwei Ziele erricht werden:

  1. Grundlegendes Verständnis von Laufzeit und Methode des Profilings (Komplexität)
  2. Erste Untersuchung von numerischen Algorithmen bezüglich Laufzeit und Genauigkeit, die hier als weiche Korrektheit verstanden werden kann.

Ausgabe : 7.11.2024

Abgabe : 15.11.2024

Laufzeit von Algorithmen

Hinweis: Wenn zu Beginn der folgenden Codesnippets im Kommentar profile steht wird ein Profiling mit einer Bytecode VM des Codes durchgeführt. Man erhält am Ende eine Statistik aller aufgerufenen Bytecode Instruktionen. Wichtig ist nur die Gesamtsumme opCount als ein Maß für die Anzahl der ausgeführten Einheitsoperationen. Im Code immer nur N verändern.

Für die Vertiefung: Weitere Informationen zum Profiler finden sich hier https://github.com/joskid/continuum wo die JavaScript Virtual Machine beschrieben wird.

Im Gegensatz zur Messung der Laufzeit ist die Messung der ausgeführten Einheitsoperationen ein stabiles Maß und gibt meistens fast linear proportional die Rechenzeit wieder.

Im folgenden sollen die beiden Algorithmen A und B bezüglich Rechenaufwand und Rechengenauigkeit verglichen werden.

Ausführung Algorithmus A

 ▸ 
 ✗ 
 ≡ 

Ausführung Algorithmus B

 ▸ 
 ✗ 
 ≡ 

Aufgabe 1. Wie hängt beim Algorithmus B die Laufzeit ungefähr von N ab?


Wirklich?

Aufgabe 2. Führe das Profiling für B durch und trage die Werte in nachfolgende Tabelle ein. Prüfe das Ergebnis durch einen Plot (unten).

Laufzeit B
Plot aus vorheriger Tabelle


 ▸ 
 ✗ 
 ≡ 

Aufgabe 3. Wie ist das Ergebnis? Entspricht es der theoretischen Erwartung? Wo kommen die wesentlichen Beiträge zur Laufzeit und Abhängigkeit von N her?


Genauigkeit von Numerischen Algorithmen

Ab hier sollen Algorithmen in Java mit dem integrierten JS Transpiler implementiert werden.

In der Numerik gilt es Algorithmen hinsichtlich folgender Kriterien zu untersuchen:

  1. Korrektheit
  2. Effizienz

Ein allgemeiner Hinweis:

Der Java2JS Transpiler besteht aus einem Parser, Generator und einen Typprüfer. Der Parser nimmt Java bis Version 7 an, Lambda Ausdrücke sind als Workaround implementiert und dürfen nur einfache Operationen und Anweisungen enthalten (inkl. return). Der Generator erzeugt JavaScript Code. Der Transpiler an sich schluckt alles, auch semantisch/operational falschen Java Code (inkl. Tpyfehlern). Es könnten dann Fehler bei der Ausführung (Runtime Error) auftreten. Der Typprüfer ist nicht vollständig. Teils werden nur Warnungen ausgegeben, die dann aber bei der Ausführung zu Programmfehlern führen können.

Bei Verwendung des Transpilers können alle Klassen inklusive einer öffentlichen Hauptklasse, die die main Methode enthält, in einem Codeabschnitt eingefügt und ausgeführt werden. Eine Trennung ist nicht erforderlich.

Aufgabe 4. Lese das Modul B Abschnitt Approximation von Integralen. Implementiere die dort vorgestellten Algorithmen Trapezregel, Simpson, und adaptive Simpsonregel, jeweils in dem nachfolgenden Klassentemplate Integrate bezeichnet als Methoden integrate2, integrate3, und integrate4. Test die Algorithmen mit N=10-10000 bzw. ε=1E-2 - 1E-7 für die Funktionen sin und exp. Notiere das Ergebnis (Ausgabe) und den opCounts vom Profiling.


Numerische Integration

 ▸ 
 ℙ 
[]
 ✗ 
 ≡ 

Y2xhc3MgSW50ZWdyYXRlICB7CiAgcHVibGljIGZsb2F0IGludGVncmF0ZTEoRnVuY3Rpb24gPEZsb2F0LEZsb2F0PmYsZmxvYXQgYSwgZmxvYXQgYiwgaW50IE4pIHsKICAgIC8vIEVpbnplbHB1bmt0CiAgICBmbG9hdCB5PTA7CiAgICBmbG9hdCBkZWx0YT0oYi1hKS9OOwogICAgZm9yKGZsb2F0IHg9YTt4PGI7eCs9ZGVsdGEpIHk9eStkZWx0YSpmLmFwcGx5KHgpOwogICAgcmV0dXJuIHk7CiAgfQogIHB1YmxpYyBmbG9hdCBpbnRlZ3JhdGUyKEZ1bmN0aW9uIDxGbG9hdCxGbG9hdD5mLGZsb2F0IGEsIGZsb2F0IGIsIGludCBOKSB7CiAgICAvLyBUcmFwZXoKICAgIGZsb2F0IHk9MDsKICAgIGZsb2F0IGRlbHRhPShiLWEpL047CiAgICBmb3IoZmxvYXQgeD1hO3g8Yjt4Kz1kZWx0YSkgCiAgICAgICAgeT15K2RlbHRhLzIqKGYuYXBwbHkoeCkrZi5hcHBseSh4K2RlbHRhKSk7CiAgICByZXR1cm4geTsKICB9CiAgcHVibGljIGZsb2F0IGludGVncmF0ZTMoRnVuY3Rpb24gPEZsb2F0LEZsb2F0PmYsZmxvYXQgYSwgZmxvYXQgYiwgaW50IE4pIHsKICAgIC8vIFNpbXBzb24KICAgIGZsb2F0IHk9MDsKICAgIGZsb2F0IGRlbHRhPShiLWEpL047CiAgICBmb3IoZmxvYXQgeD1hO3g8Yjt4Kz1kZWx0YSkgCiAgICAgICAgeT15K2RlbHRhLzYqKGYuYXBwbHkoeCkrNCpmLmFwcGx5KHgrZGVsdGEvMikrZi5hcHBseSh4K2RlbHRhKSk7CiAgICByZXR1cm4geTsKICB9CiAgcHVibGljIGZsb2F0IFNWKEZ1bmN0aW9uIDxGbG9hdCxGbG9hdD5mLGZsb2F0IGEsZmxvYXQgYixmbG9hdCBlLCBmbG9hdCB0LGZsb2F0IGgpIHsKICAgIGZsb2F0IEk7CiAgICBmbG9hdCBnID0gMTUqZS8oYi1hKTsKICAgIGlmICh0ID49IGIpIHJldHVybiAwOy8vIEVyZm9yZGVybGljaGVyIEJlcmVpY2ggaW50ZWdyaWVydD8KICAgIC8vIERpZSBTaW1wc29ucmVnZWwuCiAgICBmbG9hdCBJUyA9IGgvMyooZi5hcHBseSh0KSsgNCpmLmFwcGx5KHQraCkrZi5hcHBseSh0KzIqaCkpOwogICAgLy8gRGllIHp1c2FtbWVuZ2VzZXR6dGUgU2ltcHNvbnJlZ2VsLgogICAgZmxvYXQgSVpTID0gaC82KihmLmFwcGx5KHQpKwogICAgICAgICAgICAgICAgICAgICA0KmYuYXBwbHkodCtoLzIpKwogICAgICAgICAgICAgICAgICAgICAyKmYuYXBwbHkodCtoKSsKICAgICAgICAgICAgICAgICAgICAgNCpmLmFwcGx5KHQrMypoLzIpKwogICAgICAgICAgICAgICAgICAgICBmLmFwcGx5KHQrMipoKSk7CiAgICBpZiAoTWF0aC5hYnMoSVpTLUlTKSA8PSAoZypoKSkgeyAvLyBEaWUgRmVobGVyYWJzY2hhZXR6dW5nLgogICAgICBJID0gSVpTOyAvLyBBdWZzdW1taWVydW5nLgogICAgICBJICs9IFNWKGYsYSxiLGUsdCsyKmgsKGItKHQrMipoKSkvMik7IC8vIFJlc3RsaWNoZXIgSW50ZXJ2YWxsLgogICAgICByZXR1cm4gSTsKICAgIH0gZWxzZSAKICAgICAgcmV0dXJuIHRoaXMuU1YoZixhLGIsZSx0LGgvMik7IC8vIFZlcmZlaW5lcnVuZy4gIAogIH0KICBwdWJsaWMgZmxvYXQgaW50ZWdyYXRlNChGdW5jdGlvbiA8RmxvYXQsRmxvYXQ+ZixmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBlcHMpIHsKICAgIC8vIEFkYXB0aXZlIFNpbXBzb24KICAgIC8vIEludGVncmF0ZSBpbSA9IHRoaXM7CiAgICBmbG9hdCB5PXRoaXMuU1YoZixhLGIsZXBzLGEsKGItYSkvMik7CiAgICByZXR1cm4geTsKICB9Cn0KcHVibGljIGNsYXNzIFRlc3QgewogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgIEludGVncmF0ZSBpbSA9IG5ldyBJbnRlZ3JhdGUoKTsKICAgIGludCBOPTEwOwogICAgZmxvYXQgZXBzPTAuMDAwMTsKICAgIGZsb2F0IGE9MSxiPTQ7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW0uaW50ZWdyYXRlMQogICAgICAoKHgpIC0+IHsgcmV0dXJuIE1hdGguc2luKHgpOyB9LAogICAgICBhLGIsTikpOwogICAgU3lzdGVtLm91dC5wcmludGxuKGltLmludGVncmF0ZTIKICAgICAgKCh4KSAtPiB7IHJldHVybiBNYXRoLnNpbih4KTsgfSwKICAgICAgYSxiLE4pKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbS5pbnRlZ3JhdGUzCiAgICAgICgoeCkgLT4geyByZXR1cm4gTWF0aC5zaW4oeCk7IH0sCiAgICAgIGEsYixOKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW0uaW50ZWdyYXRlNAogICAgICAoKHgpIC0+IHsgcmV0dXJuIE1hdGguc2luKHgpOyB9LAogICAgICBhLGIsZXBzKSk7CiAgfQp9IA==

Laufzeit integrate1-3 (opCount, Mittelwert aus 1-3 berechnen) und Ergebnisse für Sinus und Exponentialfunktion eintragen.
Laufzeit integrate4 (opCount) und Ergebnisse für Sinus und Exponentialfunktion eintragen.

Aufgabe 5. Was ist das Endergebnis? Wie sieht es bezüglich Genauigkeit und Rechenaufwand bei den vier verschiedenen Verfahren aus? Wie unterscheiden sich die Sunus und Exponentialfunktionen, und warum? Ist bei dem dynamisch adaptiven Verferhren ein "Komplexitätsklasse" erkennbar?



Created by the NoteBook Compiler Ver. 1.32.3 (c) Dr. Stefan Bosse (Fri Nov 15 2024 13:14:05 GMT+0100 (Central European Standard Time))