Problema script matlab con jacobi
Salve a tutti,
vi scrivo questo nuovo post perchè non riesco ad implementare uno script che, a partire dalla function sviluppata, riesca ad analizzare l'andamento della norma dell'errore relativo e del numero di interazioni effettuate al variare della tolleranza, per un sistema avente la matrice A tridiagonale di dimensione N=50 che ha sulla diagonale principale elementi uguali a 2 e sulle diagonali inferiori e superiori elementi uguali a 1. La function implementata è il seguente:
spero possiate aiutarmi
grazie
vi scrivo questo nuovo post perchè non riesco ad implementare uno script che, a partire dalla function sviluppata, riesca ad analizzare l'andamento della norma dell'errore relativo e del numero di interazioni effettuate al variare della tolleranza, per un sistema avente la matrice A tridiagonale di dimensione N=50 che ha sulla diagonale principale elementi uguali a 2 e sulle diagonali inferiori e superiori elementi uguali a 1. La function implementata è il seguente:
function [x,res,err,Niter,rho]=jack(A,b,TOL,Nmax)
[~,n]=size(A);
Niter=0;
x0=zeros(n,1);
%calcolo del residuo e della sua norma;
r=b-A*x0;
res=norm(r);
xold=x0;
x=x0;
%entro nel ciclo in cui avviene il calcolo delle soluzoni
%esco dal ciclo solo quando la norma del residuo Ë minore
%della tolleranza, o quando oltrepassa il numero massimo
%di iterazioni consentite.
while res>TOL && Niter<Nmax
Niter=Niter+1;
% ciclo in cui costruisco la sommatoria dei prodotti
% tra gli elementi della matrice e i vecchi valori della
%variabile x.
for i=1:n
somma=0;
for j=1:i-1;
somma=somma+A(i,j)*xold(j);
end
for j=i+1:n
somma=somma+A(i,j)*xold(j);
end
%costruzione dell'equazione al passo i-esimo.
x(i)=(b(i)-somma)/A(i,i);
end
r=b-A*x;
res=norm(r);
xold=x;
end
err=(inv(A)*r)/norm(x);
D=diag(diag(A));
C=inv(D)*(D-A);
rho=max(abs(eig(C))); spero possiate aiutarmi
Risposte
Magari mi sbaglio, ma leggendo al volo il codice non capisco gli indici che stai usando per i due clicli sulle colonne. Perchè fai da 1:i-1 e da i+1:n? Non dovrebbero essere tutti 0 gli elementi A(i,j) che prendi in quel ciclo dato che la tua matrice è tridiagonale?