In teoria ho capito come funziona, infatti volevo partire dal metodo di risoluzione di Jacobi che ho implementato (vi posto il codice a fine post) e modificarlo a dovere, tanto più o meno cambia il calcolo fatto dentro il for.
Il problema è che non so proprio come calcolare la matrice jacobiana con matlab, trovassi il modo penso sarei apposto, e no so da dove partire...
Di qui il codice del Metodo di jacobi.
Grazie mille a tutti anticipatamente.
- Codice: Seleziona tutto
function [niterazioni,vettoresoluzione,tJ] = jacobi(A,b,toll,Nmax)
%JACOBI metodo di Jacobi per la risoluzione di sistemi lineari
%
% [niterazioni,vettoresoluzione,tJ] = jacobi(A,b,toll,Nmax) applica il
% metodo di Jacobi alla matrice d'ingresso (A), al vettore dei termini
% noti (b), considerando l'errore relativo massimo e il numero di
% iterazioni massime (Nmax); restituisce il numero di iterazioni
% (niterazioniJ), il vettore soluzione (vettoresoluzioneJ) e il tempo
% impiegato dal metodo (tJ) per risolvere il sistema lineare.
% NB: i dati sono visualizzati in FORMAT LONG (tale formato alla fine
% della computazione torna a default)
%
% Maurizio Idini
format long
n=size(A,1); %dimesione della matrice A
x=zeros(n,1); %inizializzazione del vettore soluzione
k=0; %contatore
xv=ones(n,1); %vettore soluzione esatto
tic %inizio contatore di tempo
while (k<Nmax)
xv=x;
x=x';
k=k+1;
for i=1:n
if (i==1)
s = sum(A(i,i+1:n).*x(i+1:n));
x (i) = ( b(i) - s) / A(i,i);
else
s = sum(A(i,1:i-1).*x(1:i-1));
s = s + sum(A(i,i+1:n).*x(i+1:n));
x (i) = ( b(i) - s) / A(i,i);
end
end
x=x';
if(norm(x-xv,2)<toll*norm(x,2)),break,end
end
tJ=toc;
fprintf('il tempo di calcolo è %f \n', tJ);
niterazioni=k;
fprintf('Il numero di interazioni è %d \n', niterazioni);
vettoresoluzione=x;
disp('il vettore di soluzione è ');
vettoresoluzione
format short


