400 likes | 508 Views
3 a -4 a lezione di laboratorio. Laurea Ingegneria CIVILE Lauree Specialistiche in Ingegneria CHIMICA, ELETTRONICA, AMBIENTE. a.a. 2007-2008. m-file. File di testo contenente codici MATLAB. Consente di memorizzare ed organizzare istruzioni e comandi MATLAB. script. m-file. function.
E N D
3a-4a lezione di laboratorio Laurea Ingegneria CIVILE Lauree Specialistiche in Ingegneria CHIMICA, ELETTRONICA, AMBIENTE a.a. 2007-2008
m-file File di testo contenente codici MATLAB. Consente di memorizzare ed organizzare istruzioni e comandi MATLAB script m-file 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; tab(num,:)=[num EPS]; fprintf('%3d %30.16e\n',... tab(num,:)); end EPS=tab(end-1,2) • Standard ASCII file di testo • Esegue una serie di comandi MATLAB sul workspace base N.B. Lo script non accetta argomenti di input e di output • Il carattere “ % “ è usato per: • scrivere commenti all’interno di M-file • definire il formato di stampa
Salvare e richiamare un m-script • Salvare un 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 » % eps1.m - m-file per % calcolare la precisione di % macchina num=0; EPS=1; while (1+EPS)>1 EPS=EPS/2; num=num+1; tab(num,:)=[num EPS]; fprintf('%3d %30.16e \n',... tab(num,:)); end EPS=tab(end-1,2) La variabile EPS è stata scelta con lettere maiuscole per differenziarla dalla variabile eps del Matlab .
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 una m-function • Si salva in modo analogo ad un 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 della function fatt.m » numero =5; » valore=fatt(numero) valore = 120 » function s = fatt(c) % % fatt calcola il fattoriale del numero c usando la definizione. % s=1; if c>=1 for i=1:c s=s*i; end end Usando la function prod del Matlab, si può anche calcolare il fattoriale di un numero: » valore=prod(1:5) valore = 120 » Osservazione: Esiste inoltre la function factorial di Matlab che restituisce il fattoriale di un numero (si faccia l’help).
Un secondo esempio di file function function m = media(v) % % MEDIA calcola la media % aritmetica di n numeri % memorizzati nel vettore v. % n=length(v); m=0; for i=1:n m=m+v(i); end m=m/n; » v =[-3 0 4 5 6]; » media_ar=media(v) media_ar = 2.4000 » Usando la function sum di Matlab si ottiene anche la media : » v =[-3 0 4 5 6]; » media_ar=sum(v)/length(v) media_ar = 2.4000 » Osservazione: Esiste la function mean di Matlab che restituisce la media di n Numeri (si faccia l’help).
Per utilizzare i file functionsui PC del laboratorio 1. Sul PC o sul floppy sono presenti le cartelle: Sis_lin, Eq_non_lin, Approx, ecc. che non devono essere modificate per alcun motivo. • Copiare perciò dalla cartella relativa al problema, la function che si vuole utilizzare nella directory di lavoro ad esempio: C:\Documents and Settings\studente\Documenti 3. Scegliere, in Current Directory del Matlab, il percorso: C:\Documents and Settings\studente\Documenti Il file che si sta creando nell’ editor e che talvolta contiene i dati per l’input della function che si vuole utilizzare, dovrà essere salvato nella directory C:\Documents and Settings\studente\Documenti Buon lavoro!!!!
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: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!!! Esistono anche funzioni trigonometriche che agiscono su angoli misurati in gradi.
ciclo for for espressione istruzioni end % ESEMPIO 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 Osservazione: le istruzioni del ciclo su scritto consentono di costruire la matrice di Hilbert 4x4 che si può ottenere chiamando la functionhilb(N)
Risultati >> format rat >> 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 >>
Esercizio 1: applicazione del ciclo for Scrivere un file script tale che, assegnate due matrici con n=3 e m=3, A=[1:3; 4:6; 7:9], B=[5 -6 -9; 1 1 0; 24 1 0], determini la matrice C delle stesse dimensioni, che ha l’elemento C(i,j) pari a: C(i,j)=A(i,j)+cos((i+j)*pi/(n+m))*B(i,j). N.B. Si salvi lo script col nome prova
File prova.m A=[1:3; 4:6; 7: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 prova.m >>prova 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 while condizione_logica istruzioni end Consente di ripetere le istruzioni sotto il controllo di una condizione logica % ESEMPIO 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 >> 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 if condizione_logica istruzioni end • È una struttura condizionale • Se una condizione è verificata esegue le istruzioni associate if condizione_logica_1 istruzioni elseif condizione_logica_2 istruzioni … elseif condizione_logica_n istruzioni else istruzioni end N.B. La parola chiaveelseif, nel costrutto qui presentato, va scritta senza spazio tra ‘else’ e ‘if ‘.
Esempio N=4; for I=1:N for J=1:N if I == J A(I,J) = N^2; elseif I<J A(I,J) = J; else A(I,J) = I; end end end Questo script consente di costruire una matrice simmetrica 4che ha tutti 4 ^2 sulla diagonale principale, il vettore [2 3 4] sulla prima codiagonale (inferiore e superiore), il vettore [3 4] sulla seconda codiagonale (inferiore e superiore) e gli elementi A(1,4) e A(4,1) uguali a 4.
Risultati >> A A = 16 2 3 4 2 16 3 4 3 3 16 4 4 4 4 16 >> Lo studente verifichi che lo script precedente, per N generico, costruisce una matrice simmetrica che ha N^2 su ogni elemento della diagonale principale e il vettore v=k+1: N sulla codiagonale k-esima (inferiore e superiore), k=1,…,N-1.
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 -12 z = -12 » a=input(' Introduci la matrice a ') Introduci la matrice a [0 -1 0; 3:5; -2*ones(1,3)] a = 0 -1 0 3 4 5 -2 -2 -2
Comando di input Sintassi:var_str=input(str) oppure var_str=input(str, 's') str: stringa che compare sul prompt input: inserimento di stringhe da tastiera » flag=input('Vuoi continuare? ') Vuoi continuare? 'Si' flag = Si » flag=input('Vuoi continuare? ', 's') 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 »x=sqrt(2); » disp(['Il valore di x è ',num2str(x)]) Il valore di x è 1.4142
Comandi di output Sintassi:fprintf(' formato \n', tab') fprintf consente di stampare linee di testo, valori numerici e matrici (tabelle) specificandone il formato. formato è una stringa contenente i formati scelti con la specifica f oppure e, per i formati virgola fissa o virgola mobile con la regola: %campo_totale.num_cifre_decimalitipo_formato I formati devono essere in numero pari alle colonne della matrice tab; %campodè la scrittura peri numeriinteri \nserve per andare a capo
%f consente la stampa dei numeri in fixed point, %e consente la stampa in floating point » fprintf(' %f\n',pi) 3.141593 Nei formati fed e il numero alla sinistradel punto è il campo totale, quello alladestraindica quantecifre decimali devono essere stampate » fprintf(’ %13.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°
Come visualizzare una tabella • Quesito: Perché è stato scritto tab'? • Risposta: Per stampare nel formato scelto, la matrice tab, che è stata costruita per colonne, così come si visualizza sul Command quando si digita tab. • N.B. Se la matrice tab fosse stata costruita per righein fprintf sarebbebastato porre semplicemente tab
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. • N.B. Si memorizzi il file col nome funzione
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 File funzione.m e risultati x=[0:.2:1]; % vettore riga f=exp(-x).*sin(x); tab=[x; f];%tab costruita per righe fprintf(' x f\n') fprintf('%6.3f %12.8f\n',tab) Numero di formati pari alle righe della matrice tab;
Esercizio 3 • Costruire una stringa che mostri il valore di • con 6 cifre decimali; utilizzare poi un comando di output per farlo 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 4ln(x)-7e-x.
Soluzioni esercizio 3 • » str=[‘Il valore di pi greco è ‘, • num2str(pi,7)]; % il secondo numero in • % parentesi rappresenta il numero massimo di • % cifre significative con cui si vuole • % rappresentare pi • » disp(str) • Il valore di pi greco è 3.141593 • 2. » A=input('inserisci la matrice A = '); • inserisci la matrice A = -3*ones(2,3) • » • 3. » f=input('inserisci la funzione ') • inserisci la funzione '4*log(x)-7*exp(-x)' • » f = • 4*log(x)-7*exp(-x)
Presenza di un parametro in una stringa La presenza di un parametro in una stringa può talvolta essere causa di errore. k = 4.5051 fs = x.^2+k*x-3 ??? Error using ==> inline.feval Not enough inputs to inline function. Error in ==> fplot at 102 x = xmin; y = feval(fun,x,args{4:end}); Error in ==> concatenaz_strin at 26 fplot(fs,[-4 0]) clc clear all x=(-4:0.5:0)'; k=4.50511 fs='x.^2+k*x-3' fplot(fs,[-4 0]) La presenza di un parametro nella stringa fs produce errore nel comando fplot. Occorre trasformare il valore numerico di kin stringa e, di conseguenza, modificare la scrittura di fs.
Espressione corretta della stringa fsda utilizzarenel comando fplot ks=num2str(k) % ks è la stringa '4.5051' (il valore di k è % arrotondato con 4 decimali) fs=['x.^2+',ks,'*x-3'] % fs è ottenuta come concatenazione di stringhe fplot(fs,[-4 0]) Nota Bene: Il comando num2str(k) trasforma k in una stringa di cifre (le stesse cifre di k) con 4 cifre decimali.
Valutazione di stringa Programma stringhe: clc clear all x=(-4:0.5:0)';format long k=4.50511 fs='x.^2+k*x-3' f=eval(fs); format short [x f] ks=num2str(k); fs=['x.^2+',ks,'*x-3'];f=eval(fs);[x f] ks=num2str(k, '%10.5f')% così prende tutte le cifre di k fs=['x.^2+',ks,'*x-3']; f=eval(fs); [x f] In questo caso la stringa è valutata correttamente
Output del file stringhe k = 4.50511000000000 fs = x.^2+k*x-3 ans = -4.0000 -5.0204 -3.5000 -6.5179 -3.0000 -7.5153 -2.5000 -8.0128 -2.0000 -8.0102 -1.5000 -7.5077 -1.0000 -6.5051 -0.5000 -5.0026 0 -3.0000 ks = 4.50511 fs = x.^2+4.50511*x-3 ans = -4.0000 -5.0204 -3.5000 -6.5179 -3.0000 -7.5153 -2.5000 -8.0128 -2.0000 -8.0102 -1.5000 -7.5077 -1.0000 -6.5051 -0.5000 -5.0026 0 -3.0000
Presenza di un parametro in una stringa: un altro caso di errore function tab=tabella(x,fs) f=eval(fs); tab=[x f]; La funzione tabella non ha visibilità sul parametro k. clc clear all x=(-4:0.5:0)'; k=4.50511; fs='x.^2+k*x-3'; tab=tabella(x,fs) ??? Error using ==> eval Undefined function or variable 'k'. Error in ==> tabella at 2 f=eval(fs) Error in ==> concatenaz_strin at 26 tab=tabella(x,fs)
Un modo per eliminare il problema è ancora ricorrere all’utilizzo del comando num2str: Con l’uso di num2str, la function non ha problemi di visibilità su k perché k non è più un parametro numerico. function tab=tabella(x,fs) f=eval(fs); tab=[x f]; clc clear all x=(-4:0.5:0)'; k= 4.50511; ks=num2str(k, '%10.5f'); fs=['x.^2+',ks,'*x-3']; tab=tabella(x,fs) tab = -4.0000 -5.0204 -3.5000 -6.5179 -3.0000 -7.5153 -2.5000 -8.0128 -2.0000 -8.0102 -1.5000 -7.5077 -1.0000 -6.5051 -0.5000 -5.0026 0 -3.0000
Altro modo di risolvere il problema tab = -4.0000 -5.0204 -3.5000 -6.5179 -3.0000 -7.5153 -2.5000 -8.0128 -2.0000 -8.0102 -1.5000 -7.5077 -1.0000 -6.5051 -0.5000 -5.0026 0 -3.0000 function tab=tabella(x,fs) global k f=eval(fs); tab=[x f]; clc clear all global k x=(-4:0.5:0)'; k= 4.50511; fs=['x.^2+k*x-3']; tab=tabella(x,fs)