Aiuto con Matlab, plottare errore relativo al variare di k
salve a tutti, ho bisogno di una piccola mano. ho creato uno script che risolve un sistema lineare con gauss, jacobi e gauss-seidel, più precisamente lo scrivo esegue 3 funzioni:
nelle prime righe ho A (matrice 4x4), b, il vettore x0=[0,0,0,0] e Nmax=10 (numero di iterate)
le 3 funzioni sono:
x=A\b <-- risolvo prima con gauss
[x_j,k]=jacobi(A,b,x0,Nmax)
[x_gs,k]=gauss_seidel(A,b,x0,Nmax)
domanda 1:
come calcolo l'errore relativo dei 3 vettori x, x_j e x_gs?
domanda 2:
mi viene chiesto di plottare l'errore relativo al variare k, sapreste darmi qualche consiglio?
come dovrei fare il grafico? non ho la piu pallida idea di come realizzarlo
nelle prime righe ho A (matrice 4x4), b, il vettore x0=[0,0,0,0] e Nmax=10 (numero di iterate)
le 3 funzioni sono:
x=A\b <-- risolvo prima con gauss
[x_j,k]=jacobi(A,b,x0,Nmax)
[x_gs,k]=gauss_seidel(A,b,x0,Nmax)
domanda 1:
come calcolo l'errore relativo dei 3 vettori x, x_j e x_gs?
domanda 2:
mi viene chiesto di plottare l'errore relativo al variare k, sapreste darmi qualche consiglio?
come dovrei fare il grafico? non ho la piu pallida idea di come realizzarlo
Risposte
per calcolare l'errore relativo devi conoscere la soluzione esatta del sistema, se non ti viene fornita dal testo di solito si prende come riferimento quella ottenuta col comando backslash. Per fare il grafico devi mettere sull'asse delle ascisse i valori di $k$ e sull'asse delle ordinate i 3 valori della soluzione che hai ottenuto, invece di usare il comando plot può essere opportuno fare dei grafici su scala logaritmica per renderli più leggibili
sapresti dirmi come ottenere l'errore relativo dalla funzione "x=A\b"?
se il testo non ti dà altre informazioni consideri quella come soluzione esatta e calcoli $e=||x-x_(ex)||/||x_(ex)||$ dove $x_(ex)$ è appunto la soluzione di x=A\b
"walter89":
se il testo non ti dà altre informazioni consideri quella come soluzione esatta e calcoli $e=||x-x_(ex)||/||x_(ex)||$ dove $x_(ex)$ è appunto la soluzione di x=A\b
ma poi la soluzione di x=A\b devo passarla come input alle varie funzioni oltre al vettore x0?
altra domanda, nelle varie funzioni jacobi e gauss seidel io calcolo l'errore relativo tra x0 e la la soluzione x dopo la decima iterata, ma forse ho compreso male la traccia e devo calcolare l'errore relativo tra la soluzione esatta trovata con gauss e quella delle due funzioni jacobi e gauss seidel.
secondo te è cosi? e per fare in questo modo devo passare la soluzione esatta come input oltre a x0 alle due funzioni jacobi e gauss seidel?
secondo te è cosi? e per fare in questo modo devo passare la soluzione esatta come input oltre a x0 alle due funzioni jacobi e gauss seidel?
le funzioni lavorano indipendentemente dalla soluzione esatta, l'errore lo devi calcolare dopo aggiungendo qualche riga allo script: prima calcoli i 2 errori relativi con la formula che ti ho scritto poi metti i comandi per fare il grafico. Però non capisco cosa rappresenta $k$ nel tuo codice
"walter89":
le funzioni lavorano indipendentemente dalla soluzione esatta, l'errore lo devi calcolare dopo aggiungendo qualche riga allo script: prima calcoli i 2 errori relativi con la formula che ti ho scritto poi metti i comandi per fare il grafico. Però non capisco cosa rappresenta $k$ nel tuo codice
$\k$ è l'indice dell'ultima iterata, ma l'ho tolto e al suo posto ho fatto restituire un array "err" che contiene l'errore relativo calcolato ad ogni iterata.
dopodiché plotto i due array err al variare di k. è giusto in questo modo? e a cosa mi serve x=A\b a questo punto?
ps: hai un MP
grazie ancora per l'aiuto che mi stai dando, scusa se ti scoccio con tutte queste domande
ok se vengono calcolati gli errori all'interno della funzione poi devi solamente plottarli, ci sono vari modi per risolvere questo tipo di esercizi e bisogna stare attenti alle richieste. Ovviamente se l'errore deve variare con $k$ è giusto che sia calcolato a ogni passo del ciclo
vorrei implementare una funzione che controlli che la matrice A di input sia quadrata e che il vettore b e x0 siano della stessa lunghezza di A. il codice è semplice ma dove lo implemento di preciso?
in pratica il mio lavoro attuale (cioè senza controlli) consiste di una funzione che prende in input A,b,x0,Nmax e omega, e al suo interno vengono richiamate le funzioni jacobi e gauss seidel e la funzione che plotta i risultati.
1. metto i controlli dentro una funzione e la richiamo prima delle altre? (ho provato e mi da errore)
2. se metto i controlli direttamente nella funzione principale ottengo sempre errore.
qualche consiglio?
in pratica il mio lavoro attuale (cioè senza controlli) consiste di una funzione che prende in input A,b,x0,Nmax e omega, e al suo interno vengono richiamate le funzioni jacobi e gauss seidel e la funzione che plotta i risultati.
1. metto i controlli dentro una funzione e la richiamo prima delle altre? (ho provato e mi da errore)
2. se metto i controlli direttamente nella funzione principale ottengo sempre errore.
qualche consiglio?