Esercitazione: Zeri di funzione e sistemi lineari

Esercitazione: Zeri di funzione e sistemi lineari#

Warning

Lo svolgimento di questa esercitazione è obbligatoria per sostenere l’esame. L’esercitazione può essere consegnata in qualiasi momento e NON è richiesto di consegnarla entro una specifica data. L’unico vincolo è che dovrà essere consegnata su Virtuale prima del proprio esame scritto, poiché i risultati di tale esercitazione saranno discussi durante l’esame orale.

L’esercitazione dovrà essere svolta eseguendo tutte le prove richieste, e i risultati dovranno essere collezionati e brevemente commentati tramite una delle due seguenti modalità:

  • Un documento PDF (o Word) contenente uno screenshot dello snippet di codice, i risultati associati a tale snippet, e un commento a tali risultati.

  • Un Notebook di Python come quelli utilizzati a lezione, con celle di codice contenenti le soluzioni agli esercizi, alternate ad un breve commento degli esercizi stessi. Tuttavia, i codici NON devono essere lanciati durante l’esame, ma lo studente deve presentarsi all’esame con il programma già eseguito e con l’output delle celle ancora visibile.

Presentarsi all’esame con codice completo ma ancora da eseguire o senza una versione PDF con risultati già presenti, può compromettere la riuscita dell’esame orale.

Zeri di funzione#

Utilizzare il metodo di bisezione, il metodo delle iterazioni di punto fisso e il metodo di Newton per il calcolo dello zero della una funzione \(f(x) = e^x - x^2 \), la cui soluzione è \(x^* = -0.7034674\). Per il metodo delle iterazioni di punto fisso considerare come funzione \(g(x)\):

  • \(g(x)=x-f(x)e^{x/2}\)

  • \(g(x)=x-f(x)e^{-x/2}\)

Per analizzare i risultati utilizzare strumenti grafici e tabelle. In particolare:

  • Disegnare il grafico della funzione \(f(x)\) nell’intervallo \(I = [-1, 1]\) e verificare che \(x^*\) sia lo zero di \(f(x)\) in \([-1, 1]\).

  • Confrontare l’accuratezza delle soluzioni trovate e il numero di iterazioni effettuate dai solutori.

  • Graficare per ogni metodo l’errore assoluto \(|x_k - x^*|\) ad ogni iterazione k.

Risoluzione di sistemi lineari#

Creato un problema test di dimensione variabile \(n\) la cui soluzione esatta sia un vettore \(x\) generato a piacere e \(y\) il termine noto ottenuto moltiplicando la matrice \(A\) per la soluzione \(x\):

  • Calcolare il numero di condizione tramite opportuna funzione Python

  • Risolvere il sistema lineare \(Ax = y\) con la fattorizzazione LU o Cholesky.

  • Calcolare l’ errore relativo rispetto alla soluzione esatta. Variare la dimensione \(n\) del sistema e fare un grafico dell’errore al variare di \(n\) e uno del numero di condizione al variare di \(n\).

Problemi test da utilizzare:

  • Una matrice di numeri casuali \(A\) generata con la funzione np.random.randn.

  • Una matrice di Hilbert di dimensione \(n\) (con \(n\) variabile fra 2 e 15) utilizzando la funzione scipy.linalg.hilb.

Minimi quadrati#

Assegnata una matrice \(A\) di numeri casuali (funzione np.random.normal) di dimensione \(m \times n\), \(m>n\) fissati, scegliere un vettore \(\alpha\) (per esempio con elementi costanti) come soluzione esatta per creare un problema test e calcolare il termine noto \(y=A \alpha + e\), dove \(e\) è un vettore di numeri casuali generato con la funzione precedente (utilizzare una varianza in \([0.01,0.1]\)). Quindi risolvere il problema di minimi quadrati:

\[ \min_\alpha ||A \alpha - y||_2^2 \]

sia utilizzando le equazioni normali che la SVD di A. Inoltre:

  • Confrontare le due soluzioni.

  • Calcolare la norma due del vettore dei residui in entrambi i casi.