Come plottare in matlab

Messaggioda 3m0o » 20/05/2021, 15:14

Mi viene richiesto di implementare il Metodo del gradiente con precondizionamento e di plottare la norma di \( r_k \) vs numero di iterazioni \(k\). Ora. Io ho una funzione my_gradient al cui interno ho un ciclo while, come faccio nella main a tirare fuori l'informazione della norma di \(r_k\) ad ogni passo alla \(k\)-esima iterazione e poi a plottare il grafico richiesto?
3m0o
Cannot live without
Cannot live without
 
Messaggio: 2053 di 5335
Iscritto il: 02/01/2018, 15:00

Re: Come plottare in matlab

Messaggioda feddy » 20/05/2021, 15:22

Ad ogni iterazione $k$ calcoli il $||r_k||$ e lo salvi in un vettore $r$. E' sufficiente che la tua funzione my_gradient ritorni il vettore $r$, e poi puoi semplicemente plottare in scala semilogaritmica l'andamento della norma. Se non ti è chiaro posta direttamente il codice.

Mi pare che su matlab la sintassi per i valori di ritorno di una funzione siano tipo

Codice:
[val1, val2] = function(par1,par2,...)
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2834 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Come plottare in matlab

Messaggioda 3m0o » 20/05/2021, 16:31

Questo è il mio codice
Codice:
function [out] = my_gradient(A,P,b,x0,max,tol)
xk=x0;
k =1 ;
while ( ( norm(b - A * xk)./norm(b)  >= tol ) && k <= max )
     rk = b - A * xk;
     yk = P \ rk;
     alphak = yk' * (rk) / ((A * yk)' * yk);
     xk = xk + alphak * yk;
   
end
if k == max
    warning('Does not convergence in max iteration');
end
out = xk;
end

Il punto è che restituisco la "soluzione" del sistema lineare \( Ax = b \), e quindi non so dare un output in più e poi come dire nella main che mi interessa solo uno degli output.
3m0o
Cannot live without
Cannot live without
 
Messaggio: 2054 di 5335
Iscritto il: 02/01/2018, 15:00

Re: Come plottare in matlab

Messaggioda feddy » 20/05/2021, 16:39

Ti basta una cosa del tipo
Codice:
function [out,rk_hist] = my_gradient(A,P,b,x0,max,tol)
 

dove
Codice:
rk_hist
altro non è che un vettore che ad ogni passo k si salva rk
così la funzione my_gradient ritorna due cose: la prima è l'array che contiene la soluzione una volta che il metodo è arrivato a convergenza. La seconda è un vettore che contiene la storia dei residui che nel while cambia dimensione ad ogni iterata

Codice:
rk_hist = [rk_hist, b-A*xk];


dovrebbe andare. Per dire nel main che ti interessa solamente un output e il resto no, basta scrivere

Codice:
[out,~] = my_gradient(A,P,b,x0,max,tol)
(un po' simile a Python se lo conosci)

ma comunque in realtà dovresti proprio scrivere nel main

Codice:
[out,rk_hist] = my_gradient(A,P,b,x0,max,tol);


siccome tu non vuoi solo la soluzione, ma anche la storia dei residui. Poi ti basta fare
Codice:
semilogy(1:numel(rk_hist),rk_hist,'*');


mi pare che il comando per restituire il numero di elementi del vettore sia
Codice:
numel
, sto andando a memoria, non uso MatLab da tanto.
Ultima modifica di feddy il 20/05/2021, 16:59, modificato 2 volte in totale.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2835 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Come plottare in matlab

Messaggioda feddy » 20/05/2021, 16:57

Tra l'altro ho notato che nel tuo codice ci sono un po' di errori: non incrementi k, e poi l'algoritmo mi sembra sia scritto male... da dove stai studiando per implementarlo?

Su wiki c'è una possibile versione in pseudocodice: https://en.wikipedia.org/wiki/Conjugate ... ent_method
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2836 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Come plottare in matlab

Messaggioda 3m0o » 20/05/2021, 17:20

Grazie mille!
Mah... a dire il vero lo sto studiando "a caso" nel senso seguendo il corso di analisi numerica il prof ci ha fatto una lezione introduttive di 2 ore sui comandi base di matlab e poi basta, si aspetta che lo sappiamo usare... -.-È vero che si concentra più sull'aspetto teorico: dimostrare perché un metodo piuttosto che un altro funziona, ma tutti gli esercizi dopo l'aspetto teorico contengono una parte di applicazione. Io cerco di volta in volta come fare una cosa quando mi serve... :-D
Non conosco python ma un po' di c++, anche se è due anni che non programmo più in c++
3m0o
Cannot live without
Cannot live without
 
Messaggio: 2055 di 5335
Iscritto il: 02/01/2018, 15:00

Re: Come plottare in matlab

Messaggioda feddy » 20/05/2021, 17:25

C++ FTW :-)

Se conosci C++, Python (e soprattutto MatLab) non ti daranno problemi in termini di difficoltà di apprendimento.

Tornando al problema, se vuoi provare ad implementarlo basandoti sul listato di Wiki poi posso darti un check. Non credo tu possa avere particolari difficoltà.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2837 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Come plottare in matlab

Messaggioda feddy » 20/05/2021, 17:28

Intendo implementarlo in MatLab. In C++ dovresti usare librerie esterne come Eigen ed è inutilmente complicato in questo caso :-)
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2838 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Come plottare in matlab

Messaggioda 3m0o » 20/05/2021, 17:55

Sono con il cellulare in metro. Quindi sorry se ho fatto qualche typo. Solo per la concezione del codice senza star lì a pensare a salvare la norma di rk fare così:
Codice:
function [out] = my_gradient(A,P,b,x0,max,tol)
xk=x0;
rk=b-A*xk;
zk=P\rk;

k =1 ;
while ( ( norm(b - A * xk)./norm(b)  >= tol ) && k <= max )
     alphak=dot(rk' * zk)/dot(zk' *A*zk);
     xk= xk+ alphak*zk;
     rk=rk-alphak*A*zk;
     k=k+1;
   
end
if k == max
    warning('Does not convergence in max iteration');
end
out = xk;
end

Ps la condizione di uscire dal while la vuole il prof così
3m0o
Cannot live without
Cannot live without
 
Messaggio: 2056 di 5335
Iscritto il: 02/01/2018, 15:00

Re: Come plottare in matlab

Messaggioda feddy » 20/05/2021, 18:06

Manca l'update di $z_k$, $p_k$,per il quale ti serve $\beta_k$. (sto facendo riferimento alla pagina wiki). Fai pure con calma :-)
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2839 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Prossimo

Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite