Facoltà di Ingegneria Industriale Laurea in Ingegneria Energetica, Meccanica e dei Trasporti Dipartimento di Elettronica e Informazione Informatica B Prof. Marco Masseroli
LAB 4: MATLAB/OCTAVE ESERCIZI DI STRUTTURE DI CONTROLLO, ARRAY E MATRICI SOLUZIONI 2
1 - Esercizi introduttivi Problema 1 Scrivere un programma che prende in input la temperatura in gradi Celsius e restituisce in output i gradi Fahrenheit (Formula: Fahrenheit = Celsius * 9/5 + 32). Nota: Usare la funzione input per l'inserimento di interi. 3
1 - Esercizi introduttivi Soluzione Problema 1 celsius = input('inserire la temperatura in gradi Celsius'); fahrenheit = celsius * (9/5) + 32; fprintf('la temperatura in gradi Fahrenheit e'': %f', fahrenheit); 4
1 - Esercizi introduttivi Soluzione - Problema 2 Scrivere un programma che, avendo come dati in ingresso i parametri a,b,c, risolva la generica equazione di secondo grado, anche nel caso di soluzioni complesse e coniugate. Considerare anche i casi di equazione di primo grado e uguaglianza (che rimane da verificare). Il programma deve stampare il valore di delta, e i valori delle radici con anche messaggi adeguati. 5
1 - Esercizi introduttivi Soluzione - Problema 2 fprintf("consider the Second degree equation : ax^2 + bx + c = 0 \n"); a= input("enter the a integer parameter \n"); b= input("enter the b integer parameter \n"); c= input("enter the c integer parameter \n"); if (a ~= 0) delta = b*b-4*a*c; fprintf("delta = %f\n\n", delta); x1= (-b - sqrt(delta))/(2*a); x2= (-b + sqrt(delta))/(2*a); if (delta ==0) fprintf("the equation has two coincident real solutions.\n"); elseif (delta >0) fprintf("there are two distinct real solutions.\n"); elseif (delta <0) fprintf("there are two complex solutions.\n"); end fprintf("solution x1 ="); disp(x1); fprintf("solution x2 ="); disp(x2); elseif (b~=0) x= -c/b; fprintf("this is a first degree equation. There is one real solution.\n"); fprintf("x= %f\n\n", x); elseif (c==0) fprintf("this is not an equation.\n"); fprintf("there is an equality: 0 is equal to 0.\n"); else fprintf("the number %d is different from 0: inequality.\n", c); end 6
2 -Media Problema 3 Scrivere un programma che calcoli la media di 3 numeri inseriti dall utente. Risolvere il programma in due modi: - i tre valori vengono memorizzati in tre variabili diverse. - i tre valori vengono memorizzati come elementi di un vettore. In questo secondo caso, la media si può calcolare come mean(v), se v è il vettore costruito. 7
2 -Media Soluzione Problema 3 Modo 1 a = input('inserire il primo numero'); b = input('inserire il secondo numero'); c = input('inserire il terzo numero'); media = (a + b + c) / 3; fprintf('la media dei tre numeri, utilizzando il primo metodo, e'': %f\n', media); Modo 2 a(1) = input('inserire il primo numero'); a(2) = input('inserire il secondo numero'); a(3) = input('inserire il terzo numero'); fprintf('la media dei tre numeri, utilizzando il secondo metodo, e'': %f\n', mean(a)); 8
2 -Media Problema 4 Estensione: usando la seconda implementazione, è facile gestire l'inserimento di un numero arbitrario di valori, chiesto come prima cosa all'utente. L'inserimento deve essere in questo caso gestito tramite un ciclo for. 9
2 -Media Soluzione - Problema 4 numero = 0; while (numero <=0 ) numero = input ("Inserisci il numero di elementi da considerare"); end for ii= 1:numero a(ii) = input ("Inserisci un numero"); end fprintf('la media dei numeri e'': %f\n', mean(a)); 10
3 - Tabellina del prodotto Problema 5 Scrivere un file Matlab/Octave per produrre le tabelline dei prodotti di tutti i numeri da 1 a N (N = 10). Per ogni numero mostrare le prime M moltiplicazioni. Il risultato dev'essere una matrice di M righe ed N colonne. 11
3 - Tabellina del prodotto Soluzione - Problema 5 k = input('inserire il numero di moltiplicazioni da effettuare: '); for m = 1:k for n = 1:10 tab(m,n) = m*n; end end disp(tab) 12
3 - Tabellina del prodotto Problema 6 Estensione: Il programma può anche essere risolto senza l'utilizzo di cicli, utilizzando in particolare la funzione repmat, e seguendo questi passi: - generare un vettore riga contenente i valori da 1 a N; - generare un vettore colonna contenente i valori da 1 a M; - ricopiare il vettore riga M volte verso il basso, tramite la funzione repmat. Si ottiene una matrice MxN; - ricopiare il vettore colonna N volte verso destra, tramite la funzione repmat. Si ottiene una matrice MxN; - effettuare il prodotto elemento per elemento delle due matrici MxN calcolate prima. 13
3 - Tabellina del prodotto Soluzione - Problema 6 n=10; m = input('inserire il numero di righe da utilizzare: '); x = 1:1:n y = (1:1:m) x1 = repmat(x,m,1); x2 = repmat(y,1,n); disp(x1.* x2) 14
4 Le città Problema 7 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 tutti gli elementi sulla diagonale principale (in modo da non si considerare la distanza tra una città e stessa). Facoltativo: visualizzare la matrice tramite il comando image. 15
4 Le città Soluzione - Problema 7 n = input('inserire il numero di città da utilizzare: '); x = rand(1,n).*100; y = rand(1,n).*100; for ii = 1:n distanza(ii,:) = sqrt((x(ii)-x).^2 + (y(ii)-y).^2); distanza(ii,ii) = NaN; end; plot(x,y,"o"); image(distanza); 16