Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. INTRODUZIONE AL MATLAB
La schermata
Sulla schermata iniziale del Matlab, definita desktop, sono disponibili 4 finestre (windows) principali:
• la command window dove si possono eseguire direttamente i comandi e dove appaiono i risultati e le segnalazioni del
programma (errori di esecuzione, avvisi ecc..);
• il workspace dove sono riportate le caratteristiche di tutte le variabili memorizzate dal Matlab a seguito delle elaborazioni,
cioè nomi, tipo, dimensioni, spazio di memoria occupato, ecc…;
• la current directory dove sono riportati tutti i file matlab presenti nella directory utilizzata dal Matlab in quel momento;
• la command history che contiene tutti i comandi che sono stati eseguiti durante la sessione.
Queste finestre possono essere richiamate dal menù desktop. In caso di problemi di visualizzazione delle 4 finestre, accedere
al menù desktop, selezionare il sottomenù desktop layout, selezionare l’opzione default.
Uso diretto
• Sulla command window appare il prompt del matlab, cioè il simbolo >>.
• Nell’uso diretto si digitano i comandi accanto al prompt separati da “,” (virgola) o “;” (punto e virgola)
[es: >>x=3.14;sin(x)].
• Per eseguire il comando si preme il tasto invio.
• Se si pone “;” alla fine del comando, il risultato non viene visualizzato.
• È possibile usare il tasto “↑” per visualizzare accanto al prompt le istruzioni già eseguite, modificarle ed eseguirle
nuovamente.
Uso mediante programmi, script e funzioni
• I programmi sono sequenze di istruzioni aventi lo scopo di eseguire elaborazioni matematiche complesse.
• In programmi matlab vengono scritti come file di testo e salvati assegnando un nome e l’estensione “.m”: i “file m”.
• Il nome del file deve iniziare con una lettera, non deve contenere spazi, non deve contenere vocali accentate !!!!!!.
• È opportuno assegnare un nome che ricordi la funzione svolta dal programma.
• Per scrivere i programmi è opportuno utilizzare l’apposito editor che consente anche di eseguire l’intero programma (dal
menù debug mediante il comando run) o singole righe di istruzioni (selezionandole con il mouse e premendo F9 oppure
tasto destro, evaluate selection).
• Durante e al termine della scrittura i programmi devono essere salvati in una directory creata dall’utente.
• Per eseguire il programma di solito è necessario che la current directory del Matlab sia quella nella quale il programma è
salvato. Per settare la current directory si può utizzare la finestra current directory window.
• In alternativa si può forzare il Matlab a cercare comunque in alcune directory scelte dall’utente utilizzando il sottomenù Set
Path del menù File.
• I file m sono di 2 tipi: script e functions.
• Gli script possono essere eseguiti mediante il comando run dell’editor, oppure digitando il nome dello script sulla
command window e premendo il tasto invio (se il programma è presente nella current directory), oppure scrivendone il
nome in un altro script, cosa utile per separare un programma in più script.
• Le functions servono ad aggiungere nuovi comandi al matlab e possono essere eseguite dal prompt o richiamate da uno
script esattamente come si usano i comandi già disponibili del matlab (vedi sezione Le funzioni del matlab).
Variabili
Nei problemi matematici vengono elaborati dati numerici “contenuti” nelle variabili.
• Nel matlab i nomi delle variabili:
sono costituiti da lettere e numeri, [es: x, y, xy, x1, x2, alfa, A, B, pippo, pluto, cicciolina],
devono iniziare con delle lettere,
le lettere maiuscole e minuscole sono considerate differenti, [es: A ed a sono di variabili differenti],
i nomi non devono essere uguali a funzioni del matlab (in tal caso la funzione diviene inutilizzabile nella sessione),
è opportuno assegnare alle variabili dei nomi brevi, che richiamino la grandezza che rappresentano, ad esempio x
o x1 ad una ascissa, y o Y ad una ordinata, tau ad una tensione tangenziale, sx alla σx, ecc… .
• Prima di essere utilizzate, le variabili devono essere inizializzate, cioè deve essere fatto assumere loro un valore numerico.
L’inizializzazione viene effettuata mediante l’operatore di assegnazione “=”.
Es: >>a=1; x=2.7;y=a*x;
oppure mediante funzioni che creano variabili (ad esempio zeros che crea matrici di 0, ones che crea matrici di 1, linspace e
meshgrid, che creano matrici con numeri equispaziati, rand che crea matrici con numeri random).
• Nel Matlab si utilizzano diverse classi di variabili, le principali sono 4: 3 di tipo numerico e una di tipo stringa.
Le variabili numeriche più utilizzate appartengono alle classi double, uint8 e logical.
I double sono i numeri in doppia precisione, utili a rappresentare i numeri reali, sui quali è possibile eseguire tutte le
operazioni matematiche.
Gli uint8 sono numeri interi ad 8 bit unsigned (senza segno), utili a rappresentare numeri interi compresi tra 0 e 255,
sui quali non è possibile compiere operazioni matematiche, adatti alla memorizzazione di numerose immagini.
I logical sono numeri che assumono il valore 0 o il valore 1.
Il Matlab considera le variabili introdotte dall’utente come double, carica le immagini come uint8. Le logical sono
utilizzate per accedere ad elementi di matrici. Esistono apposite funzioni per convertire le variabili nei tre formati.
1
G. Petrucci “Complementi di Costruzione di Macchine”
Le variabili stringa servono a memorizzare parole e caratteri e sono utili per la gestione dei nomi dei file di dati e
immagini da caricare e/o salvare, per scrivere messaggi sullo schermo, per scegliere le opzioni in alcune funzioni matlab
che lo prevedono. Si introducono ponendo la parola tra apici ' ' - es: >>n='nome.bmp';
Vettori, matrici, cell arrays
• Le variabili generalmente sono in forma di vettori e matrici, ovvero arrays.
• I vettori sono arrays a una sola dimensione, cioè una riga o una colonna. Le matrici possono avere più di 2 dimensioni. [es:
il tensore σ è una matrice 3x3, se si vuole valutare in 10x10x10 punti nello spazio xyz si può utilizzare una matrice a 5
dimensioni 3x3x10x10x10].
• Gli elementi di una matrice vengono introdotti ponendoli entro parentesi quadre separati da spazi o virgole, mentre le
righe vanno separate con il punto e virgola - es: >>a=[1 2 3; 4 5 6].
• Per richiamare i singoli elementi di una matrice si possono utilizzare gli usuali indici riga-colonna, detti anche indici
multipli, posti entro parentesi tonde separati da virgole - es: >>a(2,2), s(1,2,5,7,1).
• Per richiamare i singoli elementi di una matrice possono essere utilizzati anche gli indici lineari, che permettono di
identificare gli elementi della matrice con un unico numero - es: >>[a(1), a (2), a(3), a(4), a(5), a(6)]. Gli indici lineari sono
gli indici che identificano gli elementi di un vettore colonna ottenuto disponendo consecutivamente le colonne della matrice
originaria.
• Si possono creare matrici di matrici, cioè matrici ciascun elemento delle quali è, a sua volta, una matrice: i cosiddetti cell
array. Per esempio: il tensore σ è una matrice 3x3, se si vuole valutare in 10x10x10 punti nello spazio xyz si può utilizzare
un cell array costituito da 10x10x10 matrici 3x3. Gli indici multipli per individuare il singolo array devono essere posti tra
parentesi graffe, gli indici necessari ad identificare il singolo elemento vanno posti tra le consuete parentesi tonde - es.:
>>s{2,2,5}(1,1); identifica l’elemento (1,1) del tensore relativo al punto cui sono stati attribuiti gli indici {2,2,5}. I cell
array sono utili, ad esempio, per elaborare più immagini, considerando ciascuna immagine come uno degli array che
costituisce il cell array – es: >>IM{i}(y,x) permette di accedere al pixel di coordinate x,y nell’immagine contenuta
nell’elemento i del cell array IM. Una caratteristica importante del cell array è che le matrici che lo costituiscono possono
avere dimensioni diverse tra loro.
• Gli indici delle matrici e dei vettori devono essere numeri interi. Se i valori degli indici vengono determinati con
operazioni di calcolo, come accade per le coordinate degli elementi di una immagine, devono essere trasformati in interi, ad
esempio mediante l’istruzione round, prima di essere utilizzati per accedere all’elemento della matrice. Per accedere
all’ultimo elemento di un array è possibile utilizzare il termine end. Ad es. >>x=a(end) pone x uguale all’ultimo elemento
del vettore a. Per selezionare tutti gli elementi di una riga o di una colonna, si utilizza l’operatore “:” che fa scorrere gli
indici - es.: >>x=[ 1 2 3; 4 5 6; 7 8 9]; >>x(3,:) restituisce la terza riga, mentre >>x(:,2) restituisce la seconda colonna.
• In molti calcoli sugli arrays, il prodotto *, la divisione / e l’elevazione a potenza ^, devono essere eseguite elemento per
elemento e non con le regole del calcolo matriciale. Ad esempio, per calcolare la funzione y=x^2 nel campo 0<x<10, si
deve creare un array x che contiene i valori dell’ascissa e applicare l’elevazione a potenza a ciascun elemento.
Quest'operazione è differente dall’elevazione al quadrato matriciale, che consiste nella moltiplicazione della matrice per se
stessa. Per specificare che l’operazione deve essere eseguita elemento per elemento, l’operatore matematico deve essere
preceduto dal punto, cioè .*, ./, .^. La regola non è necessaria per somma e sottrazione in quanto le operazioni matriciali
stesse sono eseguite elemento per elemento.
Le funzioni del matlab
• Il Matlab comprende centinaia di funzioni che eseguono operazioni di vario tipo sulle variabili.
• Ciascuna funzione ha un nome ben preciso [es: sin esegue l’istruzione seno, max determina il massimo in un array].
• La funzione riceve uno o più dati di ingresso posti tra parentesi tonde alla fine del nome e separati da una virgola;
• i dati di ingresso di una funzione possono essere costanti o arrays di costanti, Es: >>sin(3.14); >>sin([0 1.57 3.14])
oppure variabili, Es: >>sin(x)
• La funzione restituisce uno o più dati in uscita che possono essere visualizzati o memorizzati in variabili
Es: >>y=sin(3.14), z=cos(x)
• Se le variabili in uscita sono più di una, devono essere poste tra parentesi quadre e separate da virgola
Es: >> [dx,dy]=gradient(I);
• Per utilizzare una funzione in matlab bisogna prestare attenzione a:
1. quali operazioni effettua,
2. il nome esatto,
3. quante variabili vuole in ingresso e di che tipo,
4. quante variabili restituisce e di che tipo.
Il matlab opera per colonne
• Quando una funzione del Matlab elabora l’insieme di dati contenuto un array:
se l’array possiede più di una dimensione, l’elaborazione viene eseguita su ciascuna colonna e viene restituito un
vettore ciascun elemento del quale è il risultato dell’operazione effettuata su ciascuna colonna;
se l’array possiede una sola dimensione, cioè è una riga o una colonna, l’elaborazione viene eseguita su tutti gli
elementi e viene restituito un solo valore.
Ad esempio, se l’array di ingresso è monodimensionale la funzione max() restituisce il massimo assoluto dell’array, se l’array
di ingresso è bidimensionale, restituisce un’array riga i cui elementi sono i massimi relativi a ciascuna colonna. Ad esempio:
>>a=[1 5; 7 2];m=max(a); restituisce [5 7]. Se si desidera che una funzione operi su tutti gli elementi dell’array, si può
utilizzare l’operatore “:”. Ad esempio >>a=[1 5; 7 2];m=max(a(:)); restituisce 7.
2
G. Petrucci “Complementi di Costruzione di Macchine”
Nella realizzazione di un programma è opportuno ridurre i dati di ingresso al minimo indispensabile, facendo eseguire al
programma tutti i calcoli. È opportuno che le prime istruzioni del programma siano costituite proprio dall'assegnazione dei dati
di ingresso del problema.
Tipicamente si assegnano valori a costanti e a matrici/vettori con l'operatore “=”.
beta=0.5;
pe=100;
I numeri delle matrici devono essere posti entro parentesi quadra. Gli elementi di una riga devono essere separati da spazi o
virgole, mentre le righe da punto e virgola.
s=[100 0 0; 0 -100 0; 0 0 0];
In alcuni casi è opportuno utilizzare come dati di ingresso i dati ottenuti con un altro programma. I dati elaborati dal primo
programma possono essere salvati in un file con l’istruzione “save”
save DisUnRes0 SrE SrI ht rt mu ni w
I dati possono essere poi caricati dal file mediante l’istruzione “load”
load DisUnRes0
Le variabili all'interno del programma utilizzatore assumono gli stessi nomi che avevano quando sono state salvate.
È possibile separare la parte del programma che effettua i calcoli da quella che effettua l'inizializzazione del problema. In
questo caso per ogni problema si realizza uno script con l'inizializzazione dei dati e ciascuno di essi richiama l'unico script che
esegue i calcoli. Per eseguire uno script all'interno di un altro script è sufficiente scriverne il nome in una riga.
Nel caso delle funzioni di 2 variabili, cioè del tipo z=f(x,y), il campo di definizione è costituito da un'area rettangolare con
punti di coordinate x e y, invece che da un semplice segmento di coordinate x. In questo caso la discretizzazione del campo di
definizione della funzione deve essere effettuata mediante 2 matrici contenenti le coordinate x e y. La determinazione delle
matrici di coordinate può essere effettuata mediante la funzione “meshgrid” la quale richiede come dato di ingresso 2 vettori
contenenti la discretizzazione lungo le due coordinate, ad esempio:
a=500;b=400;xd=linspace(0,a,101); yd=linspace(0,b,81);[x,y]=meshgrid(xd,yd);
oppure
dx=5;dy=5;[x,y]=meshgrid(0:dx:a,0:dy:b);
sl=ones(1,100)*sl;
sl=zeros(1,100)+sl;
sl=repmat(sl,[1 100]);
Se nel programma sono presenti matrici i cui elementi devono essere calcolati singolarmente è opportuno inizializzarle
creandole come matrici di zeri mediante l'istruzione “zeros” affinché il matlab possa organizzare lo spazio in memoria:
w=zeros(100,100); Mx=zeros(100,100); My=zeros(100,100);
3
G. Petrucci “Complementi di Costruzione di Macchine”
Un altro modo di accedere ad elementi di arrays è costituito dall'uso di arrays di tipo logical. Ad esempio, volendo porre a zero
i valori del vettore M minori di 0 o porre pari ad xmax i valori del vettore E che superano xmax si può scrivere:
i=M<0;M(i)=0; oppure direttamente M(M<0)=0;
i=E>xmax;E(i)=xmax; oppure direttamente E(E>xmax)=xmax
i=M<0 e i=E>xmax sono arrays delle stesse dimensioni di M ed E, con valori logical pari a 1 se la condizione è verificata e 0
dove non è verificata.
Per condizioni più complesse possono essere utilizzati diversi operatori relazionali (<,>,<=,>=,==) e logici (&,| cioè
and, or);. Ad esempio, per porre pari a 0 elementi della matrice A che si trovano al di fuori dell'intervallo 10<x<20 o
all'interno dell'intervallo 10<x<20 si può scrivere rispettivamente:
i=A<10 | A>20;A(i)=0; oppure direttamente A(A<10 | A>20)=0; (al di fuori dell'intervallo)
i=A>10 & A<20;A(i)=1; oppure direttamente A(A>10 & A<20)=1; ; (all'interno dell'intervallo)
Per cancellare gli elementi di una matrice si utilizzano i vettori vuoti "[]" con espressioni di questo tipo:
D(D==0)=[] D(D>1)=[]
Per determinare gli indici di una matrice nei quali è verificata una certa condizione, si può utilizzare la funzione “find”:
TM=max(TA); i=find(TA>.99*TM);
Da notare che i=find(A>100) restituisce un vettore i contenente i soli indici lineari dove è verificata la condizione,
mentre i=A>100 restituisce un array delle stesse dimensioni di A con valori logical 0 o 1.
I calcoli
I calcoli vengono effettuati mediante gli operatori matematici “+,−,*,/,^”, o mediante funzioni di calcolo del Matlab (sin, cos,
exp, eig, trapz ecc..), o funzioni di calcolo appositamente realizzate.
L’ordine delle operazioni elementari è: prima la potenza, poi il prodotto/diviso, poi somma/sottrazione, cioè:
1)^, 2)*/, 3)+−.
es.
x= 2*3^4*5 + 5=(2*(3^4)*5)+5
Se si vogliono effettuare operazioni sui singoli elementi di una matrice o di un vettore, agli operatori *,/,^ deve essere
anteposto il punto “.”.
Le operazioni elemento per elemento sono generalmente usate per determinare i valori delle funzioni nelle quali le variabili
indipendenti vengono rappresentate come vettori.
Ad esempio, per calcolare la funzione σr(ρ)
1− ρ 2 β2
σr = − pi (1)
ρ2 1− β 2
definita nel campo β≤ρ≤1, nel caso di β=0.625 e volendo suddividere l'intervallo in 100 punti, si può scrivere:
beta=0.625;b2=beta^2;
ro=linspace(beta,1,100);ro2=ro.^2;
sr=-(1-ro2)./ro2*b2/(1-b2)*pi
Le funzioni trigonometriche di base del Matlab (sin=seno, cos, tan, cot, asin, acos, atan, ecc.) utilizzano gli
angoli espressi in radianti; è possibile utilizzare i gradi con le analoghe funzioni aventi la lettera d aggiunta alla fine (sind,
cosd, tand, ecc).
4
G. Petrucci “Complementi di Costruzione di Macchine”
Se in un’equazione compare più volte una variabile elevata a potenza o il seno di una funzione, può essere opportuno
assegnare a una nuova variabile il valore calcolato. Ad esempio, nel caso di
L'esecuzione condizionata può essere effettuata mediante le istruzioni “if... elseif ...else....end” o mediante l'istruzione
“switch.... case... end”.
La prima istruzione è adatta per fare in modo che vengano eseguite istruzioni se sono verificate condizioni ottenute
mediante operatori relazionali (<,>,==,>=, <=) e/o logici (&, |).
L=length(ft)
if L==2
n=...
elseif L>2 & L<10
n=...
end
La seconda istruzione è adatta al caso semplice in cui devono essere eseguite alcune istruzioni in funzione del valore
assunto da una variabile.
L=length(fz)
switch (L)
case 1; istruzioni….
case 3;…istruzioni…
case 5;…istruzioni.
otherwise; istruzioni…
end
L'iterazione di un gruppo di istruzioni può essere effettuata mediante l'istruzione for... end o mediante l'istruzione while...
end.
Durante le iterazioni è solitamente necessario:
1) tenere presente il numero dell'iterazione in corso mediante una variabile contatore,
2) fare variare opportunamente le grandezze in gioco in base al numero dell'iterazione utilizzando il contatore,
3) memorizzare i risultati ottenuti durante l'iterazione in apposite matrici, utilizzando il contatore come indice
dell'elemento della matrice da aggiornare.
L'istruzione for... end è adatta al caso in cui è noto a priori il numero di iterazioni che devono essere effettuate. Ad esempio,
nel caso della determinazioni delle deformazioni di un materiale ortotropo al variare dell'angolo α tra 0 e 90 gradi, utilizzando
un passo pari ad 1 grado il numero di iterazioni è 91:
s=[100 0 0]';alfa=deg2rad(0:90);n=length(alfa);
for i=1:n;
al=alfa(i); c=cos(al); s=sin(al)
Cxy=....
e=Cxy*s;
ex(i)=e(1);ey(i)=e(2);gxy(i)=e(3);
end
Nell'esempio il ruolo di contatore è assolto dalla variabile i. L'angolo α varia tra 0 e 90 gradi e, in questo caso, è posto in
funzione del contatore scrivendo semplicemente al=alfa(i), le deformazioni εx, εy e γxy ottenute mediante il prodotto
matriciale e=Cxy*s per ogni valore di α vengono memorizzate nei vettori ex, ey e gxy, utilizzando come indice il contatore i.
5
G. Petrucci “Complementi di Costruzione di Macchine”
L' istruzione while... end è adatta al caso in cui le iterazioni devono essere effettuate mentre risultano verificate una o più
condizioni (che possono essere associate mediante gli operatori logici and e or); ad esempio, nella determinazione della durata
di un componente soggetto a sollecitazioni, le operazioni di calcolo devono essere ripetute mentre il danneggiamento risulta
minore di 1 e il numero di iterazioni è inferiore al numero di cicli di fatica da considerare, nc. In questo caso, se k è il
contatore, devono essere verificate simultaneamente le condizioni D(k)<=1 e (and) k<nc.
nc=length(a);D=zeros(1,nc);
D(1)=(a(1)^mu)/K;
k=1;
while D(k)<=1 && k<nc
k=k+1;
...D(k)=(D(k-1)^....;
end
D(D==0)=[];
Da notare come il contatore (k nell'esempio) deve essere inizializzato prima del ciclo e incrementato durante l'esecuzione.
È opportuno che all'interno dei cicli iterativi non vengano ripetute operazione che possono essere effettuate una sola volta
all'esterno del ciclo. Ad esempio, se l'operazione iterata prevede anche il prodotto per una costante, in molti casi tale prodotto
può essere effettuato all'esterno del ciclo moltiplicando la matrice con i risultati per la costante. Ad esempio, nel caso delle
lastre, è opportuno scrivere all'interno dell'iterazione l'operazione che coinvolge i termini calcolati con l'iterazione:
w=w+G*smn;
e solo alla fine dell'iterazione
w=w/D/pi^4;
Da notare che, utilizzando il linguaggio Matlab, quando le operazioni da iterare sono di tipo algebrico e non matriciale, in
molti casi è possibile inserire i dati da elaborare in matrici o vettori ed effettuare le operazioni con gli appositi operatori (.*, ./ e
.^) senza utilizzare le istruzioni iterative, con vantaggi in termini di semplicità, di scrittura del programma e velocità
d'esecuzione. Come già visto, nello studio di una funzione è possibile inserire le ascisse in vettori e calcolare i valori della
funzione senza utilizzare operazioni iterative.
Ad esempio, nel caso delle tensioni radiali nei cilindri e del danneggiamento di Miner, è opportuno scrivere
ro2=ro.^2; sr=-((1-ro2)./ro2))*b2/(1-b2)*pi
D=sum(a.^mu)/K
piuttosto che
l=length(ro);for i=1:l; sr(i)=-((1-ro(i)^2)/ro(i)^2))*b2/(1-b2)*pi;end
l=length(a); D=0; for i=1:l; D=D+a(i)^mu;end; D=D/K
Le operazioni iterative devono essere utilizzate per il calcolo:
• delle deformazioni in materiali ortotropi in quanto, per ogni angolo, devono essere determinate la matrice di cedevolezza e
il vettore delle deformazioni;
• delle sollecitazioni nelle lastre tramite la serie doppia di Fourier, in quanto, per ogni termine della serie di Fourier, devono
essere determinate le matrici con i valori delle funzioni sin(nπx/a), sin(mπx/b), ecc..;
• del danneggiamento non lineare, in quanto il danneggiamento dovuto a ciascun ciclo di fatica dipende da valore del
danneggiamento raggiunto al ciclo precedente;
• del danneggiamento nei processi aleatori in quanto, per ogni iterazione devono essere effettuate numerose operazioni.
Nei primi due casi è possibile utilizzare l'istruzione for...end, mentre negli altri è opportuno utilizzare l'istruzione while...
end, in quanto non è possibile sapere a priori quante iterazioni portano al raggiungimento del danneggiamento unitario.
Funzioni
Come detto, le funzioni (functions) servono ad aggiungere nuovi comandi al matlab e possono essere eseguite dal prompt o
richiamate da uno script esattamente come si usano i comandi già disponibili del matlab, come si è visto nella sezione Le
funzioni del matlab.
Le funzioni sono preferibili agli script nel caso in cui il numero dei dati da elaborare e dei risultati ottenuti sono limitati
(max una decina di variabili, scalari o matrici) e le elaborazioni sono di utilità generale e/o devono essere effettuate più volte.
Ad esempio, la determinazione dei 4+4 coefficienti di sicurezza del diagramma di Haigh può essere effettuata mediante una
funzione che abbia come dati di ingresso le tensioni di fatica, snervamento e rottura del materiale e i valori tensione media e
alternata e che restituisca due vettori (o una matrice) contenente gli 8 coefficienti.
Al contrario, nella soluzione del problema delle lastre non è opportuno scrivere una funzione in quanto devono essere
calcolati troppi dati (spostamenti, forze, momenti, tagli, reazioni vincolari, tensioni).
Vedere l'istruzione function a pag.17.
È opportuno che le funzioni non scrivano risultati sul desktop, in quanto potrebbero interferire con la scrittura effettuata dal
programma che le richiama. È anche opportuno che le funzioni che realizzano delle figure, abbiano come dato d'ingresso il
numero di figura che deve essere utilizzato. In generale è opportuno che la realizzazione di un grafico da parte di una funzione
sia opzionale, nel senso che deve essere possibile scegliere se la funzione deve realizzare o meno il grafico. Un modo semplice
per controllare quest'opzione utilizzando il numero di figura come variabile di ingresso, è di assegnare il valore 0 a tale
variabile e condizionare la realizzazione del grafico all'interno della funzione nel modo sotto riportato:
if nfig; figure(nfig); plot(x,y); end
6
G. Petrucci “Complementi di Costruzione di Macchine”
GRAFICI
FIGURE Crea una finestra grafica. figure(n)
CLOSE Chiude la figura close(n) close all
AXIS Controlla la scala e il formato degli assi. axis([x1 x2 y1 y2]) axis equal
SUBPLOT Suddivide una figura in più grafici. subplot(2,2,1)
GRID ON Griglia di linee. grid on grid off
7
G. Petrucci “Complementi di Costruzione di Macchine”
LINGUAGGIO DI PROGRAMAZIONE
IF Istruzione condizionale IF. if a==0;…. elseif a>5;…....else……;end
SWITCH/CASE Sceglie tra vari casi in base al valore di una variab. switch (a); case(b);….. ;case(c);….otherwise…..; end
FOR Ripete istruzioni un numero di volte specificato. for i=1:3;………end
WHILE Ripete istruzioni un numero di volte indefinito. while (d>0.001)……end
BREAK Termina l’esecuzione di un ciclo WHILE o FOR. for i=1:3;………if k==1;break;end; …end
FUNCTION Aggiunge una nuova funzione. function y=senoquad(x) …. y=sin(x).^2
8
G. Petrucci “Complementi di Costruzione di Macchine”
9
G. Petrucci “Complementi di Costruzione di Macchine”
FLIPUD Inverte la posizione delle righe di una matrice (sposta gli elementi dall’alto in basso).
Ad esempio X = 1 4 diventa 3 6
25 25
36 14
FLIPLR Inverte la posizione delle colonne di una matrice (sposta gli elementi da destra a sinistra).
Ad esempio X = 1 2 3 diventa 3 2 1
456 654
10
G. Petrucci “Complementi di Costruzione di Macchine”
11
G. Petrucci “Complementi di Costruzione di Macchine”
GRAFICI
FIGURE Crea la finestra della figura.
FIGURE, da sola, crea una nuova finestra per i grafici e restituisce il suo handle.
FIGURE(H) rende “corrente” la figura H, la forza a diventare visibile e la pone in primo piano rispetto a tutte le altre figure
sullo schermo. Se la figure H non esiste e H è un intero, viene creata una nuova figura con handle H.
Ad esempio,
PLOT(X,Y,'r:') traccia una linea di colore rosso (r) punteggiata (:) ;
PLOT(X,Y,'bd') disegna un diamante blu per ciascun punto appartente ai dati ma non esegue il tracciamento della linea.
PLOT(X1,Y1,X2,Y2,X3,Y3…) disegna una linea per ciascuna coppia di vettori X-Y.
PLOT(X,Y,'LineWidth',n) utilizza l’opzione LineWidth, che deve essere posta alla fine dell’istruzione e assegna alle linee
tracciate lo spessore specificato dal numero n (n intero≥1).
AXIS EQUAL setta il rapporto di scala degli assi x e y in modo che in un grafico gli incrementi sugli assi x e y siano uguali.
Questo fa in modo che SPHERE(25) abbia l’aspetto di una sfera, invece che un ellissoide.
12
G. Petrucci “Complementi di Costruzione di Macchine”
13
G. Petrucci “Complementi di Costruzione di Macchine”
ISTRUZIONI DI CONTROLLO
IF/ELSEIF/ELSE Istruzione condizionale se/altrimenti se/altrimenti
Permette che siano eseguite alcune istruzioni nei casi in cui (cioè se) vengono verificate certe condizioni, tipicamente costituite
da relazioni tra variabili. La forma generale dell’istruzione IF è
IF espressione
Istruzioni
ELSEIF espressione
Istruzioni
ELSE
Istruzioni
END
Le istruzioni vengono eseguite se la parte reale dell’espressione ha tutti elementi non-zero. L’espressione è usualmente una
espressione relazionale della forma expr rop expr dove rop è un operatore relazionale del tipo ==, <, >, <=, >=, o ~=.
Le parti ELSE ed ELSEIF sono opzionali.
Esempio
if I = = J
A(I,J) = 2;
elseif abs(I-J) == 1
A(I,J) = -1;
else
A(I,J) = 0;
end
Ricordarsi che l'espressione I= =J coincide con il numero 1 se I=J e 0 se I≠J. L’esempio potrebbe anche essere scritto come:
K=(I= =J);
if K; A(I,J)= 2; end.
Vengono eseguiti i comandi seguenti il primo CASE per il quale la variabile case_expr verifica l’espressione switch_expr.
Quando case_expr è un array (come nel secondo caso sopra), il case_expr verifica se un qualsiasi elemento dell’array verifica
la switch-expression.
Se nessuno dei case-expressions verifica la switch-expressione allora è eseguito il caso OTHERWISE (altrimenti). Viene
eseguito solamente un CASE e l’esecuzione riprende con il primo comando dopo END.
La switch_expr può essere uno scalare o una stringa. Uno scalare switch_expr verifica un case_expr se
switch_expr==case_expr. Una stringa switch_expr verifica un case_expr se strcmp(switch_expr,case_expr) restituisce 1 (vera).
Vengono eseguiti solamente i comandi tra il CASE verificante e il successivo CASE, OTHERWISE o END.
Esempi:
14
G. Petrucci “Lezioni di Costruzione di Macchine”
FOR/END Ripete le istruzioni comprese tra FOR ed END un numero di volte specificato.
La forma generale dell’istruzione FOR è:
FOR I=A, istruzione, ..., istruzione; END
Se A è un vettore, le istruzioni comprese tra il FOR e l’END vengono eseguite un numero di volte pari alla lunghezza di A.
Ogni esecuzione di tutte le istruzioni comprese tra FOR ed END si definisce iterazione o ciclo. Ad ogni iterazione alla
variabile I viene assegnato il valore dell’elemento di A che si trova nella posizione corrispondente al numero dell’iterazione
che si sta effettuando. Spesso A è nella forma X1:X2 per cui la variabile assume valori crescenti da X1 a X2 con incrementi
unitari ad ogni iterazione.
Ad esempio (si assuma che N ed M abbiano già un valore assegnato).
FOR I = 1:N,
FOR J = 1:M,
A(I,J) = 1/(I+J-1);
END
END
In questo caso per ogni valore di I da 1 ad N viene effettuata una iterazione con J che va da 1 ad N. In totale vengono eseguite
NxM iterazioni e vengono assegnati tutti i valori alla matrice A(N,M). I e J nel gergo informatico sono definiti contatori
perché ad ogni iterazione assumono valore uguale al numero di conteggio dell’iterazione stessa. Spesso è opportuno che nel
ciclo FOR/END una variabile assuma il ruolo di contatore.
In questi due esempi le variabili utilizzate nel ciclo FOR non assumono il ruolo di contatore
FOR S = 1.0: -0.1: 0.0; SS=S^2……. END passi con incrementi di -0.1
a=[1 5 7]: FOR J = a, ... END compie 3 passi dando a J i valori di a.
per cui, se necessario, all’interno del ciclo dovrebbe essere introdotta una istruzione del tipo n=n+1, premettendo n=0 prima
del FOR.
n=0;FOR S = 1.0: -0.1: 0.0; n=n+1; SS=S^2……. END
Sarebbe meglio scrivere così:
S = 1.0: -0.1: 0.0;L=length(S); FOR k=1:L; SS=S(k)^2 ……. END
WHILE Ripete le istruzioni comprese tra WHILE ed END mentre viene verificata una certa condizione.
A differenza dell’istruzione FOR, l’istruzione WHILE viene utilizzata quando non si sa a priori quante iterazioni devono
essere eseguite per conseguire il risultato che interessa. La forma generale dell’istruzione WHILE è:
WHILE espressione
istruzioni
END
Le iterazioni vengono eseguite mentre la parte reale dell’espressione ha tutti elementi non-zero (l’espressione è verificata)
ovvero si può dire che iterazioni vengono eseguite fino a quando la parte reale dell’espressione ha tutti elementi zero
(l’espressione non è più verificata). L’espressione è usualmente il risultato di una operazione relazionale tra 2 numeri o arrays,
del tipo
expr rop expr dove rop è ==, <, >, <=, >=, o ~=.
Ad esempio (assumendo A già definito):
E = 0*A; F = E + eye(size(E)); N = 1;
while norm(E+F-E,1) > 0,
E = E + F; F = A*F/N; N = N + 1;
End
Esempi:
for N=1:K;
istruzioni;
if N>1000; break;end;
end
while 1
istruzioni;
if N>1000; break;end;
end
15
G. Petrucci “Lezioni di Costruzione di Macchine”
definisce una nuova funzione chiamata STAT che calcola la media e la deviazione standard di un vettore.
La nuova funzione può essere richiamata come una normale funzione matlab, ad esempio
z=[1 5 7 10 12 3 6 7]; [m,s]=stat(z);
È importante notare che i nomi delle variabili utilizzate quando la funzione viene richiamata NON devono essere
NECESSARIAMENTE uguali ai nomi delle variabili utilizzate all’interno della una funzione nella sua definizione. Infatti, per
richiamare una funzione è necessario conoscere quante variabili (e di che tipo) richiede e quante variabili (e di che tipo)
restituisce, non come sono state chiamate al loro interno,
In ingresso la funzione riceve i valori numerici assunti dalle variabili contenute tra parentesi tonde nell’espressione che
richiama la funzione, cioè [m,s]=stat(z), e li attribuisce alle variabili contenute tra parentesi tonde nella definizione della
funzione, cioè function [mean,stdev]=stat(x), per essere elaborati.
In uscita la funzione restituisce i valori assunti dalle variabili presenti nelle parentesi quadre della definizione (in questo
esempio il valore numerico assunto da mean ed stdev) sostituendo tali valori nelle variabili presenti tra parentesi quadre
nell’espressione che richiama la funzione (in questo esempio le variabili m ed s).
Le variabili presenti all’interno del corpo della funzione sono tutte variabili locali, cioè non vengono viste dal programma
che richiama la funzione, ma solo dalla funzione. In questo esempio, se nel programma chiamante è già presente una variabile
n, essa non viene modificata, se non è presente non comparirà in memoria dopo l’esecuzione della funzione.
| Logico O.
A | B oppure or(A,B) è una matrice i cui elementi sono 1 dove o A, o B hanno un elemento non-zero, e 0 dove entrambi hanno
elementi nulli. A e B devono avere le stesse dimensioni (o uno può essere uno scalare).
xor o esclusivo.
xor(A,B) è 1 dove A e B non sono entrambi uguali o diversi da zero, e 0 dove uno di due è zero e l’altro non-zero.
16
G. Petrucci “Lezioni di Costruzione di Macchine”
Esempio risultato
a=[1 2 3 4];
b=[1 0 0 5];
c=a>b c=[0 1 1 0]
c=a>=b c=[1 1 1 0]
c=a==b c=[1 0 0 0]
c=a&b c=[1 0 0 1]
c=a|b c=[1 1 1 1]
c=xor (a,b) c=[0 1 1 0]
i=find(a) i=[1 2 3 4]
i=find(b) i=[1 4]
i=find(a>b) i=[2 3]
i=find(a>=b) i=[1 2 3]
i=find(a==b) i=[1]
i=find(a&b) i=[1 4]
i=find(a|b) i=[1 2 3 4]
i=find(xor(a,b)) i=[2 3]
any(a) 1
any(b) 1
all(a) 1
all(b) 0
INF Infinito.
INF restituisce la rappresentazione aritmetica IEEE per infinito positivo.
Infinito è anche prodotto da operazionei come divisioni per zero, es. 1.0/0.0, o da overflow, es. exp(1000).
pi 3.1415926535897
La costante pi greco
17
G. Petrucci “Lezioni di Costruzione di Macchine”
18
G. Petrucci “Lezioni di Costruzione di Macchine”
19
G. Petrucci “Lezioni di Costruzione di Macchine”
20