3 a -4 a lezione di laboratorio Laurea Specialistica in Ingegneria Matematica Laurea Specialistica in Ingegneria Matematica a.a
m-file File di testo contenente codici MATLAB. Consente di memorizzare ed organizzare istruzioni e comandi MATLAB script function m-file
m-file script Standard ASCII file di testo Esegue una serie di comandi MATLAB sul workspace base Il carattere % è usato per: scrivere commenti allinterno di M-file definire il formato di stampa % 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) % 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) N.B. Lo script non accetta argomenti di input e di output
Salvare e richiamare un 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 un 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; tab(num,:)=[num EPS]; fprintf('%3d %30.16e \n',... tab(num,:)); end EPS=tab(end-1,2) % 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) » eps e e e-001 ………………… e e-016 » » eps e e e-001 ………………… e e-016 » La variabile EPS è stata scelta con lettere maiuscole per differenziarla dalla variabile eps del Matlab.
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
– Si salva in modo analogo ad un 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) Salvare e Richiamare una m-function
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 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 Risultati della function fatt.m » numero =5; » valore=fatt(numero) valore = 120 » » numero =5; » valore=fatt(numero) valore = 120 » Osservazione: Esiste inoltre la function factorial di Matlab che restituisce il fattoriale di un numero (si faccia lhelp). Usando la function prod del Matlab, si può anche calcolare il fattoriale di un numero: » valore=prod(1:5) valore = 120 » Usando la function prod del Matlab, si può anche calcolare il fattoriale di un numero: » valore=prod(1:5) valore = 120 »
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; 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 =[ ]; » media_ar=media(v) media_ar = » » v =[ ]; » media_ar=media(v) media_ar = » Usando la function sum di Matlab si ottiene anche la media : » v =[ ]; » media_ar=sum(v)/length(v) media_ar = » Usando la function sum di Matlab si ottiene anche la media : » v =[ ]; » media_ar=sum(v)/length(v) media_ar = » Osservazione: Esiste la function mean di Matlab che restituisce la media di n Numeri (si faccia lhelp).
Per utilizzare i file function sui 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. 2.Copiare perciò dalla cartella relativa al problema, la function che si vuole utilizzare nella directory di lavoro: 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 linput della function che si vuole utilizzare, dovrà essere salvato nella directory C:\Documents and Settings\studente\Documenti Buon lavoro!!!!
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:0.2:1]'; » y=sin(x); » [x y] ans = » x=[0:0.2:1]'; » y=sin(x); » [x y] ans = Langolo x deve essere espresso in radianti!!! Esistono anche funzioni trigonometriche che agiscono su angoli misurati in gradi.
ciclo for È simile a quello di altri linguaggi di programmazione Ripete le istruzioni molte volte Può essere annidato % ESEMPIO N = 4; for I = 1:N for J = 1:N A(I,J) = 1/(I+J-1); end % ESEMPIO N = 4; for I = 1:N for J = 1:N A(I,J) = 1/(I+J-1); end Osservazione: le istruzioni del ciclo su scritto consentono di costruire la matrice di Hilbert 4x4 che si può ottenere chiamando la function hilb(N) for espressione istruzioni end
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 >> >> 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=[ ; 1 1 0; ], determini la matrice C delle stesse dimensioni, che ha lelemento 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=[ ; 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 prova.m >>prova Il risultato è >> >>prova 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 % 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 % 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 while condizione_logica istruzioni end
Risultati >> A A = >> >> 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 if condizione_logica_1 istruzioni elseif condizione_logica_2 istruzioni … elseif condizione_logica_n istruzioni else istruzioni end N.B. La parola chiave elseif, nel costrutto qui presentato, va scritta senza spazio tra else e if. if condizione_logica istruzioni end
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 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 Questo script consente di costruire una matrice simmetrica che 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 = >> >> A A = >> 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 input : inserimento di variabili numeriche da tastiera » z=input(' Introduci il valore di z ') Introduci il valore di z -12 z = -12 » 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 = » a=input(' Introduci la matrice a ') Introduci la matrice a [0 -1 0; 3:5; -2*ones(1,3)] 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? ') Vuoi continuare? 'Si' flag = Si » 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 Sintassi: var_str=input(str) oppure 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 (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 ; %campo d è la scrittura per i numeri interi \n serve per andare a capo
» 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 floating point » fprintf( %13.10f\n ',pi) » fprintf( %18.10e\n ',pi) e+000 » fprintf( %13.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
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 -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. N.B. Si memorizzi il file col nome funzione
Numero di formati pari alle righe della matrice tab ; 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) 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) x f x f Risultati
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 1.» 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 è » 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) 1.» 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 è » 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 k = 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]) k = 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= 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 k in stringa e, di conseguenza, modificare la scrittura di fs. La presenza di un parametro in una stringa può talvolta essere causa di errore.
Espressione corretta della stringa fs da utilizzare nel 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.
clc clear all x=(-4:0.5:0)';format long k= fs='x.^2+k*x-3' f=eval(fs); format short [x f] ks=num2str(k) % è unapprossimazione del valore a 4 % decimali!!!!!! fs=['x.^2+',ks,'*x-3'] f=eval(fs); [x f] Programma stringhe: In questo caso la stringa è valutata correttamente Valutazione di stringa
Output del file stringhe k = fs = x.^2+k*x-3 ans = k = fs = x.^2+k*x-3 ans = ks = fs = x.^ *x-3 ans = ks = fs = x.^ *x-3 ans = ks è una stringa che ha solo 4 cifre decimali Lutilizzo di un valore approssimato per il parametro ks, produce ovviamente valori approssimati sulla quarta cifra decimale.
Presenza di un parametro in una stringa: un altro caso di errore clc clear all x=(-4:0.5:0)'; k= ; fs='x.^2+k*x-3'; tab=tabella(x,fs) function tab=tabella(x,fs) f=eval(fs); tab=[x f]; ??? 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) ??? 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) La funzione tabella non ha visibilità sul parametro k.
function tab=tabella(x,fs) f=eval(fs); tab=[x f]; clc clear all x=(-4:0.5:0)'; k= ; ks=num2str(k); fs=['x.^2+',ks,'*x-3']; tab=tabella(x,fs) Un modo per eliminare il problema è ancora ricorrere allutilizzo del comando num2str : tab = tab = Con luso di num2str, la function non ha problemi di visibilità su k perché k non è più un parametro numerico.
function tab=tabella(x,fs) global k f=eval(fs); tab=[x f]; Altro modo di risolvere il problema clc clear all global k x=(-4:0.5:0)'; k= ; fs=['x.^2+k*x-3']; tab=tabella(x,fs) tab =