2 a lezione - laboratorio a.a Corso di Laurea Ingegneria MECCANICA
Come visualizzare leditor Per visualizzare leditor del Matlab si può: – digitare il comando edit – si può selezionare con il mouse dallambiente 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 Il carattere % serve a scrivere commenti allinterno di M-file % 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.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 N.B. Non accetta argomenti di input e di output
Salvare e richiamare m-script Richiamare: Si richiama digitando solo il nome con cui è stato memorizzato il file Eps1 N.B. Lo script opera sul Workspace base. Salvare m-script: Dopo avere digitato le istruzioni nella finestra delleditor di testo, si salva selezionando sulla barra la voce file e scegliendo nel menu : Save as. Assegnare un nome: Eps1
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.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 » eps e e e-001 ………………… e e-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 » » eps e e e-001 ………………… e e-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 function s = fatt(c) % %FATT calcola il fattoriale di c. % s=1; if c>=1 for i=1:c s=s*i; end Help Online Codice Argomento di output Nome della funzione Argom. di input function [out1,out2,out3] = nome_fun(in1,in2) Caso generale
Salvare e Richiamare m- function – Si salva in modo analogo a m-script: nome_fun – Si richiama digitando unuguaglianza 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 unarea di memoria distinta dal Workspace base (variabili locali)
function s = fatt(c) % % FATT calcola il fattoriale del numero c. % s=1; if c>=1 for i=1:c s=s*i; end function s = fatt(c) % % FATT calcola il fattoriale del numero c. % s=1; if c>=1 for i=1:c s=s*i; end Risultati del file fatt.m » numero =5; » valore=fatt(numero) valore = 120 » » whos Name Size Bytes Class numero 1x1 8 double array valore 1x1 8 double array Grand total is 2 elements using 16 bytes » » numero =5; » valore=fatt(numero) valore = 120 » » whos Name Size Bytes Class numero 1x1 8 double array valore 1x1 8 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 dallinizio della lista delle directory indicate e fermandosi appena trova un file con lo stesso nome, se no… fatt ??? Undefined function or variablefatt.
Funzioni matematiche elementari » x=[ ] » round(x) ans = » fix(x) ans = » floor(x) ans = » ceil(x) ans = » x=[ ] » round(x) ans = » fix(x) ans = » floor(x) ans = » ceil(x) ans =
Funzioni trigonometriche » x=[0:.2:1]'; » y=sin(x); » [x y] ans = » x=[0:.2:1]'; » y=sin(x); » [x y] ans = Langolo x deve essere espresso in radianti!!!
ciclo for È simile a quello di altri linguaggi di programmazione Ripete le istruzioni molte volte Può essere annidato » N = 4; » for I = 1:N for J = 1:N A(I,J) = 1/(I+J-1); end » N = 4; » for I = 1:N for J = 1:N A(I,J) = 1/(I+J-1); end 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 1/3 1/4 1/5 1/6 1/4 1/5 1/6 1/7 >> % comando equivalente hilb(4) >> A A = 1 1/2 1/3 1/4 1/2 1/3 1/4 1/5 1/3 1/4 1/5 1/6 1/4 1/5 1/6 1/7 >> % comando equivalente hilb(4)
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=[ ; 1 1 0; ], determini la matrice C che ha lelemento C(i,j) pari a: C(i,j)=A(i,j)+cos((i+j)*pi/(n+m))*B(i,j), con
File prova2.m A=[1 2 3; 4 5 6; 7 8 9]; B=[ ; 1 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 disp('Il risultato è') disp(C)
Risultati file prova2.m >>prova2 Il risultato è >> >>prova2 Il risultato è >>
Operatori relazionali e logici Logici Relazionali Gli operatori relazionali precedono nellordine 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 % % 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 = >> >> ciclo_w >> A A = >> Costruire con cicli while la matrice di Hilbert 4x4.
Costrutto if - else È una struttura condizionale Se una condizione è verificata esegue le istruzioni associate ESEMPIO »if I == J A(I,J) = 2; elseif abs(I-J)== 1 A(I,J) = -1; else A(I,J) = 0; end ESEMPIO »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 % % 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 % % 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 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.
Risultati file ciclo_if.m >> ciclo_if >> A A = >> >> ciclo_if >> A A = >>
Comando di input input : inserimento di variabili numeriche da tastiera » z=input(' Introduci il valore di z ') Introduci il valore di z 5 z = 5 » 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 = » a=input(' Introduci la matrice a ') Introduci la matrice a [1 2 3; 4 5 6; 7 8 9] a = Sintassi: nome_var=input(str) str: stringa che si vuole compaia sul prompt
Comando di input input : inserimento di stringhe da tastiera » flag=input('Vuoi continuare? ','s') Vuoi continuare? Si flag = Si » flag=input('Vuoi continuare? ') Vuoi continuare? 'Si' flag = Si » flag=input('Vuoi continuare? ','s') Vuoi continuare? Si flag = Si » flag=input('Vuoi continuare? ') Vuoi continuare? 'Si' flag = Si Sintassi: var_str=input(str,s) str: stringa che compare sul prompt
Comandi di output disp consente di stampare linee di testo e valori di variabili. » disp('valore della funzione') valore della funzione » disp('valore della funzione') valore della funzione num2str(x) converte lo scalare x in una stringa di caratteri »x=sqrt(2); »disp(x) »x=sqrt(2); »disp(x) » disp(['Il valore di x è ',num2str(x)]) Il valore di x è » disp(['Il valore di x è ',num2str(x)]) Il valore di x è Sintassi: disp(str) str stringa o nome di una variabile numerica che si vuole far comparire sul prompt.
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° » temp=31; » fprintf('La temperatura è di %4.1f gradi C°\n',temp) La temperatura è di 31.0 gradi C° » fprintf(' %f\n',pi) » fprintf(' %f\n',pi) %f consente la stampa dei numeri in fixed point, %e consente la stampa in formato esponenziale » fprintf( %12.10f\n ',pi) » fprintf( %18.10e\n ',pi) e+000 » fprintf( %12.10f\n ',pi) » fprintf( %18.10e\n ',pi) e+000 Nei formati f ed e il numero alla sinistra del punto è il campo totale, quello alla destra indica quante cifre decimali devono essere stampate
Esercizio 2 Calcolare la funzione f = e -x sin(x) nei punti appartenenti allintervallo [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') x=[0:.2:1]'; f=exp(-x).*sin(x); tab=[x f]; fprintf(' x f\n') fprintf('%6.3f %12.8f\n',tab') x f x f Risultati
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 è e » 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) 1.» str=['la precisione macchina è ', num2str(eps)]; » disp(str) la precisione macchina è e » 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)