2. Dokument inklusive meiner Lösungen zu den Übungsblättern (die nach dem Abgabetermin hochgeladen werden): siehe [docs](./docs) und [docs/loesungen.pdf](./docs/loesungen.pdf).
3. Notizen/Kritzelei für mathematische Argumente, Berechnungen, usw.: siehe [notes](./notes).
4. Protokolle von den Übungsgruppen: siehe [protocol](./protocol).
- Das Konzept von Darstellungsmatrizen (aber nicht die Berechnung von Basiswechseln)
- Invertierbare Matrizen (musst algebraisch/symbolisch damit umgehen können, aber ihr müsst keine Inversen explizit ausrechnen). Ihr müsst aber Konzepte anwenden wie (AB)¯¹ = B¯¹A¯¹,
Der Begriff _Formalismus_ geht eigentlich auf die Grundlagen der Mathematik ab der Mitte des 19. Jh zurück.
Ab dieser Zeit fingen Mathematiker an, nicht mehr lose zu berechnen, sondern Erkenntnisse in _formalen Systemen_ aufzuschreiben.
Im Grunde (und im Falle von Church, Turing, Kleene, usw.) legten sie die Bausteine für das moderne Konzept von Berechenbarkeit, Algorithmen, und Rechnern.
Es stellt sich heraus (siehe insbesondere das Löwenheim-Skolem-Tarski Paradoxon),
dass mathematische Aussagen komplett unabhängig von Anschauungen ausgelegt und bewiesen werden können.
Mit anderen Worten, man kann einen »seelenlosen« Rechner mit mathematischen Aufgaben beauftragen,
und dieser wäre ohne jegliche Vorstellungskraft in der Lage,
_richtige_ Berechnungen durchzuführen und Schlüsse zu ziehen.
und notwendig und hinreichend, um diese zu beweisen.
Andererseits benötigen wir als _denkende Menschen_ aber auch Anschauungen,
1. um formale Aussagen _deuten_ zu können und deren Informationsgehalt zu _begreifen_,
2. damit einem Ideen und Ansätze einfallen, um Behauptungen zu beweisen.
Wir brauchen also die formale Seite, um **präzis** zu kommunizieren und richtig zu argumentieren,
und die anschauliche Seite, um uns überhaupt orientieren zu können.
### Wie trainiere ich das? ###
Es gibt einige Möglichkeiten für verschiedene Lerntypen:
- Selbstlernen: sich alleine mit dem Skript auseinandersetzen. Am besten ein paar Stunden in einem ruhigen Ort wie einem Café, der Bibliothek, zu Hause.
Gründlich die Definitionen und Resultate durchgehen.
- Durch Gruppenarbeit.
- Austausch von konkreten Fragen in eurer Chat-Gruppe oder in online Foren wie stackexchange, math.hashcode, usw..
- In der Übungsgruppe. Bei wichtigen Fragen, die wir gemeinsam bearbeiten, werde ich versuchen, diese in dem Repository festzuhalten.
[Hier](https://www.python.org/downloads) kann man den Compiler herunterladen.
Man kann auch ohne Installation python Skripte ausführen:
einfach nach »python compiler online« googeln (oder z. B. <https://repl.it> -> `<>Start coding` —> Sprache auswählen).
**Vorteile:** Da man kein Memory-Allocation o. Ä., oder Typisierung pflegen muss, kann man mit grundlegenden Programmierkenntnissen sehr leicht in Python einsteigen.
Es gibt eine immense Community für Python und man kann sehr schnell online durch Foren u. Ä. Hilfe holen.
Die Python-Dokumentation ist sehr ausführlich und alles ist gut versioniert.
Möglicherweise werden einige von euch etwas im Bereich Data Science machen.
Dafür ist python (aktuell) mit das gängigste Tool.
Generell (nicht nur wegen DS) lohnt es sich, Python (samt Modulen wie **numpy**/**numpy.linalg**, **pandas**, usw.) zu können.
**Nachteile:** Python ist nicht sonderlich schnell, aber bzgl. Geschwindigkeit definitiv besser als Geogebra.
Für Programmierer gibts an Python viel Grund zu meckern (z. B. keine echten privat/public/protected access modifiers, unsauberer Umgang mit Typing.).
Für Visualisierungen von Vektoren wäre Python nicht die beste Option.
Für unseren Kurs würde ich dies nur für die Ausführung von Algorithmen Empfehlen.
**Anmerkung:** Um mit komplexen Zahlen in Python umzugehen, muss man `j` statt `i` für die imaginäre Zahl verwenden.
Diese muss stets mit einem Koeffizienten versehen werden,
d. h.
```py
x = 5 + 8j;
x = 5 + 8*1j;
x = 5 + 1j;
x = 5 - 1j;
x = 5 + 0j;
x = 5;
```
usw. sind erlaubt, aber
```py
x = 5 + 8*j;
x = 5 + j;
x = 5 - j;
```
usw. nicht, weil hier logischerweise `j` als Variable interpretiert wird.
So kann man mit Matrizen umgehen (am besten hierfür ein Skript anlegen und dieses über eine Terminal ausführen):
```py
import math
import numpy as np
import numpy.linalg as la
A = np.asarray([
[1, 2, 3, 7],
[0.5, 0, 0, 2 + 1j]
[0, 0, 0, math.sqrt(2)]
])
x = np.asarray([10, 100, 0, -1])
print(A)
print(A.T)
print(A @ x) # Matrixmultiplikation
print(la.det(A)) # Determinante
B = A @ A.T # eine quadratische (sogar positive!) Matrix
values, vectors = la.eig(B)
print(values) # da B "positiv" ist, sind diese Werte alle reellwertig und ≥ 0
print(vector) # eine Matrix, deren Spalten Eigenvektoren von B sind (entsprechend den Eigenwerten)
Z = np.zeros((4, 2)) # eine 4 x 2 Matrix
print(Z)
```
Es gibt _etliches_, was man mit den `numpy` (und `scipy`) Bibliothek und Vektoren/Matrizen/Tensoren machen kann.
Lass dir niemanden sagen, dass man "besser mit MatLab" (oder `R`) mit Matrizen umgehen kann.
Da _gerade_ diese Sprache für KI optimiert wird, kann man sicher davon ausgehen,
dass die zugrunde liegenden Bibliotheken mit `C` o. Ä. geschrieben und schnell sind.
Natürlich kann und m. E. sollte man kompilierende Sprachen lernen wie `C++` od. `golang`/`Rustlang`/`vlang`, usw.
Aber für Prototypen von komplexen Problemen, mit vielen Möglichkeiten für sauberes Programmieren
Diese App ist ein lustiges aber sehr nützliches Programm, um schnell im 2-d Raum ($\mathbb{R}^{2}$) oder 3-d Raum ($\mathbb{R}^{3}$) geometrische Objekte und Konzepte zu realisieren.
Man kann GeoGebra [hier](https://www.geogebra.org/download?lang=de) herunterladen.
**Vorteile:** man braucht hier _null_ Programmierkenntnisse. Mit der App kann man ohne Weiteres direkt loslegen.
**Nachteile:** Man sollte es aber nicht zu weit betreiben, denn diese App wird schnell überfordert.
Es scheint, dass man nicht mehr Dateien lokal speichern kann (?!).
Anscheinend wollen die „klugen“ Betreiber dieser App einen rein online Gebrauch erzwingen 🤦.
- Den **R** Compiler (siehe z. B. [hier](https://cran.rstudio.com))
- (optional) einen Editor wie **RStudio** (siehe [hier](https://rstudio.com/products/rstudio/download/#download)).
Man kann auch ohne Installation R-Skripte ausführen: einfach nach »R compiler online« googeln (oder z. B. <https://repl.it> -> `<>Start coding` —> Sprache auswählen).
**Vorteile:** man braucht hier nur _sehr minimale_ Programmierkenntnisse.
Diese Sprache wurde für Naturwissenschaftler und Statistiker entwickelt, und Menschen rund um den Globus entwickeln immer neue Packages für alles Mögliche in dieser Sprache.
Es gibt eine große Community und damit kann man für alle Probleme Hilfe finden.
Visualisierung mag zwar umständlicher als mit Geogebra sein, aber ist nicht so schwer.
**Nachteile:**
Man sollte im Laufe seines Studiums **R** nicht _ausschließlich_ bedienen,
denn diese Sprache fördert einen richtig schlechten Programmierstil.
Für die Logiker und Informatiker unter euch, wird es bspw. nerven, dass in **R**-Arrays (sog. lists/vectors) Indexes mit `1` anfangen.
Für Programmierer, wird stören, dass **R** keine saubere Implementierung von Klassen, (lokalen) Imports, usw. anbietet
(diese Dinge existieren, aber sind sehr umständlich).
Die **Julia**-Programmiersprache soll auch sehr gut sein und kann auf <https://julialang.org> gefunden werden.
Es bedarf hier zumindest Grundkenntnisse von Programmiersprachen.
**Julia** hat den Vorteil von Geschwindigkeit (für kleine Matrixberechnungen irrelevant, aber sobald man mit größeren Datensets umgeht wird dies wichtig sein).
Hierfür muss man sich den Umgang mit Typen aneignen, was generell zu saubererem Code führt.