770 likes | 972 Views
COSTANTI PREDEFINITE. Esistono in MATLAB alcune costanti predefinite, ossia nomi simbolici di valori che non cambiano durante l’elaborazione , anche se si cerca di forzarne l’alterazione del valore. >> computer tipo di computer in uso PCWIN >> pi pigreco 3.1416
E N D
COSTANTI PREDEFINITE Esistono in MATLAB alcune costanti predefinite, ossia nomi simbolici di valori che non cambiano durante l’elaborazione, anche se si cerca di forzarne l’alterazione del valore. >> computer tipo di computer in uso PCWIN >>pi pigreco 3.1416 >>eps precisione di macchina; in genere MATLAB usa per la rappresentazione dei numeri floating point la doppia precisione con 16 cifre decimali significative • 2.2204e-016 >>realmax massimo numero floating point rappresentabile 1.7977e+308 >>realmin minimo numero floating point positivo e non nullo rappresentabile 2.2251e-308 >>i oppure j rappresentano l’unità immaginaria nell’insieme dei numeri complessi 0.+1.0000i >>inf infinito; è il risultato di una espressione che ha al denominatore 0 >>NaN Not –a-Number; è il risultato di una espressione che risulta 0/0 o inf/inf >>version Versione di MATLAB
Come assegnare una matrice • PRIMO modo: gli elementi di una riga separati da spazi, quelli di righe diverse separati da un punto e virgola A = [5 7 2.5 ; -3.2 4.8 1.5]; • SECONDO modo: gli elementi di una riga separati da virgole quelli di righe diverse separati da un punto e virgola (la virgola però si rivela superflua.) • A = [5 , 7 , 2.5 ; -3.2 , 4.8 , 1.5]; • TERZO modo: gli elementi di una riga separati da spazi quelli di righe diverse scritti su righe diverse A = [ 5 7 2.5 -3.2 4.8 1.5];
QUARTO modo: Una matrice può essere creata anche accorpando più matrici che devono avere ugual numero di righe: C=[ A B] o di colonne D=[A;B]
Come MATLAB memorizza le matrici • MATLAB memorizza le matrici in un array unidimensionale (=vettore) formato dalla prima colonna della matrice seguita dalla seconda, dalla terza, ecc. • Quindi a(j) indica l’elemento della matrice di posto j secondo la numerazione progressiva per colonne. Questo consente di richiamare gli elementi di una matrice sia in modo tradizionale con due indici a(h, k) che con un solo indice a(j).
A righe m=2 colonne n=4 A(h,k) A(j) j=(k-1)*m+h
Analisi degli elementi di una matrice • Se si vogliono localizzare gli elementi di una matrice che soddisfano una data condizione si usa l’istruzione find. Così, indicata con M una matrice, le istruzioni f=find(M) crea un vettore f i cui elementi sono gli indici della matrice M corrispondenti agli elementi della matrice diversi da zero. g=find(M>2) crea un vettore g i cui elementi sono gli indici della matrice M corrispondenti agli elementi della matrice maggiori di 2. g=find(M<0) crea un vettore s i cui elementi sono gli indici della matrice M corrispondenti agli elementi negativi della matrice.
Matrici particolari • Per generare una matrice m x n i cui elementi siano tutti nulli si usa l’istruzione P = zeros (m,n); • Per generare una matrice di elementi tutti nulli avente la stessa dimensione della matrice A, già definita dll’utente, si usa l’istruzione T=zeros(size(A)); Per generare una matrice m×n i cui elementi siano tutti uguali ad uno si usa l’istruzione Q = ones(m,n); Per generare una matrice identità n×n si usa l’istruzione R = eye(n); Per generare una matrice n×n con elementi a caso compresi tra zero ed 1 si usa l’istruzione S = rand(n)
DIMENSIONAMENTO AUTOMATICO • In MATLAB le variabili non sono dichiarate preventivamente al loro uso dall'utente, ma sono create quando sono necessarie da un gestore della memoria che alloca lo spazio necessario per una matrice dinamicamente, mediante il cosiddetto DIMENSIONAMENTO AUTOMATICO. • Se ad esempio si esegue >>C(2,3)=1 C= 0 0 0 0 0 1 automaticamente viene allocato lo spazio per una matrice 2x3, ossia C diventa 2x3. Se ora si esegue: >>C(3,3)=2 C= 0 0 0 0 0 1 0 0 2 • MATLAB aumenta le dimensioni di C a 3x3 per trovare spazio per l’elemento aggiunto C(3,3); la dimensione di C diventa 3x3. • Si osservi che quando in una istruzione si cambia anche un solo elemento di una matrice e l'istruzione non ha il punto e virgola finale, Matlab visualizza tutta la matrice.
Se, dati a,h,n, si vuole fare un’operazione del tipo x(1)=a for i=1:n x(i)=x(i-1)+h; end; • Al primo passo viene definito un vettore x di lunghezza 1, al secondo x diventa di lunghezza 2, al terzo di lunghezza 3 e così via fino a che al termine del ciclo ha lunghezza 21. • Il vettore viene considerato per convenzione, così come ogni vettore generato dinamicamente, un vettore riga. • E’ possibile allocare a priori il vettore x, inizializzandolo a zero, usando la funzione zeros: x=zeros(1,n) for i=1:n x(i)=x(i-1)+h; end; Questa soluzione è più efficiente per due motivi: • si ha il controllo dell'orientamento dei vettori, senza sottindere nulla, e si evitano errori di compatibilità di dimensionamento nelle operazioni vettoriali; • si evita l'uso intensivo del gestore della memoria risparmiando tempo. • Se si vuol definire x come vettore colonna, basta usare x=zeros(n,1).
Vettore con elementi in progressione aritmetica Se gli elementi di un vettore sono regolarmente intervallati l’operatore (:) consente di generare un vettore riga: a=[p:step:u] es: a=[0:1:4] produce il vettore riga 0,1,2,3,4. p primo elemento step incremento (<0 se u<p) es: a=[8:-2:-12]) u ultimo elemento Se step=1 può essere omesso linspace(p,u,n) consente di creare un vettore riga con un numero predefinito n di elementi linearmente intervallati nell’intervallo[p,u] a=[0:1:4] equivale a a=linspace(0,4,5);
In un linguaggio di programmazione classico • passo=0.2 k=1 z[1]=-4 while(z[k]<=4) k=k+1; z[k]=z[k-1]+passo end while Matlab z=-4:0.2:4
Uso dei due punti • Il comando “:” e’ un sostituto del ciclofor. Abbiamo gia’ visto come esso consenta di creare semplicemente vettori con componenti che differiscono di una costante. • Vediamone ora un secondo utilizzo. Data una matrice A si voglia prelevare da essa una sotto-matrice formata da alcune righe e alcune colonne.
Ad esempio se si vuol prelevare la sotto-matrice B formata dalla sola prima colonna di A. B=A(:,1) • che significa B è formato da tutte le righe di A (questo significano i due punti prima della • virgola) ma solo dalla colonna 1.
Si voglia prelevare da A la sotto-matrice C formata dalle colonne 2,3 • Basta usare l’istruzione C=A(:,2:3), che signfica C è formato da tutte le righe di A (questo significano i due punti prima della virgola) ma solo dalle colonne 2 e 3 .
Si voglia prelevare la sotto-matrice D formata dalle righe 2 e 3 di A • basta usare l’istruzione D = A(2:3,:) che significa: D `e formato dalle righe 2 e 3 di A e da tutte le colonne (questo significano i due punti dopo la virgola).
SOMMA TRA MATRICI • Siano A e B due matrici mxn. Allora si può definire la matrice somma A+B i cui elementi sono la somma degli elementi di ugual indici di A e B rispettivamente. • >>A=[1 2 3; 4 5 6: 7 8 9]; • >>B=A’ • B = 1 4 7 • 2 5 8 • 3 6 9 • >>C=A+B • C= 2 6 10 • 6 10 14 • 10 14 18 • >>A=A+x ove x è un vettore 3x1 NON SI PUO’ ESEGUIRE!!! • >>A=A+1 • A= 2 3 4 • 5 6 7 • 8 9 10 • In questo caso anche se 1 è uno scalare si sottintende che A sia moltiplicato per una matrice 3x3 di tutti 1 e l’operazione può essere fatta.
PRODOTTO DI SCALARE PER MATRICE Sia A una matrice mxn e y uno scalare. Il prodotto dello scalare y per la matrice A è una matrice mxn i cui elementi sono gli elementi di A moltiplicati per y. >>A=[2 3 4; 5 6 7;16 18 20] A= 2 3 4 5 6 7 16 18 20 >> B= 2*A B= 4 6 8 10 12 14 16 18 20
Prodotto Matrice vettore • Se A matrice mxn ed x vettore colonna nx1 si può definire il prodotto matrice vettore Ax nel seguente modo: >>A=[2 1; 3 4] A= 2 1 3 4 >> x=[5;6] x= 5 6 >>c=A*x c= 16 39 Il prodotto Matrice vettore può essere calcolato solo se il numero delle colonne della matrice è uguale al numero delle righe del vettore.
Operazioni sulle matrici • Per aggiungere o togliere a tutte le componenti di un vettore (o di una matrice) un numero, basta sommare o sottrarre il numero al vettore. • Dato il vettore x = [ 10 20 30 ]; con la scrittura y = x + 3 si ottiene il vettore [ 13 23 33 ] • Per moltiplicare o dividere un vettore per un numero basta scrivere z = 2 * x che fornisce il vettore [ 20 40 60 ]
Prodotto tra matrici E’ sufficiente mettere un asterisco tra le due matrici A = [ -1 0; 8 3]; % assegna la prima matrice B = [ 3 -2; 1 -1]; % assegna la seconda matrice C = A * B % esegui il prodotto e mostralo • E’ evidente che si possono moltiplicare due matrici se il numero di colonne della prima e’ uguale al numero di righe della seconda. • Ad esempio A = [ -1 0 8 3 • 5 2]; % assegna la prima matrice • B = [ 3 -2 8 5 1 -1 2 -5]; % assegna la seconda matrice • C = A * B % esegui il prodotto e mostralo 3x2 2x4
In particolare si può ottenere il prodotto scalare di due vettori u = [-1 4 8 3 5 2]; % assegna il primo vettore-riga v = [ 3 ; -2 ; 8 ; 5; 1 ; -1]; % assegna il secondovettore-colonna • s = u * v % esegue il prodotto e lo mostra
Prodotto di due Matrici Amxp Bpxn • for i=1,…,m for j=1,…,n C(i,j)=0 for k=1,…,p C(i,j)=C(i,j)+A(i,k)*B(k,j) end end end Con un linguaggio di programmazione classico
Prodotto di due Matrici Amxp Bpxn • for i=1:m for j=1:n C(i,j)=A(i,:)*B(:,j) end End oppure più semplicemente usando il comando C=A*B In matlab sostituendo il ciclo più interno con l’operatore : ed utilizzando la moltiplicazione predefinita tra vettori *
Operazioni componente per componente • Una operazione molto utile in MATLAB, che non ha analogo nel calcolo matriciale, è la seguente: date due vettori u e v che hanno la stessa dimensione si vuole ricavare un altro vettore che ha come componenti i prodotti (o i quozienti) delle componenti omonime dei due vettori dati. Ad esempio u = [8 6 12] v = [2 3 4] si vogliono ottenere i vettori w = [16 18 48] (ottenuto moltiplicando componente per componente i due vettori) z = [4 2 3] (ottenuto dividendo componente per componente i due vettori) • si devono introdurre due nuove operazioni che sono indicate con i simboli (.*) e (./) rispettivamente ovvero anteponendo un puntino ai simboli di prodotto (*) e di quoziente (/). rispettivamente.
u = [8 6 12] • v = [2 3 4] • w = u .* v % il puntino precede il segno di prodotto * • z = u ./ v % il puntino precede il segno di quoziente / Questa nuova operazione si usa anche quando vogliamo fare operazioni sulle singole componenti di un vettore o con le componenti di due vettori. Cos`ı se vogliamo fare il cubo delle componenti di • un vettore ovvero a = [2 3 5] ed ottenere b = [8 27 125] si deve premettere un punto al simbolo di elevamento a potenza. >> b = a .^ 3; • Il punto precisa che l’operazione indicata viene compiuta sulle singole componenti.
Questo tipo di operazione è molto usata nella valutazione di funzioni: Valutare la funzione y=((1+x)-1)/x) in x che varia nell’intervallo [eps/2,eps]: x=[eps:-eps/16:eps/2] y=((1+x)-1)./x)
Qualora si dovesse valutare la funzione y = x sin(x) nelle componenti di un vettore x, dovremmo fare il prodotto delle componenti omonime premettendo un punto al simbolo di prodotto y = x .* sin(x);
Vettorizzazione • L'azione di rimpiazzare un ciclo con una operazione vettoriale viene detta vettorizzazione e porta tre vantaggi: • maggiore efficienza in termini di tempo di esecuzione; • maggiore leggibilità dell'algoritmo; • abitudine a usare operazioni vettoriali; ci sono macchine che usano la sintassi vettoriale poiché hanno caratteristiche hardware ad hoc per le operazioni di tipo vettoriale.
Funzioni che agiscono sugli array • min(A): per i vettori restituisce il più piccolo valore nel vettore, per le matrici restituisce un vettore riga contenente gli elementi minimi di ogni colonna di A • max(A): per i vettori restituisce il più grande valore nel vettore, per le matrici restituisce un vettore riga contenente gli elementi massimi di ogni colonna di A • sort(A): per i vettori restituisce il vettore di input ordinato in ordine crescente, per le matrici dispone le colonne dell’array A in ordine crescente e restituisce un array della stessa dimensione di A • sum(A): per i vettori restituisce la somma degli elementi del vettore, per le Matrici restituisce la somma gli elementi di ogni colonna dell’array A e restituisce un vettore riga che contiene le somme risultanti.
Funzioni matematiche di base Funzioni matematiche di base Tipiche funzioni matematiche di base abs(x) calcola il valore assoluto di x exp(x) calcola ex sqrt(x) calcola la radice quadrata di x log(x) calcola il logaritmo naturale di x log10(x) calcola il logaritmo decimale (in base 10)
F. Complesse abs(x)calcola il valore assoluto di x angle(x)calcola la fase di un numero complesso conj(x)calcola il numero complesso-coniugato di x imag(x)rende la parte immaginaria di un numero complesso x real(x)rende la parte reale di un numero complesso x
F. Numeriche ceil(x)approssima x al numero intero più vicino verso infinito, ceil(1.21232)=2 fix(x)approssima x al numero intero più vicino verso lo zero fix(1.21232)=1 floor(x)approssima x al numero intero più vicino verso - infinito floor(1.21232)=1 round(x)approssima x al numero intero più vicino round(1.21232)=1 sign(x)calcola il segno di x e restituisce +1 se x > 0 0 se x = 0 -1 se x < 0
Funzioni trigonometriche • cos(x), sin(x), tan(x) e cot(x) coseno, seno, tangente e cotangente di x • acos(x), asin(x), atan(x) e acot(x) arcocoseno, arcoseno, arcotangente, arcocotangente di x • sec(x) e csc(x) secante e cosecante di x • cosh(x), sinh(x), tanh(x) e coth(x) coseno iperbolico, seno iperbolico, • sech(x) tangente iperbolica e cotangente iperbolica e secante iperbolica di x • asec(x) e acsc(x) arcosecante e arcocosecante di x • aosh(x), sinh(x), tanh(x) e coth(x) arcocoseno iperbolico, arcoseno iperbolico, • csech(x) arcotangente iperbolica e arcocotangente iperbolica e cosecante di x • atan2(y,x) arcotangente nei quattro quadranti (+pi:-pi)
Funzioni logiche • any(x) restituisce uno scalare , che è pari a 1 se almeno uno degli elementi del vettore x è diverso da zero, 0 negli altri casi. • any(A) restituisce un vettore riga che ha lo stesso numero di colonne della matrice A e che contiene 1 e 0 in funzione del fatto che la corrispondente colonna di A contiene oppure no almeno un elemento diverso da 0. • all(x) restituisce uno scalare, che è pari a 1 se tutti gli elementi del vettore x sono diversi da 0, 0 negli altri casi
M-function file • Definiscono una nuova funzione il cui nome coincide con il nome che si attribuisce al file. • Ogni funzione accetta dei dati su cui operare (parametri di ingresso) e restituisce dei risultati (parametri di uscita). • La prima istruzione del file deve essere: • function [lista parametri uscita]=nome(lista parametri ingresso); • % commento; linea H1: compare quando si fornisce il comando • % >> help nome • Il nome della funzione segue le regole dei nomi delle variabili (31 caratteri, di cui il primo è una lettera). • Se in una lista di parametri compare più di un parametro, essi sono separati da virgola. I parametri specificati nella istruzione function si dicono parametri formali. • Nel corso della funzione vengono eseguiti calcoli sui parametri d'ingresso e si assegnano valori ai parametri di uscita. • La funzione è richiamabile all’interno di qualunque espressione mediante il nome e la lista dei parametri su cui deve operare (parametri attuali): • …nome(i1,i2,..,in) • Se non ci sono parametri d'uscita si usa: • function nome(lista parametri d'ingresso); • function []=nome(lista parametri d'ingresso);
ESEMPIO • La seguente funzione viene scritta in editor e gli viene assegnato nome poli5.m: • function y=poli5(x); oppure [y]=poli5(x); • %polinomio di grado 5 • y=x^5/5-x^4+x^3+x^2-1.0; • x è parametro formale d’ingresso • y è parametro formale d’uscita; • entro la function occorre che compaia almeno una istruzione che definisce i parametri formali d’uscita.
Uso della function: • » var=2;ris=poli5(var);disp(ris); • 1.4000 • var è parametro attuale d’ingresso • ris è parametro attuale d’uscita • » xx=3;s=poli5(xx);disp(s); • 2.6000 • In questo caso xx è parametro attuale d’ingresso e s è parametro attuale d’uscita. • Parametri formali e parametri attuali devono essere in corrispondenza biunivoca. • Il commento è opzionale serve a documentare cosa calcola la funzione; se l’utente si dimentica il tipo di elaborazione eseguita, con • >>help nome • viene visualizzata la linea di commento H1 dopo l’istruzione function, se essa è stata specificata. Vengono visualizzate anche le successive linee di commento se sono presenti, fino alla prima linea vuota o alla prima linea non di commento.
ESEMPIO • » help poli5 • polinomio di grado 5 • » • Analogamente l’istruzione • >>lookfor parola-chiave • cerca la parola-chiave specificata dall’utente nella riga di commento dopo l’istruzione function e, se la trova, visualizza il nome della funzione e la riga di commento. • ESEMPIO • » lookfor polinomio • poli5.m: %polinomio di grado 5 • Ogni funzione usata resta in memoria. Con il comando inmem si possono vedere le funzioni attualmente in memoria. • Si possono cancellare tutte le funzioni con
>> clear functions • Con • >> clear nomefun • si azzera solo la funzione specificata. • ESEMPIO 1 • La function che segue calcola la media campionaria di un insieme di dati contenuti nel vettore x: • function m=media(x); • % calcolo della media campionaria di un insieme di dati • % contenuti in un vettore x; • % l'input e' il vettore x; l'output e' la media campionaria • n=length(x); • m=sum(x)/n; • In Matlab, la media si può calcolare anche con la funzione predefinita mean. • Esempio di esecuzione: • » x=[3 6 2 9 10]; • » media(x) • ans = • 6 • » mean(x) • ans = • 6
ESEMPIO 2 • Supponiamo di avere un insieme di dati di cui si conoscono le frequenze; in tal caso la media viene calcolata con una differente formula, che può essere implementata mediante la seguente function: • function m=media_pesata(x,f); • % calcolo della media campionaria di un insieme di dati • % contenuti in un vettore x con frequenze contenute nel vettore f; • % l'input e' il vettore x; l'output e' la media campionaria • s=sum(f); • m=sum(x.*f)/s; • Esempio di esecuzione: • » x=[4 6 9 1];f=[14 5 8 23]; • » media_pesata(x,f) • ans = • 3.62
FUNZIONI USATE ENTRO UNA FUNCTION • narginnumero di argomenti di input che sono specificati nella chiamata alla function in cui si trova nargin nargoutnumero di argomenti di output che sono specificati nella chiamata alla function in cui si trova nargout ESEMPIO function c=testarg(a,b); if nargin== 1 c=a.^2; elseif nargin==2 c=a+b; end;