Process synchronization Operating System Operating System Lab 5 – Info B Luca M. Cassano– luca.cassano@polimi.it SadeghM. Astaneh– sadegh.astaneh@unimi.it © 2005 William Fornaciari © 2005 William Fornaciari 1
Process synchronization Lab 5: Obiettivi Operating System Introduzione a Matlab/Octave Funzioni Grafici 2 © 2005 William Fornaciari
Process synchronization WARM-UP Operating System Disegnare la “gittata” di un corpo che cade da 100m di altezza quando lanciato orizzontalmente con un velocità a vostro piacimento Quanto tempo impiega a cadere a terra? Quanto si sposta in orizzontale prima di cadere a terra? 3 © 2005 William Fornaciari 3
Process synchronization WARM-UP Operating System 4 © 2005 William Fornaciari 4
Process synchronization WARM-UP Operating System step=0.01; v=8.9; t=[0:step:100]; y=(100-9.8.*(t.^2)); x=(v.*t); y1=abs(y); [w, p]=min(y1); disp('Time:'); disp(t(p)); disp('Distance:'); disp(x(p)); plot(x,y); 5 © 2005 William Fornaciari 5
Process synchronization Problema 1 Operating System 6 © 2005 William Fornaciari 6
Process synchronization Soluzione 1 Operating System function rango = rango(M) if size(M,2)~=size(M,1) display('La matrice non e'' quadrata'); return end n = size(M,2); if det(M) ~= 0 rango = n; elseif n==1 rango=0; else % Calcolo tutte le sottomatrici possibili % Il rango sar? pari al massimo rango delle sottomatrici 7 © 2005 William Fornaciari 7
Process synchronization Soluzione 1 Operating System r=[]; for i = 1:n for j = 1:n M_temp = M; M_temp(i,:) = []; M_temp(:,j) = []; r = [r rango(M_temp)]; end rango = max(r); 8 © 2005 William Fornaciari 8
Process synchronization Problema 2 Operating System 9 © 2005 William Fornaciari 9
Process synchronization Soluzione 2 Operating System t = -10:0.01:10; x = cos(t); y = sin(t); z = t; plot3(x,y,z) title("3D plot") ylabel("sin(t)") xlabel("cos(t)") zlabel("t") % Per abilitare tutte le grigliegrid on Se voglio abilitare una o % piu' griglie in particolare (qui abilito solo griglia su x e y) % set (gca, "xgrid", "on") % set (gca, "ygrid", "on") 10 © 2005 William Fornaciari 10
Process synchronization Problema 3 Operating System 11 © 2005 William Fornaciari 11
Process synchronization Soluzione 3 Operating System N = 1:100; e = exp(1); ii = 0; for j=N r(j) = approx_e(j); err(j) = abs(r(j)-e); if err(j) > 0.001 ii = j; end display(['L''errore diventa inferiore di 0.001 a partire da N=' num2str(ii+1)]); % Si possono usare indistintamente sia v_iter che v_rec nel % grafico figure hold onplot(N, r, '-ro') plot([min(N) max(N)], [exp(1) exp(1)], 'g') title('Approssimazione di e') ylabel('e') xlabel('n') hold off 12 © 2005 William Fornaciari 12
Process synchronization Problema 4 Operating System 13 © 2005 William Fornaciari 13
Process synchronization Soluzione 4 Operating System stampagriglia; giocatore1.nome = input('Come si chiama il primo giocatore: '); giocatore1.simbolo = -1; giocatore1.colore = 'g'; giocatore1.stampa = @stampacroce; giocatore2.nome = input('Come si chiama il secondo giocatore: '); giocatore2.simbolo = 1; giocatore2.colore = 'b'; giocatore2.stampa = @stampacirc; giocate = 0; % simboli posizionati vincitore = 0; A = zeros(3,3); giocatorecur = giocatore1; 14 © 2005 William Fornaciari 14
Process synchronization Soluzione 4 Operating System function r=approx_e(n) r = 0; for i=0:n r = r + 1/factorial(i); end 15 © 2005 William Fornaciari 15
Process synchronization Soluzione 4 Operating System while (giocate<9 && vincitore==0) valida = false; while(valida==false) a = input([giocatorecur.nome ' comunicami un array con riga e colonna che rappresenta la tua mossa: ']); if(A(a(1),a(2))==0) valida = true; else display('mossa non valida! riprova'); end A(a(1),a(2)) = giocatorecur.simbolo; centro.x = a(2) + 0.5; centro.y = 4.5 - a(1); 16 © 2005 William Fornaciari 16
Process synchronization Soluzione 4 Operating System giocatorecur.stampa(centro,0.5,giocatorecur.colore); % leggere dove il giocatore vuole inserire il suo segno if (vittoriaTris(A,giocatorecur)) disp(['Complimenti ' giocatorecur.nome ', hai vinto!']); vincitore = 1; end giocate = giocate + 1; if strcmp(giocatorecur.nome,giocatore1.nome)==1 giocatorecur = giocatore2; else giocatorecur = giocatore1; 17 © 2005 William Fornaciari 17
Process synchronization Problema 5 Operating System 18 © 2005 William Fornaciari 18
Process synchronization Soluzione 5 Operating System function c = controllaRiga(v) if size(v)~=[1, 9] c = 0; return end % Genero il vettore di tutti ed i soli numeri che voglio V = 1:9; % Controllo che il vettore in ingresso ordinato sia uguale a % quello generato sopra se lo e' significa che tutti i numeri sono % interi, sono tutti da 1 a 9 e non ci sono ripetizioni c = all(sort(v)==V); 19 © 2005 William Fornaciari 19
Process synchronization Problema 6 Operating System 20 © 2005 William Fornaciari 20
Process synchronization Soluzione 6 Operating System function c = sudoku(S) if size(S)~=[9,9] c = 0 return end % Suppongo che la matrice soddisfi la soluzione c = true; % Per tutte le righe e le colonne controllo che queste soddisfino % la condizione del problema Non ho bisogno di due cicli, mi % basta chiamare la funzione es3 selezionando la riga o la % colonna opportunamente Quando seleziono la colonna devo % fare attenzione a trasporre il vettore altrimenti la funzione no % funziona. 21 © 2005 William Fornaciari 21
Process synchronization Soluzione 6 Operating System for i=1:9 c = c && controlloRiga(S(i,:)) && controlloRiga (S(:,i)'); end % A questo punto la condizione c e' verificata se e solo se tutti I % controlli del ciclo hanno ritornato risultato positivo Volendo si % poteva ottimizzare la funzione interrompendo il ciclo appena % c diventa falso 22 © 2005 William Fornaciari 22
Process synchronization Problema 7 Operating System 23 © 2005 William Fornaciari 23
Process synchronization Soluzione 7 Operating System % La funzione ritorna la x e la y dello 0, il numero di iterazioni i %effettuate e tutti i punti analizzati durante le iterazioni function [x, y, i, xp, yp] = bisezione(f, a, b, toll) nCoeff = length(f); % Calcolo il valore della funzione nel punto a e b Ho supposto % che nel caso della funzione y = 2*x^2 - 10 la f passata sia % [2 0 -10] quindi con il coefficiente della potenza piu' elevate % in prima posizione Se cosi' non fosse basta cambiare questo % vettore invertendo l'ordine [nCoeff-1:-1:0] va = sum(((a * ones(1,nCoeff)) .^ [nCoeff-1:-1:0]).*f); vb = sum(((b * ones(1,nCoeff)) .^ [nCoeff-1:-1:0]).*f); i = 0; 24 © 2005 William Fornaciari 24
Process synchronization Soluzione 7 Operating System if va*vb>0 display('Estremi dell''intervallo non validi') return end x = (a + b)/2; vx = sum(((x * ones(1,nCoeff)) .^ [nCoeff-1:-1:0]).*f); while abs(vx)>toll % Calcolo il punto medio ed il valode della funzione nel % punto medio % Aggiorno gli estremi dell'intervallo if va*vx>0 a=x; 25 © 2005 William Fornaciari 25
Process synchronization Soluzione 7 Operating System else b=x; end % Incremento il numero delle iterazioni Salvo i valori trovati a % questo passo nel vettore i = i + 1; xp(i) = x; yp(i) = vx; % Continuo fino a quando il valore assoluto del punto e' % maggiore del valore di tolleranza Posso quindi decidere la % precisione con cui volgio calcolare lo 0 y = vx; 26 © 2005 William Fornaciari 26