a a 3 4 lezione di laboratorio Laurea
a a 3 -4 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 m-file script function
m-file script • Standard ASCII file di testo • Esegue una serie di comandi MATLAB sul workspace base % eps 1. 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('%3 d %30. 16 en', . . . tab(num, : )); end EPS=tab(end-1, 2) N. B. Lo script non Il carattere “ % “ è usato per: accetta argomenti • scrivere commenti all’interno di M di input e di output -file • definire il formato di stampa
Salvare e richiamare un m-script Salvare un 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: eps 1 Richiamare: Si richiama digitando solo il nome con cui è stato memorizzato il file eps 1 N. B. Lo script opera sul Workspace base.
Risultati del file eps 1. m % eps 1. 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('%3 d %30. 16 e n', . . . tab(num, : )); end EPS=tab(end-1, 2) » eps 1 1 5. 00000000 e-001 2 2. 500000000 e-001 3 1. 250000000 e-001 ………………… 52 2. 2204460492503131 e-016 53 1. 1102230246251565 e-016 » La variabile EPS è stata scelta con lettere maiuscole per differenziarla dalla variabile eps del Matlab.
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 Caso generale function [out 1, out 2, out 3] = nome_fun(in 1, in 2)
Salvare e Richiamare una m-function – Si salva in modo analogo ad un m-script: nome_fun – Si richiama digitando un’uguaglianza del tipo: [out 1, out 2, out 3] = nome_fun(in 1, in 2) – out 1, out 2, out 3 sono i parametri in uscita, – in 1, in 2 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 della function fatt. m » numero =5; » valore=fatt(numero) function s = fatt(c) valore = % 120 % fatt calcola il fattoriale » del numero c usando la definizione. % s=1; if c>=1 for i=1: c s=s*i; Usando la function prod del Matlab, end si può anche calcolare il fattoriale end di un numero: » valore=prod(1: 5) Osservazione: Esiste inoltre la valore = 120 function factorial di Matlab » che restituisce il fattoriale di un numero (si faccia l’help).
Un secondo esempio di file function m = media(v) » v =[-3 0 4 5 6]; % » media_ar=media(v) % MEDIA calcola la media_ar = % aritmetica di n numeri 2. 4000 % memorizzati nel vettore v. » % n=length(v); m=0; for i=1: n m=m+v(i); end Usando la function sum m=m/n; di Matlab si ottiene anche la Osservazione: Esiste la function mean di Matlab che restituisce la media di n Numeri (si faccia l’help). media : » v =[-3 0 4 5 6]; » media_ar=sum(v)/length(v) media_ar = 2. 4000 »
Per utilizzare i file function sui PC del laboratorio Sul PC o sul floppy sono presenti le cartelle: Sis_lin, Eq_non_lin, Approx, ecc. che non devono essere modificate per alcun motivo. 2. Copiare perciò dalla cartella relativa al problema, la function che si vuole utilizzare nella directory di lavoro ad esempio: C: Documents and SettingsstudenteDocumenti 3. Scegliere, in Current Directory del Matlab, il percorso: C: Documents and SettingsstudenteDocumenti 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 SettingsstudenteDocumenti Buon lavoro!!!! 1.
Funzioni matematiche elementari » x=[-1. 9 -0. 2 3. 4 5. 6 7. 0] » 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 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 agiscono su angoli misurati in gradi.
ciclo for % ESEMPIO N = 4; for I = 1: N for J = 1: N A(I, J) = 1/(I+J-1); end for espressione istruzioni 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 4 x 4 che si può ottenere chiamando la function
Risultati >> format rat >> A A = 1 1/2 1/3 1/4 >> 1/2 1/3 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 disp('Il risultato è') disp(C)
Risultati file prova. m >>prova Il risultato è 3. 5000 2. 0000 4. 5000 -5. 0000 7. 1340 >> 7. 5000 6. 0000 9. 0000
Operatori relazionali e logici Relazionali Logici Gli operatori relazionali precedono nell’ordine gli operatori logici.
ciclo 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 6 7 8 >> Costruire con cicli while la matrice di Hilbert 4 x 4.
Costrutto if - else • È una struttura condizionale • Se una condizione è verificata esegue le istruzioni associate if condizione_logica istruzioni end if condizione_logica_1 istruzioni elseif condizione_logica_2 istruzioni … elseif condizione_logica_n N. B. La parola chiave elseif, nel costrutto qui presentato, istruzioni va scritta senza spazio tra else ‘else’ e ‘if ‘. istruzioni end
Esempio Questo script consente di N=4; for I=1: N costruire una matrice for J=1: N simmetrica 4 che ha tutti 4 ^2 sulla diagonale principale, il vettore [2 3 4] sulla prima codiagonale (inferiore e superiore), il vettore end [3 4] sulla seconda end codiagonale (inferiore e superiore) e gli elementi A(1, 4) e A(4, 1) uguali a 4. if I == J A(I, J) = N^2; elseif I<J A(I, J) = J; else A(I, J) = I; end
Risultati >> A A = 16 2 3 4 2 16 3 4 3 3 16 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: 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 -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: inserimento di stringhe da tastiera Sintassi: var_str=input(str) oppure var_str=input(str, 's') str: stringa che compare sul prompt » flag=input('Vuoi continuare? ') Vuoi continuare? 'Si' flag = Si » flag=input('Vuoi continuare? ', 's') Vuoi continuare? Si flag = Si
Comandi di output disp consente di stampare linee di testo e valori di variabili. Sintassi: disp(str) stringa o nome di una variabile numerica che si vuole far comparire sul prompt. » disp('valore della funzione') valore della funzione num 2 str(x) converte lo scalare x in una » x=sqrt(2); » disp(['Il valore di x stringa di Il valore di x è 1. 4142 caratteri » x=sqrt(2); » disp(x) 1. 4142 è ', num 2 str(x)])
Comandi di output fprintf consente di stampare linee di testo, valori numerici e matrici (tabelle) specificandone il formato. Sintassi: fprintf(' formato n', tab' ) 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 per i numeri interi n serve per andare a capo
» temp=31; » fprintf('La temperatura è di %4. 1 f 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 floating point 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(' %fn', pi) 3. 141593 » fprintf(’ %13. 10 fn ', pi) 3. 1415926536 » fprintf(’ %18. 10 en ', pi) 3. 1415926536 e+000
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 righe in fprintf sarebbe bastato 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
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 fn') fprintf('%6. 3 f %12. 8 fn', tab) Numero di formati pari alle righe della matrice tab; Risultati x 0. 000 0. 200 0. 400 0. 600 0. 800 1. 000 f 0. 0000 0. 16265669 0. 26103492 0. 30988236 0. 32232887 0. 30955988
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 4 ln(x)-7 e-x.
Soluzioni esercizio 3 1. » str=[‘Il valore di pi greco è ‘, num 2 str(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 clc clear all x=(-4: 0. 5: 0)'; k=4. 50511 fs='x. ^2+k*x-3' fplot(fs, [-4 0]) ? ? ? 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]) La presenza di un parametro nella stringa fs produce errore nel comando fplot. Occorre trasformare il valore numerico di k in stringa e, di conseguenza, modificare la scrittura di fs.
Espressione corretta della stringa fs da utilizzare nel comando fplot ks=num 2 str(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 num 2 str(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 In questo caso la stringa x=(-4: 0. 5: 0)'; format long è valutata correttamente k=4. 50511 fs='x. ^2+k*x-3' f=eval(fs); format short [x f] ks=num 2 str(k); fs=['x. ^2+', ks, '*x-3']; f=eval(fs); [x f] ks=num 2 str(k, '%10. 5 f')% così prende tutte le cifre di k fs=['x. ^2+', ks, '*x-3']; f=eval(fs); [x f]
Output del file stringhe k = 4. 5051100000 fs = x. ^2+k*x-3 ks = 4. 50511 fs = x. ^2+4. 50511*x-3 ans = -4. 0000 -3. 5000 -3. 0000 -2. 5000 -2. 0000 -1. 5000 -1. 0000 -0. 5000 0 -5. 0204 -6. 5179 -7. 5153 -8. 0128 -8. 0102 -7. 5077 -6. 5051 -5. 0026 -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]; clc clear all x=(-4: 0. 5: 0)'; k=4. 50511; fs='x. ^2+k*x-3'; tab=tabella(x, fs) La funzione tabella non ha visibilità sul parametro k. ? ? ? 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 num 2 str: Con l’uso di num 2 str, la function tab=tabella(x, fs) function non ha problemi f=eval(fs); di visibilità su k perché k non tab=[x f]; è più un parametro numerico. clc clear all x=(-4: 0. 5: 0)'; k= 4. 50511; ks=num 2 str(k, '%10. 5 f'); fs=['x. ^2+', ks, '*x-3']; tab=tabella(x, fs) tab = -4. 0000 -3. 5000 -3. 0000 -2. 5000 -2. 0000 -1. 5000 -1. 0000 -0. 5000 0 -5. 0204 -6. 5179 -7. 5153 -8. 0128 -8. 0102 -7. 5077 -6. 5051 -5. 0026 -3. 0000
Altro modo di risolvere il problema 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) tab = -4. 0000 -3. 5000 -3. 0000 -2. 5000 -2. 0000 -1. 5000 -1. 0000 -0. 5000 0 -5. 0204 -6. 5179 -7. 5153 -8. 0128 -8. 0102 -7. 5077 -6. 5051 -5. 0026 -3. 0000
- Slides: 40