--- engine: julia --- ```{julia} #| error: false #| echo: false #| output: false using InteractiveUtils ``` # Lineare Algebra in Julia ```{julia} using LinearAlgebra ``` Das `LinearAlgebra`-Paket liefert unter anderem: - zusätzliche Subtypen von `AbstractMatrix`: genauso verwendbar, wie andere Matrizen, z.B. - `Tridiagonal` - `SymTridiagonal` - `Symmetric` - `UpperTriangular` - zusätzliche/erweiterte Funktionen: `norm`, `opnorm`, `cond`, `inv`, `det`, `exp`, `tr`, `dot`, `cross`, ... - einen universellen Solver für lineare Gleichungssysteme: `\` - `x = A \ b` löst $A \mathbf{x}=\mathbf{b}$ durch geeignete Matrixfaktorisierung und Vorwärts/Rückwärtssubstition - [Matrixfaktorisierungen](https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#man-linalg-factorizations) - `LU` - `QR` - `Cholesky` - `SVD` - ... - Berechnung von Eigenwerte/-vektoren - `eigen`, `eigvals`, `eigvecs` - Zugriff auf BLAS/LAPACK-Funktionen ## Matrixtypen ```{julia} A = SymTridiagonal(fill(1.0, 4), fill(-0.3, 3)) ``` ```{julia} B = UpperTriangular(A) ``` Diese Typen werden platzsparend gespeichert. Die üblichen Rechenoperationen sind implementiert: ```{julia} A + B ``` Lesende Indexzugriffe sind möglich, ```{julia} A[1,4] ``` schreibende nicht unbedingt: ```{julia} #| error: true A[1,3] = 17 ``` Die Umwandlung in eine 'normale' Matrix ist z.B. mit `collect()` möglich: ```{julia} A2 = collect(A) ``` ### Die Einheitsmatrix `I` `I` bezeichnet eine Einheitsmatrix (quadratisch, Diagonalelemente = 1, alle anderen = 0) in der jeweils erforderlichen Größe ```{julia} A + 4I ``` ## Normen Um Fragen wie Kondition oder Konvergenz eines Algorithmus studieren zu können, brauchen wir eine Metrik. Für lineare Räume ist es zweckmäßig, die Metrik über eine Norm zu definieren: $$ d(x,y) := ||x-y|| $$ ### $p$-Normen Eine einfache Klasse von Normen im $ℝ^n$ sind die $p$-Normen $$ ||\mathbf{x}||_p = \left(\sum |x_i|^p\right)^\frac{1}{p}, $$ die die die euklidische Norm $p=2$ verallgemeinern. :::{.callout-note} ## Die Max-Norm $p=\infty$ Sei $x_{\text{max}}$ die _betragsmäßig_ größte Komponente von $\mathbf{x}\in ℝ^n$. Dann gilt stets $$ |x_{\text{max}}| \le ||\mathbf{x}||_p \le n^\frac{1}{p} |x_{\text{max}}| $$ (Man betrachte einen Vektor, dessen Komponenten alle gleich $x_{\text{max}}$ sind bzw. einen Vektor, dessen Komponenten außer $x_{\text{max}}$ alle gleich Null sind.) Damit folgt $$ \lim_{p \rightarrow \infty} ||\mathbf{x}||_p = |x_{\text{max}}| =: ||\mathbf{x}||_\infty. $$ ::: In Julia definiert das `LinearAlgebra`-Paket eine Funktion `norm(v, p)`. ```{julia} v = [3, 4] w = [-1, 2, 33.2] @show norm(v) norm(v, 2) norm(v, 1) norm(v, 4) norm(w, Inf); ``` - Wenn das 2. Argument `p` fehlt, wird `p=2` gesetzt. - Das 2. Argument kann auch `Inf` (also $+\infty$) sein. - Das 1. Argument kann ein beliebiger Container voller Zahlen sein. Die Summe $\sum |x_i|^p$ erstreckt sich über *alle* Elemente des Containers. - Damit ist für eine Matrix `norm(A)` gleich der _Frobenius-Norm_ der Matrix `A`. ```{julia} A = [1 2 3 4 5 6 7 8 9] norm(A) # Frobenius norm ``` Da Normen homogen unter Multiplikation mit Skalaren sind, $||\lambda \mathbf{x}|| = |\lambda|\cdot||\mathbf{x}||$, sind sie durch die Angabe der Einheitskugel vollständig bestimmt. Subadditivität der Norm (Dreiecksungleichung) ist äquivalent zur Konvexität der Einheitskugel (Code durch anklicken sichtbar). ```{julia} #| code-fold: true #| fig-cap: "Einheitskugeln im $ℝ^2$ für verschiedene $p$-Normen: $p$=0.8; 1; 1.5; 2; 3.001 und 1000" using Plots colors=[:purple, :green, :red, :blue,:aqua, :black] x=LinRange(-1, 1, 1000) y=LinRange(-1, 1, 1000) fig1=plot() for p ∈ (0.8, 1, 1.5, 2, 3.001, 1000) contour!(x,y, (x,y) -> p * norm([x, y], p), levels=[p], aspect_ratio=1, cbar=false, color=[pop!(colors)], contour_labels=true, ylim=[-1.1, 1.1]) end fig1 ``` Wie man sieht, muß $p\ge 1$ sein, damit die Einheitskugel konvex und $||.||_p$ eine Norm ist. Die Julia-Funktion `norm(v, p)` liefert allerdings für beliebige Parameter `p` ein Ergebnis. ### Induzierte Normen (Operatornormen) Matrizen $A$ repräsentieren lineare Abbildungen $\mathbf{v}\mapsto A\mathbf{v}$. Die von einer Vektornorm Induzierte Matrixnorm beantwortet die Frage: > _„Um welchen Faktor kann ein Vektor durch die Transformation $A$ maximal gestreckt werden?“_ Auf Grund der Homogenität der Norm unter Multiplikation mit Skalaren reicht es aus, das Bild der Einheitskugel unter der Transformation $A$ zu betrachten. ::: {.callout-tip} ## Definition Sei $V$ ein Vektorraum mit einer Dimension $0