Re: Come plottare in matlab

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

Ho trovato MatLab sul computer dell'ufficio, quindi ho scritto quello che mancava del tuo codice. L'ho testato al volo e funziona sulla matrice che discretizza $-\Delta u = 1$ sul quadrato. E' una matrice notoriamente simmetrica e definita positiva. Sotto l'andamento della norma del residuo.

Codice:

clear all
close all

N = 15;
A = gallery("poisson",N); %matrice N*N, corrispondente alla discr. del problema di Poisson in 2D
b = ones(N^2,1);
P = eye(N^2);
x0 = ones(N^2,1);
max = 200;
tol = 1e-12;
[out,rk_hist] = my_gradient(A,P,b,x0,max,tol);
semilogy(1:numel(rk_hist),rk_hist,'*')
xlabel('iteration PCG')
ylabel('Residual norm')

function [out,rk_hist] = my_gradient(A,P,b,x0,max,tol)
xk=x0;
k=0;
rk = b-A*xk;
zk = P\rk;
pk = zk;
rk_hist = [norm(rk)];
while ( ( norm(rk)/norm(b)  >= tol ) && k <= max )
    Apk = A*pk;
    alphak = (rk'*zk)/(pk'*(Apk));
    xk = xk + alphak*pk;
    rkp1 = rk- alphak*(Apk);
    rk_hist = [rk_hist,norm(rkp1)];
    if (norm(rkp1,2)<tol)
        out = xk;
        break;
    else
        zkp1 = P\(rkp1);
        betak = (rkp1'*zkp1)/(rk'*zk);
        pk = zkp1 + betak*pk;
        rk=rkp1;
        zk = zkp1;
        k = k+1;
    end
   
end

if k == max
    warning('Does not convergence in max iteration');
end

out = xk;
end





Immagine
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2840 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Come plottare in matlab

Messaggioda 3m0o » 27/05/2021, 16:30

Scusa la risposta tardiva,
Grazie mille! :D
3m0o
Cannot live without
Cannot live without
 
Messaggio: 2072 di 5335
Iscritto il: 02/01/2018, 15:00

Re: Come plottare in matlab

Messaggioda feddy » 27/05/2021, 16:43

Di nulla :-)
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2843 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Precedente

Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite