An open API service indexing awesome lists of open source software.

https://github.com/fabbio00/iterative-linear-solver

Library implementing iterative methods for solving linear systems with matrix acquired from .mtx file, supporting various convergence criteria
https://github.com/fabbio00/iterative-linear-solver

compression-algorithm image-processing linear-algebra python

Last synced: 8 months ago
JSON representation

Library implementing iterative methods for solving linear systems with matrix acquired from .mtx file, supporting various convergence criteria

Awesome Lists containing this project

README

          

# Progetto Metodi del Calcolo Scientifico ~ Libreria di metodi iterativi

Costruzione di una libreria per la risoluzione di sistemi lineari tramite i seguenti metodi iterativi:

- Metodo di Jacobi
- Metodo di Gauß-Seidel
- Metodo del Gradiente
- Metodo del Gradiente coniugato

La **matrice A** viene acquisita leggendo i dati da un file `.mtx`

Il **vettore soluzione x** è un vettore composto da tutti $1$

Il **vettore b** viene calcolato dal vettore soluzione x col seguente calcolo $b=Ax$

Il **vettore x di partenza** usato da tutti i metodi è un vettore della stessa grandezza della matrice A e con tutti i valori a zero

I metodi si e arrestarsi qualora la k-esima iterata $x^{(k)}$ soddisfa il seguente **criterio di arresto**:

$\frac{||r^{(k)}||}{||b||} < tol$

Dove $r^{(k)}$ è il residuo alla k-esima iterazione calcolato come $r^{(k)}=Ax^{(k)} − b$

Sono state controllate volta per volta 4 **tolleranze** diverse, ovvero:
$tol = [10^{−4}, 10^{−6}, 10^{−8}, 10^{−10}]$

Inoltre viene fatto un controllo sul **numero massimo di iterazioni** che se superato viene segnalata la mancata convergenza $(k>maxIter)$ dove $maxIter = 2000$

## Metodo di Jacobi

### Pseudocodice

1. $x^{(k+1)} = x^{(k)} + P^{-1}r^{(k)}$

Dove $P^{-1}$ è una matrice diagonale costruita nel seguente modo:

$$
P^{-1}:=\left[\begin{array}{cccc}
1 / a_{1,1} & 0 & \cdots & 0 \\
0 & 1 / a_{2,2} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & 1 / a_{n, n}
\end{array}\right]
$$

## Metodo di Gauß-Seidel

### Idea alla base

$x^{(k+1)}_i =\frac{1}{a_{i,i}} ( b_i – a_{i,1}x^{(k+1)}_1 − \cdots – a_{i,i−1} x^{(k+1)}_{i−1} − a_{i,i+1} x^{(k)}_{i+1} − \cdots – a_{i,n}x^{(k)}_n)$

### Psudocodice

1. $r^{(k)} = b − Ax^{(k)}$
2. Sostituzione in avanti $Py = r^{(k)}$
3. $x^{(k+1)} = y^{(k)} + y$

Dove la matrice $P$ è costruita nel seguente modo:

$$
P:=\left[\begin{array}{cccc}
a_{1,1} & 0 & \cdots & 0 \\
a_{2,1} & a_{2,2} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
a_{n, 1} & a_{n, 2} & \cdots & a_{n, n}
\end{array}\right]
$$

## Metodo del Gradiente

### Psudocodice

1. $r^{(k)} = b -Ax^{(k)}$
2. $y^{(k)} = Ar^{(k)}$
3. $a = (r^{(k)})^tr^{(k)}$
4. $b = (r^{(k)})^ty^{(k)}$
5. $\alpha_k = a/b$
6. $x^{(k+1)} = r^{(k)} \alpha_kr^{(k)}$

Versione compatto per il calcolo di $\alpha_k$

$$
\alpha_k=\frac{(r^{(k)})^tr^{(k)}}{(r^{(k)})^tAr^{(k)}}
$$

## Metodo del Gradiente coniugato

### Pseudocode

1. $r^{(k)}=b−Ax^{(k)}$
2. $y^{(k)} = Ad^{(k)}$
3. $z^{(k)} = Ar^{(k)}$
4. $\alpha_k = (d^{(k)} · r^{(k)})/(d^{(k)} · y^{(k)})$
5. $x^{(k+1)} = x^{(k)} + \alpha_kd^{(k)}$
6. $r^{(k+1)}=b−Ax^{(k+1)}$
7. $w^{(k)} = Ar^{(k+1)}$
8. $\beta_k = (d^{(k)} · w^{(k)})/(d^{(k)} · y^{(k)})$
9. $d^{(k+1)} = r^{(k+1)} − \beta_kd^{(k)}$

## Descrizione rapida dei file

- `README.md`
- Descrizione tecnica del progetto
- `jacobi.py`
- Implementazione dell’algoritmo risolutivo di Jacobi
- `gauss_seidel.py`
- Implementazione dell’algoritmo risolutivo di Gauß-Seidel
- `gradiente.py`
- Implementazione dell’algoritmo risolutivo del Gradiente
- `gradiente_coniugato.py`
- Implementazione dell’algoritmo risolutivo del Gradiente Coniugato
- `control.py`
- Definizione di diverse funzioni di usate per effettuare dei controlli nei diversi algoritmi realizzati
- `main.py`
- File eseguibile dove vengono calcolati i vettori soluzione richiesti e si salvano i risultati
- `Progetto_MCS.ipynb`
- Notebook in cui vengono esaminate le matrici usate e analizzati i risultati ottenuti
- `utils.py`
- Definizione di funzioni utili all’analisi dei risultati

## Risultati

### Risultati di ogni funzione

Dizionario contenente

- Vettore X calcolato `"vectX"`
- Numero di iterazioni fatte `"nIter"`
- Tempo impeigato in mirosecondi `"time"`
- Errore relativo `"eRel"`

Esempio:

```python
res = {
"vectX" : [],
"nIter" : 150,
"time" : 1654545,
"eRel" : 0.0000001
}
```

### Risulati finali

Dizionario suddiviso per ogni ogni metodo usato, ognuno di questi conterrà un ulteriore dizionario per ogni matrice in input che conterrà i risultati ottenuti per ogni tolleranza testata

Esempio:

```python
resTot = {
"Jacobi" : {
"spa1" : [
{
"tol" : 0.0001,
"nIter" : 150,
"time" : 1654545,
"eRel" : 0.0000001
}
]
}
}
```