Tempo di risoluzione sistema Ax=b
Ciao!!
Sto facendo una serie di esercitazioni di analisi numerica in matlab.
C'è un esercizio che mi chiede questo:
Calcola il tempo che l'algoritmo di Gauss con pivoting scalato (che viene dato in altro esercizio) impiega a risolvere sistemi lineari con dimensioni n=10,20,30,..,400. Memorizza i tempi ottenuti in un array di nome tempi(), quindi fai il grafico della variabile n e della corrispondente tabulazione tempi().
Suggerimento: Poni l'algoritmo di Gauss dentro un ciclo in cui n varia da 10 a 400 con passo 10 e quindi memorizza i tempi di calcolo. Utilizza la funzione di Matlab cputime che fornisce il tempo dell'orologio in secondi; la differenza tra due chiamate successive di cputime fornisce il tempo di utilizzo della cpu tra le due chiamate.
io ho svolto l'esercizio. però non riesco a far partire il programma e non riesco a trovare l'errore.
il mio programma è questo:
clear; clc;
for n=10:10:400
ti=cputime;
%sistema casuale Ax=b
A=rand(n); %matrice dei coefficienti
xx=rand(n,1);
b=A*xx; %matrice termini noti
C=[A,b]; %matrice completa del sistema
%triangolarizzazione del sistema
d=[n,1];
for i=1:n
d(i)=max (C(i,1:n+1));
end;
for i=1:n
for j=1:n+1
C(i,j)=C(i,j)/d(i);
end;
end;
for k=1:n-1
p=k;
mass=C(p,k);
for i=k:n
if(abs (C(i,k))>abs(mass))
p=i;
mass=C(p,k);
end;
end;
scambio=C(p,1:n+1);
C(p,1:n+1)=C(k,1:n+1);
C(k,1:n+1)=scambio;
for i=k+1:n
m=C(i,k)/C(k,k);
for j=k+1:n+1
C(i,j)=C(i,j)-m*C(k,j);
end;
end;
end;
%risoluzione del sistema triangolare superiore
%inizializzo x
x=zeros(n,1);
x(n,1)= C(n,n+1)/C(n,n);
for i=n-1:-1:1
x(i,1)=C(i,n+1);
for j=i+1:n
x(i,1)=x(i,1)-C(i,j)*x(j,1);
end;
x(i,1)=x(i,1)/C(i,i);
end;
tf=cputime;
tempi=ones(n);
tempi(n/10)=tf-ti;
end;
%Grafico di n e della variabile tempi
n=[10:10:400];
plot(n,tempi);
qualcuno mi sa dire dove sbaglio?
grazie!!!!
Sto facendo una serie di esercitazioni di analisi numerica in matlab.
C'è un esercizio che mi chiede questo:
Calcola il tempo che l'algoritmo di Gauss con pivoting scalato (che viene dato in altro esercizio) impiega a risolvere sistemi lineari con dimensioni n=10,20,30,..,400. Memorizza i tempi ottenuti in un array di nome tempi(), quindi fai il grafico della variabile n e della corrispondente tabulazione tempi().
Suggerimento: Poni l'algoritmo di Gauss dentro un ciclo in cui n varia da 10 a 400 con passo 10 e quindi memorizza i tempi di calcolo. Utilizza la funzione di Matlab cputime che fornisce il tempo dell'orologio in secondi; la differenza tra due chiamate successive di cputime fornisce il tempo di utilizzo della cpu tra le due chiamate.
io ho svolto l'esercizio. però non riesco a far partire il programma e non riesco a trovare l'errore.
il mio programma è questo:
clear; clc;
for n=10:10:400
ti=cputime;
%sistema casuale Ax=b
A=rand(n); %matrice dei coefficienti
xx=rand(n,1);
b=A*xx; %matrice termini noti
C=[A,b]; %matrice completa del sistema
%triangolarizzazione del sistema
d=[n,1];
for i=1:n
d(i)=max (C(i,1:n+1));
end;
for i=1:n
for j=1:n+1
C(i,j)=C(i,j)/d(i);
end;
end;
for k=1:n-1
p=k;
mass=C(p,k);
for i=k:n
if(abs (C(i,k))>abs(mass))
p=i;
mass=C(p,k);
end;
end;
scambio=C(p,1:n+1);
C(p,1:n+1)=C(k,1:n+1);
C(k,1:n+1)=scambio;
for i=k+1:n
m=C(i,k)/C(k,k);
for j=k+1:n+1
C(i,j)=C(i,j)-m*C(k,j);
end;
end;
end;
%risoluzione del sistema triangolare superiore
%inizializzo x
x=zeros(n,1);
x(n,1)= C(n,n+1)/C(n,n);
for i=n-1:-1:1
x(i,1)=C(i,n+1);
for j=i+1:n
x(i,1)=x(i,1)-C(i,j)*x(j,1);
end;
x(i,1)=x(i,1)/C(i,i);
end;
tf=cputime;
tempi=ones(n);
tempi(n/10)=tf-ti;
end;
%Grafico di n e della variabile tempi
n=[10:10:400];
plot(n,tempi);
qualcuno mi sa dire dove sbaglio?
grazie!!!!

