From 5e7efb59cd267d10ae56fc05ed96b3ba4c31d418 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Fri, 28 Aug 2020 02:40:26 +0200 Subject: [PATCH] add moar stuffs --- package.json | 2 +- .../CalcoloNumerico/01_SistemiLineari.js | 71 +++++++++++++++---- src/routes/RipassoDiAlgebraLineare.js | 32 ++++++++- 3 files changed, 91 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 98d94f1..6c3d015 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "appuntiweb", - "version": "0.8.6", + "version": "0.8.7", "license": "AGPL-3.0-or-later", "scripts": { "start": "preact watch --template src/template.html", diff --git a/src/routes/CalcoloNumerico/01_SistemiLineari.js b/src/routes/CalcoloNumerico/01_SistemiLineari.js index f7ac393..58c23c5 100644 --- a/src/routes/CalcoloNumerico/01_SistemiLineari.js +++ b/src/routes/CalcoloNumerico/01_SistemiLineari.js @@ -7,12 +7,21 @@ import {Fragment} from "preact"; const r = String.raw; -export default function (props) { +export default function () { return (
- TODO +

+ Dato un sistema di equazioni lineari, si vuole trovare la sua soluzione. +

+

+ In forma matriciale, avrà una matrice dei coefficienti {r`A`}, un vettore dei termini noti {r`b`} e un vettore delle incognite {r`x`}. +

+

+ L'equazione matriciale del sistema è: +

+ {r`A \cdot x = b`}

@@ -69,7 +78,7 @@ export default function (props) {

Fattorizzazione {r`LU`}}>

- Se la matrice dei coefficienti del sistema non ha minori uguali a 0 (eccetto l'ultimo) allora è possibile fattorizzarla in due matrici: una {r`L`} triangolare inferiore, e una {r`U`} triangolare superiore. + Se tutti i valori sulla diagonale di {r`A`} sono diversi da 0 (eccetto l'ultimo) allora è possibile fattorizzarla in due matrici: una {r`L`} triangolare inferiore, e una {r`U`} triangolare superiore.

{r`A = L \cdot U`} @@ -96,8 +105,11 @@ export default function (props) { U_{ik} = 0 \qquad se\ i > k \quad (tri.\ infer.) \end{cases} `} + + È la parte triangolare superiore di {r`A`}! +

- Il sistema può essere poi risolto applicando due volte il metodo di sostituzione: + Il sistema può essere poi risolto applicando due volte il metodo di sostituzione (all'avanti e all'indietro):

{r` \begin{cases} @@ -118,9 +130,12 @@ export default function (props) { Abbiamo fatto questo metodo in Algebra Lineare, chiamandolo metodo di Gauss-Jordan!

- Alla formula precedente si aggiunge una matrice di permutazione che indica quali righe sono state scambiate: + Alla formula precedente si aggiunge una matrice di permutazione che indica quali righe sono state scambiate:

{r`P \cdot A = L \cdot U`} +

+ Per massimizzare la stabilità, si cerca di usare come perno l'elemento più grande della colonna. +

Questo metodo ha costo computazionale:

@@ -131,12 +146,30 @@ export default function (props) { È possibile anche permettere il pivoting sulle colonne per aumentare ulteriormente la stabilità dell'algoritmo, a costo di maggiore costo computazionale:

{r`P \cdot A \cdot Q = L \cdot U`} +

+ Per massimizzare la stabilità, si cerca di ordinare in modo decrescente la diagonale, assicurandoci che il primo perno sia più grande del secondo e così via. +

Questo metodo ha costo computazionale:

{r`{\color{Yellow} O\left(\frac{n^3}{3}\right)} + O\left(\frac{n^3}{3}\right) + 2 \cdot O\left(\frac{n^2}{2}\right)`}
+
+ Fattorizzazione {r`LU`} a banda}> +

+ Se la matrice {r`A`} è a banda, è possibile risparmiare spazio durante la fattorizzazione, in quanto sia {r`L`} sia {r`U`} saranno a banda! +

+
+ Fattorizzazione {r`LU`} sparsa}> +

+ Se la matrice {r`A`} è sparsa, non è detto che {r`L`} e {r`U`} siano sparse a loro volta. +

+

+ Per evitare il fill-in, è necessario riordinare la matrice {r`A`} in modo che sia il più possibile simile a una matrice a banda. TODO: Confermare? +

+
+
Fattorizzazione {r`LDL^{-1}`}}>

@@ -204,10 +237,24 @@ export default function (props) {

- Matrice ricavata dalla seguente formula: + Matrice ricavata dalla seguente formula, dove {r`v`} è la colonna di un'altra matrice: +

+ {r`U(v) = \mathbf{I} - \frac{2 \cdot v \cdot v^T}{\| v \|_{(2)}^2}`} +

+ Se moltiplicata per per la matrice da cui proviene {r`v`}, sostituirà la colonna {r`v`} con la colonna: +

+ {r` + \begin{pmatrix} + - \| v \|\\\\ + 0\\\\ + 0\\\\ + \vdots\\\\ + 0 + \end{pmatrix} + `} +

+ Si calcola con una complessità computazionale nell'ordine di {r`O(n)`}.

- {r`U(v) = I - \frac{1}{\alpha} \cdot v \cdot v^T`} - {r`\alpha = \frac{1}{2} \| v \|_{(2)}^2`}
Fattorizzazione {r`QR`}}>

@@ -218,8 +265,11 @@ export default function (props) {

{r`A = Q \cdot R`}

- Le matrici si ottengono dal prodotto delle trasformazioni di Householder ({r`Q`} sulle colonne della matrice {r`A`}, trasformandola in una matrice triangolare superiore ({r`R`}). + Le matrici si ottengono dal prodotto delle trasformazioni di Householder (che concatenate formano {r`Q`}) sulla matrice {r`A`} necessarie a trasformarla in una matrice triangolare superiore ({r`R`}).

+ + C'è un bell'esempietto qui. +

Una volta fattorizzata, il sistema si può risolvere con:

@@ -233,9 +283,6 @@ export default function (props) { Questo metodo ha costo computazionale:

{r`{\color{Yellow} O\left(\frac{2 \cdot n^3}{3}\right)} + 2 \cdot O\left(\frac{n^2}{2}\right)`} -

- TODO: l'algoritmo con tau per ricavare la q se non è in memoria -

diff --git a/src/routes/RipassoDiAlgebraLineare.js b/src/routes/RipassoDiAlgebraLineare.js index bef49c4..b34dda4 100644 --- a/src/routes/RipassoDiAlgebraLineare.js +++ b/src/routes/RipassoDiAlgebraLineare.js @@ -4,7 +4,7 @@ import Example from "../components/Example"; const r = String.raw; -export default function (params) { +export default function () { return (