320 likes | 443 Views
Lab 6 – Info B. Marco D. Santambrogio – marco.santambrogio@polimi.it Riccardo Cattaneo – cattaneo@elet.polimi.it Ver. aggiornata al 9 Agosto 2013. Lab 5: Obiettivi. Introduzione a Matlab/Octave Cicli Funzioni Strutture. Lab 5: Agenda. Warm Up (40 ’ )
E N D
Lab 6 – Info B Marco D. Santambrogio – marco.santambrogio@polimi.it Riccardo Cattaneo – cattaneo@elet.polimi.it Ver. aggiornata al 9 Agosto 2013
Lab 5: Obiettivi Introduzione a Matlab/Octave Cicli Funzioni Strutture
Lab 5: Agenda • Warm Up (40’) • Qualche cosa un po' più divertente (90’) • Altri exe… (110’)
Lab 5: Warm up • Warm Up (40’) • Inserisci numeri • Temperatura • mcm • Qualche cosa un po' più divertente (90’) • Altri exe… (110’)
Problema: Inserisci numeri • Acquisiamo numeri da tastiera finché non viene inserito un numero negativo. • In ogni caso non accettiamo più di mille numeri
Soluzione: Inserisci numeri vector = [ ]; %crea il vettore vuoto for count = 1:1000 %Raccoglierà al max 1000 valori value = input('next number '); if value < 0 break %Se value negativo usciamo dal ciclo else vector(count) = value; end end vector %permette di visualizzare il contenuto di vector
Problema: Temperatura • Scrivere un programma che prende in input la temperatura in gradi Celsius e restituisce in output i gradi Fahrenheit • Formula: Fahrnait = Celsius * 9/5 + 32
Soluzione: Temperatura temp_c = input('Inserire la temperatura in gradi Celsius: '); temp_f = temp_c * 9/5 + 32; disp(['La temperatura in gradi Fahrenheit è ', num2str(temp_f)]);
mcm: problema • Dati due numeri x ed y, si definisce il minimo comune multiplo come • mcm = x*y/MCD(x,y) • Si risolve il problema creando una funzione mcm
mcd in Octave function [div] = mcd(x,y) if(x == y) div = x; elseif(x < y) for cont = x:-1:1 if mod(x,cont) == 0 && mod(y,cont) == 0 div = cont; break end end else for cont = y:-1:1 if mod(x,cont) == 0 && mod(y,cont) == 0 div = cont; break end end end
mcm in Octave function [mul] = mcm(x,y) mul = x * y / mcd(x,y);
Lab 5: Un po’ di divertimento • Warm Up (40’) • Qualche cosa un po' più divertente (90’) • Maggiore • Equazione secondo grado • Rilievi altimetrici • Altri exe… (110’)
Problema: Maggiore • Scrivere un programma che prenda in input un array e conti tutti i numeri che sono maggiore di un numero n inserito dall’utente
Soluzione: Maggiore mag = input('Vuoi contare i numeri maggiori di quanto? '); disp('Array (ricorda di inserire i numeri tra parentesi quadre):'); inarray = input(''); counter = 0; for ii=1:length(inarray) if inarray(ii)>mag counter = counter+1; end end disp(['I numeri maggiori di ',num2str(mag),' sono ',num2str(counter)]);
Soluzione: Maggiore (in due righe) mag = input('Vuoi contare i numeri maggiori di quanto? ’) disp('Array (ricorda di inserire i numeri tra parentesi quadre):’) inarray = input(’’) magV= inarray(inarray>mag); counter = size(magV,2); disp(['I numeri maggiori di ',num2str(mag),' sono ',num2str(counter)]);
Problema: Equazione secondo grado • Scrivere una funzione per il calcolo dell'equazione di secondo grado: ax^2 + bx + c. • Inseriti a, b e c la funzione deve ritornare il valore di delta, e i valori delle radici reali (se esistono). • In caso che delta sia uguale a 0, x1 contiene la soluzione, mentre x2 non è un numero (NaN).
Soluzione: Equazione secondo grado function [delta, x1, x2] = eq2g(a,b,c) delta = b^2-4*a*c; if (delta==0) x1=(-b)/(2*a); x2=(-b)/(2*a); else x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); end
Esercizio: Rilievi altimetrici • Si sviluppi un programma in matlab che acquisisce da tastiera i dati relativi a rilievi altimetrici e stampa a video l’altitudine media di tutti quelli che hanno latitudine compresa tra 10 e 80 e longitudine tra 30 e 60 18
Soluzione (1ma parte): rilievi altimetrici more = input('vuoi inserire valori altimetrici? (s/n)'); ii=1; while more=='s' arch(ii).altitudine = input('altitudine '); arch(ii).longitudine = input('longitudine '); arch(ii).latitudine = input('latitudine '); ii = ii+1; more = input('vuoi inserire altri valori altimetrici? (s/n)'); end 19
Soluzione (2nda parte): rilievi altimetrici jj=1; for ii=1:length(arch) %attenzione: la condizione deve essere scritta sulla stessa linea… if arch(ii).latitudine>=10&&arch(ii).latitudine<=80 && arch(ii).longitudine>=30&&arch(ii).longitudine<=60 elemSelez(jj) = arch(ii).altitudine; jj=jj+1; end end disp(['la media degli elementi selezionati e` ' num2str(mean(elemSelez))]); 20
Lab 5: Altri exe • Warm Up (40’) • Qualche cosa un po' più divertente (90’) • Altri exe… (110’) • Cambio base • Scambio elementi • Matrici • Città
Problema: Cambio base • Ricevere un vettore che rappresenti le singole cifre di un numero in base 2 stampare a video il valore in base 10
Cambio base - Soluzione function [ris] = cambioBase(n) % N vettore di 0 e 1 esp=[length(n)-1:-1:0]; Basi=2.^esp; disp(sum(n.*basi));
Problema: Scambio elementi • Scrivere un programma che dati due array scambi gli elementi di indice dispari • usare la funzione mod
Soluzione: Scambio elementi function [inarray1, inarray2] = swapOdd(inarray1, inarray2) for ii=1:min(length(inarray1),length(inarray2)) if (mod(ii,2) == 1) temp=inarray1(ii); inarray1(ii)=inarray2(ii); inarray2(ii) = temp; end end
Soluzione: Scambio elementi disp('Array1 (ricorda di inserire i numeri tra parentesi quadre):'); inarray1 = input(''); disp('Array2 (ricorda di inserire i numeri tra parentesi quadre):'); inarray2 = input(''); [inarray1, inarray2] = swapOdd(inarray1, inarray2); disp('Ora gli array sono: '); disp(inarray1); disp(inarray2);
Problema: Matrici • Date le seguenti matrici A e B: A = [1 3 -2 -2; 0 2 4 -5; -1 2 3 2; 0 -1 -9 3]; B = [2 0 4 -10; 1 -2 -4 0; 6 -2 -2 1; 3 2 -4 -9]; • Si verifichi che • AB != BA, (A*B)T != AT*BT • ma che (AB)T = BT*AT (T significa matrice trasposta). • Provare anche che (A + B)2 != A2 + 2AB + B2.
Soluzione: Matrici (prima parte) AB=A*B; BA=B*A; val = (AB==BA); if (sum(sum(val))==0) disp('Le due matrici A*B e B*A sono diverse'); else disp('Le due matrici A*B e B*A sono uguali'); end ABT = (A*B)'; ATBT = (A')*(B'); val = (ABT==ATBT); if (sum(sum(val))==0) disp('Le due matrici (A*B)T e AT*BT sono diverse'); else disp('Le due matrici (A*B)T e AT*BT sono uguali'); end
Soluzione: Matrici (seconda parte) ABT = (A*B)'; BTAT = (B')*(A'); val = (ABT==BTAT); if (sum(sum(val))==0) disp('Le due matrici (A*B)T e BT*AT sono diverse'); else disp('Le due matrici (A*B)T e BT*AT sono uguali'); end PR = (A+B)^2; SE = (A^2)+(2*A*B)+(B^2); val = (PR==SE); if (sum(sum(val))==0) disp('Le due matrici (A + B)2 e A2 + 2AB + B2 sono diverse'); else disp('Le due matrici (A + B)2 e A2 + 2AB + B2 sono uguali'); end
Problema: Città • Sono date N città definite dalle loro coordinate euclidee (x,y). Tali coordinate sono scritte in due vettori di N elementi ciascuno (un vettore per le x, uno per le y). Ad esempio, x(1) e y(1) rappresentano le coordinate per la prima città. • Generare casualmente i vettori x e y come segue: x=rand(1,N); y=rand(1,N); osservare i valori risultanti, ed eventualmente moltiplicare i due vettori per 100 in modo che tali valori possano essere interpretati come coordinate espresse in km. • Disegnare la posizione di ogni città (plot) • Calcolare e stampare la matrice NxN delle distanze, in cui ogni cella (i,j) rappresenta la distanza euclidea tra la città i e la città j, calcolata tramite il teorema di pitagora. • Impostare a NaN la diagonale principale (in modo da non si considerare la distanza tra una città e stessa). Facoltativo: visualizzare la matrice tramite il comando image.
Soluzione: Città N = input('Quante città: '); x = rand(1,N); y = rand(1,N); x = 100*x; y = 100*y; plot(x,y,'bo'); hold on distanze = zeros(N,N); for i1 = 1:N for i2 = 1:N distanzai1i2quad = (x(i1) - x(i2))^2 + (y(i1) - y(i2))^2; distanze(i1,i2) = sqrt(distanzai1i2quad); end end disp(distanze); % Si può fare con un ciclo for oppure con una 'matrice logica' % for i1 = 1:N % distanze(i1,i2) = NaN; % end logicaldiag = logical(eye(N)); distanze(logicaldiag) = NaN; disp(distanze);
Fonti per lo studio • Fonti per lo studio • Introduzioneallaprogrammazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio • Capitoli 2, 3 e 4 • Credits • EmanuelePanigati https://sites.google.com/site/engpanigati/