320 likes | 431 Views
2 a lezione - laboratorio. Corso di Laurea Ingegneria MECCANICA. a.a 2004-2005. Come visualizzare l’editor. Per visualizzare l’editor del Matlab s i può: digitare il comando edit
E N D
2a lezione - laboratorio Corso di Laurea Ingegneria MECCANICA a.a 2004-2005
Come visualizzare l’editor • Per visualizzarel’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 % 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 • Standard ASCII file di testo • Esegue una serie di comandi MATLAB sul workspace base • N.B. Non accetta argomenti di input e di output 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 finestradell’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 scriptopera sul Workspace base.
Risultati del file EPS1.m » 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 » % 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
Nome della funzione Argomento di output Argom. di input Help Online Codice Caso generale function [out1,out2,out3] = nome_fun(in1,in2) 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 end
Salvare e Richiamare m-function • 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. Lafunction • 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 for i=1:c s=s*i; end end » 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 »
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’. Come opera il Matlab (ad esempio su fatt)
Funzioni matematiche elementari » x=[-1.9 -0.2 3.4 5.6 7.0] » round(x) ans = -2 0 3 6 7 » fix(x) ans = -1 0 3 5 7 » floor(x) ans = -2 -1 3 5 7 » ceil(x) ans = -1 0 4 6 7
Funzioni trigonometriche » 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 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 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=[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
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 7.5000 4.0000 4.5000 6.0000 -5.0000 7.1340 9.0000 >>
Operatori relazionali e logici Relazionali Logici Gli operatori relazionali precedono nell’ordine gli operatori logici.
ciclo while % % 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 Consente di ripetere le istruzioni sotto il controllo di una condizione logica
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 »if I == J A(I,J) = 2; elseif abs(I-J)== 1 A(I,J) = -1; else A(I,J) = 0; end • È una struttura condizionale • Se una condizione è verificata esegue le istruzioni associate
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 end 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 = 2 -1 0 0 -1 2 -1 0 0 -1 2 -1 0 0 -1 2 >>
Comando di input Sintassi:nome_var=input(str) str: stringa che si vuole compaia sul prompt input: inserimento di variabili numeriche da tastiera » 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 Sintassi:var_str=input(str,’s’) str: stringa che compare sul prompt 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
num2str(x) converte lo scalare x in una stringa di caratteri Comandi di output Sintassi: disp(str) str stringa o nome di una variabile numerica che si vuole far comparire sul prompt. disp consente di stampare linee di testo e valori di variabili. » disp('valore della funzione') valore della funzione »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; \nserve per andare a capo è necessario scrivere mat’ per stampare la matrice mat così come si presenta.
%f consente la stampa dei numeri in fixed point, %e consente la stampa in formato esponenziale » fprintf(' %f\n',pi) 3.141593 Nei formati f ed e il numero alla sinistradel punto è il campo totale, quello alladestraindica quantecifre decimali devono essere stampate » fprintf(’ %12.10f\n ',pi) 3.1415926536 » fprintf(’ %18.10e\n ',pi) 3.1415926536e+000 » temp=31; » fprintf('La temperatura è di %4.1f gradi C°\n',temp) La temperatura è di 31.0 gradi C°
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') x f 0.000 0.00000000 0.200 0.16265669 0.400 0.26103492 0.600 0.30988236 0.800 0.32232887 1.000 0.30955988 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 • » 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)