Title: 3a-4a lezione di laboratorio
13a-4a lezione di laboratorio
Laurea Specialistica in Ingegneria Matematica
a.a. 2006-2007
2m-file
File di testo contenente codici MATLAB. Consente
di memorizzare ed organizzare istruzioni e
comandi MATLAB
script
m-file
function
3m-file script
eps1.m - m-file per calcolare la precisione
di macchina num0 EPS1 while
(1EPS)gt1 EPSEPS/2 numnum1 tab(num,)num
EPS fprintf('3d 30.16e\n',...
tab(num,)) end EPStab(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 allinterno di M-file
- definire il formato di stampa
4Salvare e richiamare un m-script
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
- Richiamare Si richiama digitando solo il nome
con cui è stato memorizzato il file - eps1
- N.B. Lo script opera sul Workspace base.
5Risultati 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 num0 EPS1 while (1EPS)gt1
EPSEPS/2 numnum1 tab(num,)num EPS
fprintf('3d 30.16e \n',...
tab(num,)) end EPStab(end-1,2)
La variabile EPS è stata scelta con
lettere maiuscole per differenziarla dalla
variabile eps del Matlab .
6m-file function
function s fatt(c) fatt calcola il
fattoriale di c. s1 if cgt1 for i1c
ssi end end
7Salvare e Richiamare una m-function
- Si salva in modo analogo ad un m-script
nome_fun - Si richiama digitando unuguaglianza del
- tipoout1,out2,out3 nome_fun(in1,in2)
- out1,out2,out3 sono i parametri in uscita,
- in1,in2 sono i parametri in input
- valorefatt(5)
- N.B. La function
- accetta argomenti di input e di output
- opera su unarea di memoria distinta dal
Workspace base (variabili locali)
8Risultati della function fatt.m
numero 5 valorefatt(numero) valore
120
function s fatt(c) fatt calcola il
fattoriale del numero c usando la
definizione. s1 if cgt1 for i1c
ssi end end
Usando la function prod del Matlab, si può anche
calcolare il fattoriale di un numero
valoreprod(15) valore 120
Osservazione Esiste inoltre la function
factorial di Matlab che restituisce il
fattoriale di un numero (si faccia lhelp).
9Un secondo esempio di file function
function m media(v) MEDIA calcola la media
aritmetica di n numeri memorizzati nel
vettore v. nlength(v) m0 for i1n
mmv(i) end mm/n
v -3 0 4 5 6 media_armedia(v) media_ar
2.4000
Usando la function sum di Matlab si ottiene anche
la media v -3 0 4 5 6
media_arsum(v)/length(v) media_ar 2.4000
Osservazione Esiste la function mean di Matlab
che restituisce la media di n Numeri (si faccia
lhelp).
10Per 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 - C\Documents and Settings\studente\Document
i - 3. Scegliere, in Current Directory del
Matlab, - il percorso
- C\Documents and Settings\studente\Document
i - 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!!!!
11Funzioni 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
12Funzioni trigonometriche
x00.21' ysin(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
Langolo x deve essere espresso in
radianti!!! Esistono anche funzioni
trigonometriche che agiscono su angoli misurati
in gradi.
13ciclo for
for espressione istruzioni end
ESEMPIO N 4 for I 1N for J 1N
A(I,J) 1/(IJ-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 function hilb(N)
14Risultati
gtgt format rat gtgt 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 gtgt
15Esercizio 1 applicazione del ciclo for
- Scrivere un file script tale che, assegnate due
matrici con n3 e m3, - A13 46 79, B5 -6 -9 1 1 0 24 1 0,
- determini la matrice C delle stesse dimensioni,
che ha lelemento C(i,j) pari a - C(i,j)A(i,j)cos((ij)pi/(nm))B(i,j).
- N.B. Si salvi lo script col nome prova
16File prova.m
A13 46 79 B5 -6 -9 1 1 0 24 1
0 n,msize(A) for i 1n for j1m
C(i,j)A(i,j)cos((ij)pi/(nm))B(i,j)
end end disp('Il risultato è') disp(C)
17Risultati file prova.m
gtgtprova Il risultato è 3.5000 2.0000
7.5000 4.0000 4.5000 6.0000 -5.0000
7.1340 9.0000 gtgt
18Operatori relazionali e logici
Relazionali
Logici
Gli operatori relazionali precedono nellordine
gli operatori logici.
19ciclo while
while condizione_logica istruzioni end
Consente di ripetere le istruzioni sotto il
controllo di una condizione logica
ESEMPIO I1 N4 while I lt N J 1
while J lt N A(I,J) (IJ)
JJ1 end II1 end
20Risultati
gtgt A A 2 3 4 5 3 4
5 6 4 5 6 7 5 6
7 8 gtgt
Costruire con cicli while la matrice di Hilbert
4x4.
21Costrutto 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 chiave elseif, nel costrutto qui
presentato, va scritta senza spazio tra else
e if .
22Esempio
N4 for I1N for J1N if I J
A(I,J) N2 elseif IltJ
A(I,J) J else A(I,J) I
end end 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.
23Risultati
gtgt A A 16 2 3 4 2 16
3 4 3 3 16 4 4 4
4 16 gtgt
Lo studente verifichi che lo script precedente,
per N generico, costruisce una matrice simmetrica
che ha N2 su ogni elemento della diagonale
principale e il vettore vk1 N sulla
codiagonale k-esima (inferiore e superiore),
k1,,N-1.
24Comando di input
- input inserimento di variabili numeriche da
tastiera
Sintassi nome_varinput(str) str stringa che si
vuole compaia sul prompt
zinput(' Introduci il valore di z ')
Introduci il valore di z -12 z -12
ainput(' Introduci la matrice a ') Introduci
la matrice a 0 -1 0 35 -2ones(1,3) a
0 -1 0 3 4 5 -2 -2
-2
25Comando di input
- input inserimento di stringhe da tastiera
Sintassi var_strinput(str) oppure
var_strinput(str, 's') str stringa che compare
sul prompt
flaginput('Vuoi continuare? ') Vuoi
continuare? 'Si' flag Si flaginput('Vuoi
continuare? ', 's') Vuoi continuare? Si flag Si
26Comandi di output
- disp consente di stampare linee di testo e
valori di variabili.
Sintassi disp(str) str stringa o nome di una
variabile numerica che si vuole far comparire sul
prompt.
disp('valore della funzione') valore della
funzione
xsqrt(2) disp(x) 1.4142
disp('Il valore di x è ',num2str(x)) Il
valore di x è 1.4142
27Comandi 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_forma
to 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
28 temp31 fprintf('La temperatura è di 4.1f
gradi C\n',temp) La temperatura è di 31.0 gradi
C
29Come 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
30Esercizio 2
- Calcolare la funzione f e-xsin(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
31File funzione.m e risultati
x0.21 vettore riga fexp(-x).sin(x) tab
x ftab costruita per righe fprintf(' x
f\n') fprintf('6.3f 12.8f\n',tab)
Numero di formati pari alle righe della matrice
tab
32Esercizio 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.
33Soluzioni esercizio 3
- strIl 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. Ainput('inserisci la matrice A ')
- inserisci la matrice A -3ones(2,3)
-
- 3. finput('inserisci la funzione ')
- inserisci la funzione '4log(x)-7exp(-x)'
- f
- 4log(x)-7exp(-x)
34Presenza 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.2kx-3 ??? Error using gt
inline.feval Not enough inputs to inline
function. Error in gt fplot at 102 x xmin y
feval(fun,x,args4end) Error in gt
concatenaz_strin at 26 fplot(fs,-4 0)
clc clear all x(-40.50)' k4.50511 fs'x.2k
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.
35Espressione corretta della stringa fsda
utilizzare nel comando fplot
- ksnum2str(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.
36Valutazione di stringa
Programma stringhe
clc clear all x(-40.50)'format
long k4.50511 fs'x.2kx-3' feval(fs) format
short x f ksnum2str(k) è
unapprossimazione del valore a 4
decimali!!!!!! fs'x.2'
,ks,'x-3' feval(fs) x f
In questo caso la stringa è valutata correttamente
37Output del file stringhe
ks è una stringa che ha solo 4 cifre decimali
k 4.50511000000000 fs x.2kx-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.5051 fs x.24.5051x-3 ans
-4.0000 -5.0204 -3.5000 -6.5178 -3.0000
-7.5153 -2.5000 -8.0127 -2.0000
-8.0102 -1.5000 -7.5076 -1.0000
-6.5051 -0.5000 -5.0025 0 -3.0000
Lutilizzo di un valore approssimato per il
parametro ks, produce ovviamente valori
approssimati sulla quarta cifra decimale.
38Presenza di un parametro in una stringa un altro
caso di errore
function tabtabella(x,fs) feval(fs) tabx f
La funzione tabella non ha visibilità sul
parametro k.
clc clear all x(-40.50)' k4.50511 fs'x.2
kx-3' tabtabella(x,fs)
??? Error using gt eval Undefined function or
variable 'k'. Error in gt tabella at
2 feval(fs) Error in gt concatenaz_strin at
26 tabtabella(x,fs)
39Un modo per eliminare il problema è ancora
ricorrere allutilizzo del comando num2str
Con luso di num2str, la function non ha
problemi di visibilità su k perché k non è più un
parametro numerico.
function tabtabella(x,fs) feval(fs) tabx f
clc clear all x(-40.50)' k
4.50511 ksnum2str(k) fs'x.2',ks,'x-3' ta
btabella(x,fs)
tab -4.0000 -5.0204 -3.5000 -6.5178
-3.0000 -7.5153 -2.5000 -8.0127
-2.0000 -8.0102 -1.5000 -7.5076 -1.0000
-6.5051 -0.5000 -5.0025 0
-3.0000
40Altro modo di risolvere il problema
- function tabtabella(x,fs)
- global k
- feval(fs)
- tabx f
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
clc clear all global k x(-40.50)' k
4.50511 fs'x.2kx-3' tabtabella(x,fs)