a 2 lezione - laboratorio Corso di Laurea Ingegneria MECCANICA a.a 2004-2005 Come visualizzare l’editor Per visualizzare l’editor del Matlab si può: – – digitare il comando edit si può selezionare con il mouse dall’ambiente di calcolo la voce File e dal menu a tendina che compare la voce New oppure Open se il file esiste già m-file File di testo contenente codici MATLAB. Consente di memorizzare ed organizzare istruzioni e comandi MATLAB script function m-file script • Standard ASCII file di testo • Esegue una serie di comandi MATLAB sul workspace base N.B. Non accetta argomenti di input e di output % EPS1.m - m-file per % calcolare la precisione di % macchina num=0; EPS=1; while (1+EPS)>1 EPS=EPS/2; num=num+1; vett(num,:)=[num EPS]; fprintf('%5.0f %30.16e\n',... vett(num,:)); end Il carattere “ % “ serve a scrivere commenti all’interno di M-file Salvare e richiamare m-script Salvare m-script: Dopo avere digitato le istruzioni nella finestra dell’editor di testo, si salva selezionando sulla barra la voce file e scegliendo nel menu : Save as. Assegnare un nome: Eps1 Richiamare: Si richiama digitando solo il nome con cui è stato memorizzato il file Eps1 N.B. Lo script opera sul Workspace base. Risultati del file EPS1.m % EPS1.m - m-file per % calcolare la precisione di % macchina num=0; EPS=1; while (1+EPS)>1 EPS=EPS/2; num=num+1; vett(num,:)=[num EPS]; fprintf('%5.0f %30.16e \n',... vett(num,:)); end » eps1 1 5.0000000000000000e-001 2 2.5000000000000000e-001 3 1.2500000000000000e-001 ………………… 52 2.2204460492503131e-016 53 1.1102230246251565e-016 » » whos Name Size Bytes Class EPS 1x1 8 double array num 1x1 8 double array vett 53x2 848 double array Grand total is 108 elements using 864 bytes » m-file function Argomento di output Nome della funzione Argom. di input Help Online Codice function s = fatt(c) % %FATT calcola il fattoriale di c. % s=1; if c>=1 for i=1:c s=s*i; end end Caso generale function [out1,out2,out3] = nome_fun(in1,in2) Salvare e Richiamare mfunction – Si salva in modo analogo a m-script: nome_fun – Si richiama digitando un’uguaglianza del tipo:[out1,out2,out3] = nome_fun(in1,in2) – out1,out2,out3 sono i parametri in uscita, – in1,in2 sono i parametri in input valore=fatt(5) N.B. La function • accetta argomenti di input e di output • opera su un’area di memoria distinta dal Workspace base (variabili locali) Risultati del file fatt.m function s = fatt(c) % % FATT calcola il fattoriale del numero c. % s=1; if c>=1 » numero =5; for i=1:c » valore=fatt(numero) s=s*i; valore = end 120 end » » whos Name Size Bytes Class numero valore 1x1 1x1 8 8 double array double array Grand total is 2 elements using 16 bytes » Come opera il Matlab (ad esempio su fatt) • controlla se fatt è una variabile in uso, se no… • controlla se fatt è una funzione built-in, se no.. • controlla se nella directory corrente esiste un M-file chiamato fatt.m, altrimenti… • controlla se il file fatt.m è presente in qualche directory del path, partendo dall’inizio della lista delle directory indicate e fermandosi appena trova un file con lo stesso nome, se no… • fatt ??? Undefined function or variable ‘fatt’. Funzioni matematiche elementari round(x) Arrotonda all’intero più vicino fix(x) Arrotonda all’intero più vicino verso 0 » x=[-1.9 -0.2 3.4 5.6 7.0] floor(x) Arrotonda all’intero più vicino verso - ceil(x) Arrotonda all’intero più vicino verso sign(x) -1 se x è negativo, 1 se positivo rem(x,y) Resto della divisione x/y abs(x) Modulo o valore assoluto sqrt(x) Radice quadrata exp(x) Esponenziale log(x) Logaritmo naturale log10(x) Logaritmo in base 10 log2(x) Logaritmo in base 2 » round(x) ans = -2 0 » fix(x) ans = -1 0 » floor(x) ans = -2 -1 » ceil(x) ans = -1 0 3 6 7 3 5 7 3 5 7 4 6 7 Funzioni trigonometriche sin(x) Seno cos(x) Coseno tan(x) Tangente asin(x) Arcoseno acos(x) Arcocoseno atan(x) Arcotangente sinh(x) Seno iperbolico cosh(x) Coseno iperbolico » x=[0:.2:1]'; » y=sin(x); » [x y] ans = 0 0 0.2000 0.1987 0.4000 0.3894 0.6000 0.5646 0.8000 0.7174 1.0000 0.8415 tanh(x) Tangente iperbolica L’angolo x deve essere espresso in radianti!!! ciclo for » N = 4; » for I = 1:N for J = 1:N A(I,J) = 1/(I+J-1); end end • È simile a quello di altri linguaggi di programmazione • Ripete le istruzioni molte volte • Può essere annidato Queste istruzioni consentono di costruire la matrice di Hilbert 4x4. Risultati >> A A = 1 1/2 1/3 1/4 1/2 1/3 1/4 1/5 >> % comando equivalente hilb(4) 1/3 1/4 1/5 1/6 1/4 1/5 1/6 1/7 Esercizio 1: applicazione di ciclo for Scrivere un file script tale che, assegnate due matrici: A=[1 2 3; 4 5 6; 7 8 9], B=[5 -6 -9; 1 1 0; 24 1 0], determini la matrice C che ha l’elemento C(i,j) pari a: C(i,j)=A(i,j)+cos((i+j)*pi/(n+m))*B(i,j), con A e B R nxm . File prova2.m A=[1 2 3; 4 5 6; 7 8 9]; B=[5 -6 -9; 1 1 0; 24 1 0]; [n,m]=size(A); for i =1:n for j=1:m C(i,j)=A(i,j)+cos((i+j)*pi/(n+m))*B(i,j); end end disp('Il risultato è') disp(C) Risultati file prova2.m >>prova2 Il risultato è 3.5000 2.0000 4.0000 4.5000 -5.0000 7.1340 >> 7.5000 6.0000 9.0000 Operatori relazionali e logici Relazionali Logici < Minore <= Minore o uguale > Maggiore >= Maggiore o uguale == Uguale ~= Diverso & and | or ~ not Gli operatori relazionali precedono nell’ordine gli operatori logici. ciclo while Consente di ripetere le istruzioni sotto il controllo di una condizione logica % % File ciclo_w.m % I=1; N=4; while I <= N J = 1; while J <= N A(I,J) =(I+J); J=J+1; end I=I+1; end Risultati file: ciclo_w.m >> ciclo_w >> A A = 2 3 4 5 >> 3 4 5 6 4 5 6 7 5 6 7 8 Costruire con cicli while la matrice di Hilbert 4x4. Costrutto if - else ESEMPIO • È una struttura condizionale • Se una condizione è verificata esegue le istruzioni associate »if I == J A(I,J) = 2; elseif abs(I-J)== 1 A(I,J) = -1; else A(I,J) = 0; end File ciclo_if.m Le istruzioni precedenti, inserite in un doppio ciclo for, consentono di costruire una matrice tridiagonale che ha tutti 2 sulla diagonale principale e -1 sulle codiagonali inferiore e superiore. % % File Ciclo_if.m % N=4; for I=1:N for J=1:N if I == J A(I,J) = 2; elseif abs(I-J)== 1 A(I,J) = -1; else A(I,J) = 0; end end end Risultati file ciclo_if.m >> ciclo_if >> A A = 2 -1 -1 2 0 -1 0 0 >> 0 -1 2 -1 0 0 -1 2 Comando di input input: inserimento di variabili numeriche da tastiera Sintassi: nome_var=input(str) str: stringa che si vuole compaia sul prompt » z=input(' Introduci il valore di z ') Introduci il valore di z 5 z = 5 » a=input(' Introduci la matrice a ') Introduci la matrice a [1 2 3; 4 5 6; 7 8 9] a = 1 2 3 4 5 6 7 8 9 Comando di input input: inserimento di stringhe da tastiera Sintassi: var_str=input(str,’s’) str: stringa che compare sul prompt » flag=input('Vuoi continuare? ','s') Vuoi continuare? Si flag = Si » flag=input('Vuoi continuare? ') Vuoi continuare? 'Si' flag = Si Comandi di output disp consente di stampare linee di testo e valori di variabili. Sintassi: disp(str) str stringa o nome di una variabile numerica che si vuole far comparire sul prompt. » disp('valore della funzione') valore della funzione num2str(x) converte lo scalare x in una stringa di caratteri »x=sqrt(2); »disp(x) 1.4142 » disp(['Il valore di x è ',num2str(x)]) Il valore di x è 1.4142 Comandi di output fprintf consente di stampare linee di testo, valori numerici e matrici specificandone il formato. Sintassi: fprintf(‘ format \n’, mat’ ) format è una stringa contenente i formati scelti con la specifica: %campo_totale.n_cifre_decimali_tipo in numero pari alle colonne della matrice mat; \n serve per andare a capo è necessario scrivere mat’ per stampare la matrice mat così come si presenta. » temp=31; » fprintf('La temperatura è di %4.1f gradi C°\n',temp) La temperatura è di 31.0 gradi C° %f consente la stampa dei numeri in fixed point, %e consente la stampa in formato esponenziale Nei formati f ed e il numero alla sinistra del punto è il campo totale, quello alla destra indica quante cifre decimali devono essere stampate » fprintf(' %f\n',pi) 3.141593 » fprintf(’ %12.10f\n ',pi) 3.1415926536 » fprintf(’ %18.10e\n ',pi) 3.1415926536e+000 Esercizio 2 • Calcolare la funzione f = e-xsin(x) nei punti appartenenti all’intervallo [0,1] equispaziati con passo 0.2. • Costruire una tabella contenente i valori di x e di f e stamparla utilizzando: • 3 cifre decimali in formato virgola fissa per x • 8 cifre decimali in virgola fissa per f. File funzione.m e risultati x=[0:.2:1]'; f=exp(-x).*sin(x); tab=[x f]; fprintf(' x f\n') fprintf('%6.3f %12.8f\n',tab') Risultati x 0.000 0.200 0.400 0.600 0.800 1.000 f 0.00000000 0.16265669 0.26103492 0.30988236 0.32232887 0.30955988 Esercizio 3 • Costruire una stringa che mostri il valore della precisione macchina; utilizzare poi un comando di output per farla stampare sul prompt. • Creare la stringa di input che consente di assegnare alla variabile A una matrice generica. • Creare la stringa di input che consente di assegnare alla variabile f la stringa 5x+2e-x. Soluzioni esercizio 3 1. » str=['la precisione macchina è ', num2str(eps)]; » disp(str) la precisione macchina è 2.2204e-016 2. » A=input('inserisci la matrice A '); inserisci la matrice A [1 2 3;4 5 6] » 3. » f=input('inserisci la funzione ') inserisci la funzione '5*x+2*exp(x)' oppure » f=input('inserisci la funzione ','s') inserisci la funzione 5*x+2*exp(x) f = 5*x+2*exp(x)