Risposte
il problema è che vuoi plottare due vettori aventi dimensioni diverse, te ne puoi accorgere usando i comandi size(n) e size(tempi), il vettore n sembra coerente col tuo scopo quindi anche il vettore dei tempi deve avere le stesse dimensioni
Guardando meglio direi che forse hai sbagliato a inizializzare il vettore tempi: praticamente per ogni valore di n devi calcolare componente del vettore, ma la sua dimensione è il numero dei passi che non c'entra niente col valore di n nel tuo codice
Guardando meglio direi che forse hai sbagliato a inizializzare il vettore tempi: praticamente per ogni valore di n devi calcolare componente del vettore, ma la sua dimensione è il numero dei passi che non c'entra niente col valore di n nel tuo codice
quindi devo inizializzare "tempi" in modo che non dipenda da n?
"Tagliafico":
quindi devo inizializzare "tempi" in modo che non dipenda da n?
in pratica devi inizializzarlo alla dimensione del vettore n invece che ai valori delle componenti di n, la dimensione è quindi il numero dei passi che se ho capito bene è sempre 40 e non deve cambiare durante l'esecuzione
mm ok...in realtà però ho sistemato qualcosa e il programma ora mi parte e mi da il tempo impiegato.
Quel che non esce ora è il grafico della variabile n e del tempo, perchè nel modo in cui lo sto ponendo ovviamente considera solo il tempo totale della risoluzione del sistema per tutti gli n che vanno da 10 a 400.
un'altra cosa che non capisco è questa:
dopo che fattorizzo $A=L*U$ in alcuni esercizi, così da poter poi risolvere i due sistemi triangolari $Ly=b$ e $Ux=y$
devo inizializzare sia $L$ che $U$.
Ora, se inizializzo $U=zeros(n)$ e L=ones(n)
la soluzione che ottengo è $(Inf, -Inf)$ (supponendo $n=2$).
se invece pongo L=ones(n) allora ottengo una soluzione numerica (che credo sia corretto).
In altri esercizi invece mi serve porre U=ones(n) e $L=zeros(n)$ per avere la soluzione corretta.
ma non capisco il motivo di ciò. Quando ho iniziato a inizializzare i vettori in matlab ho considerato matrici nulle e matrici con entrate tutte pari ad 1 perché ho pensato che così come nel linguaggio C un elemento $x$ doveva essere inizializzato a qualcosa tipo $x=-1$ o $x=0$ o $x=1$ a seconda della situazione, in matlab funzionasse più o meno allo stesso modo..
Quel che non esce ora è il grafico della variabile n e del tempo, perchè nel modo in cui lo sto ponendo ovviamente considera solo il tempo totale della risoluzione del sistema per tutti gli n che vanno da 10 a 400.
un'altra cosa che non capisco è questa:
dopo che fattorizzo $A=L*U$ in alcuni esercizi, così da poter poi risolvere i due sistemi triangolari $Ly=b$ e $Ux=y$
devo inizializzare sia $L$ che $U$.
Ora, se inizializzo $U=zeros(n)$ e L=ones(n)
la soluzione che ottengo è $(Inf, -Inf)$ (supponendo $n=2$).
se invece pongo L=ones(n) allora ottengo una soluzione numerica (che credo sia corretto).
In altri esercizi invece mi serve porre U=ones(n) e $L=zeros(n)$ per avere la soluzione corretta.
ma non capisco il motivo di ciò. Quando ho iniziato a inizializzare i vettori in matlab ho considerato matrici nulle e matrici con entrate tutte pari ad 1 perché ho pensato che così come nel linguaggio C un elemento $x$ doveva essere inizializzato a qualcosa tipo $x=-1$ o $x=0$ o $x=1$ a seconda della situazione, in matlab funzionasse più o meno allo stesso modo..
in realtà in matlab non è necessario inizializzare tutte le variabili, devi solo fare in modo che una variabile non venga usata prima che gli sia assegnato un valore
"walter89":
in realtà in matlab non è necessario inizializzare tutte le variabili, devi solo fare in modo che una variabile non venga usata prima che gli sia assegnato un valore
mm..beh in effetti molte variabili le uso senza inizializzarle, però quelle due le inizializzo sempre, perchè se non lo faccio il programma mi dice che devo dare loro una precollocazione (che non so bene se in italiano si dica così) e dopo che le inizializzo gli sta bene la cosa e non lo disturba più.