Matlab Per L'ingegnere Chimico
November 20, 2022 | Author: Anonymous | Category: N/A
Short Description
Download Matlab Per L'ingegnere Chimico...
Description
Matlab per l’ ngegnere himico
Matlab per l’Ingegnere Chimico Sommario Struttura di Matlab ....................................................................................................................... ............................................................................................................................................ ..................... 3 Alcuni comandi base............................................................. ................................................................................................................................... ............................................................................. ....... 3 % e %%................................................................... ...................................................................................................................................... ........................................................................................ ..................... 3 clc ................................................................................................................................... ................................................................................................................................................................... ................................ 3 clear all ............................................................... ..................................................................................................................................... ........................................................................................... ..................... 3 close all ..................................................................................................................................... .......................................................................................................................................................... ..................... 4 help ........................................................................................................................................... ................................................................................................................................................................ ..................... 4 Definizione di nuove variabili ............................................................................................................................ ............................................................................................................................ 4 Definizione di variabile .................................................................................................. .................................................................................................................................. ................................ 4 Definizione di un vettore ............................................................................................... ............................................................................................................................... ................................ 4 linspace e logspace .................................................................................................................................... .................................................................................................................................... 5 Definizione di una matrice........................................................... ............................................................................................................................. .................................................................. 5 Operazioni tra scalari ............................................................ ............................................................................................................................... ............................................................................. .......... 7 Operazioni con i vettori e con le matrici ........................................................................................................... 8 Selezione di elementi .............................................................................. .................................................................................................................................... ...................................................... 8 Determinazione delle dimensioni........................................................................................................... dimensioni.................................................................................................................. ....... 9 Ricerca di massimi e minimi ........................................................................................................................ ........................................................................................................................ 10 Somma degli elementi ................................................................................................................................. ................................................................................................................................. 11 Trasposizione ............................................................................................................................ ............................................................................................................................................... ................... 11 Determinante di una matrice ...................................................................................................................... ...................................................................................................................... 12 Inversione di una matrice ................................................................................... ............................................................................................................................ ......................................... 12 Operazioni tra matrici/vettori matri ci/vettori e scalari ....................................................................................................... ....................................................................................................... 12 Operazioni tra matrici e vettori .............................................................. ................................................................................................................... ..................................................... 13 Somma e sottrazione ............................................................................................................................... ............................................................................................................................... 13 Prodotto tra vettori e matrici .................................................................................................................. .................................................................................................................. 14 Divisione tra matrici................................................................................................................................. matrici................................................................................................................................. 15 Operazioni elemento per elemento ............................................................................................................ ............................................................................................................ 16 Cicli for, if, while ................................................................... ......................................................................................................................................... ........................................................................... ..... 17 Ciclo for............................................................... ..................................................................................................................................... ......................................................................................... ................... 17 Ciclo if ....................................................................................................................................... .......................................................................................................................................................... ................... 21 21 Ciclo while.................................................................................................................................... .................................................................................................................................................... ................ 24 Function ........................................................................................................................................ ........................................................................................................................................................... ................... 26 1
Rappresentazione di grafici ....................................... .......................................................................................................... ...................................................................................... ................... 29 Rappresentazione di grafici 1 1D D .................................................................................................................... .................................................................................................................... 29 Rappresentazione di grafici 2 2D D .................................................................................................................... .................................................................................................................... 36 Rappresentazione e salvataggio dei risultati ................................................................................................... ................................................................................................... 39 fprintf .................................................................................................................. ........................................................................................................................................................... ......................................... 40 Integrazione ............................................................................................................ ..................................................................................................................................................... ......................................... 41 Integrazione numerica.................................................................. ................................................................................................................................. ............................................................... 41 41 Integrazione simbolica................................................................................................................................. ................................................................................................................................. 43 43 Risoluzione di equazioni e sistemi ................................................................................................................... ................................................................................................................... 44 Comando fzero ............................................................................................................................................ ............................................................................................................................................ 4 44 4 Comando fsolve ...................................................................................... ........................................................................................................................................... ..................................................... 47 47 Risoluzione di equazioni differenziali .............................................................................................................. .............................................................................................................. 56 Sistemi di equazioni differenziali di primo ordine ....................................................................................... ....................................................................................... 56 Problemi differenziali di ordine superiore................................................................................................... ................................................................................................... 59
2
Struttura di Matlab Quando aprirai il programma noterai quattro aree principali: Current Folder, Command Window, Workspace e Command History. La loro funzione risulta essere la seguente: Command Window: in questa finestra è possibile inserire i comandi che vuoi che Matlab esegua. Utilizzare direttamente la Command Window per programmare risulta essere sconveniente. La via più agevole è aprire un nuovo script (pulsante solitamente in alto a sinistra), che consente di scrivere
righe di comando e di salvarle successivamente computer. Quando si vogliono eseguire quelle specifiche righe di comando, basta aprire lo script acon Matlab ed eseguirlo. Current Folder: è il percorso utilizzato da Matlab per risalire ai programmi che gli chiedi di eseguire. Se chiedi a Matlab di eseguire un programma che non è nella sua attuale folder, Matlab ti chiederà di cambiare folder, in modo tale da poter risalire alle righe di codice in i n questione. Da questo derivano delle importanti implicazioni: se una risoluzione è distribuita in più script o function (vediamo dopo di cosa si tratta), è importante che siano tutte nella medesima cartella, affinché Matlab possa eseguire la risoluzione. Workspace: è lo spazio in cui possono essere ricercate le varie variabili definite durante la programmazione. Quando Matlab esegue il programma, definisce le variabili e queste possono esseree ricercate all’interno della Workspace. esser Workspace. Command History: contiene la cronologia dei comandi eseguiti nella Command Window.
Ora che abbiamo visto la struttura del programma, ti consiglio di aprire un nuovo script, in modo tale da fare pratica con i seguenti comandi che vedremo.
Alcuni comandi base Le possibilità offerte da Matlab sono moltissime. Prima di approfondire quelle applicazioni che rivestono maggiore importanza nell’ambito dell’Ingegneria Chimica, risulta essere utile affrontare i comandi basi del programma. Vediamoli insieme.
% e %% In Matlab, tutto ciò che risulta essere preceduto dal simbolo di percentuale non viene letto come riga di comando (e appare colorato di verde). Dunque, se vogliamo inserire all’interno dello script dei commenti o delle indicazioni utili (ad esempio procedure risolutive o unità di misura), è bene farle precedere dal %. Se si affiancano due simboli di percentuale (%%) si ottiene una suddivisione del programma stesso, e risulta r isulta essere utile per avere una distinzione tra i diversiun’intera step risolutivi (definizione variabili, calcoli preliminari, algoritmi di risoluzione, etc etc).formale Per commentare porzione di testo basta selezionarla e premere ctrl+r, mentre per de-commentarla basta eseguire la medesima operazione premendo però ctrl+t. c trl+t.
clc Prima di eseguire un nuovo programma, risulta essere opportuno cancellare tutto quello che è attualmente presente sulla Command Window. Il comando clc, scritto tipicamente all’inizio dello script, permette proprio di fare questo. clear all La funzione precedentemente descritta ( clc) permette di pulire la Command Window, ma non ha alcuna influenza sulle variabili già salvate all’interno all’intern o del Workspace. Prima di eseguire dei nuovi comandi vale la pena cancellare tutte le variabili attualmente presenti nel Workspace, e il comando clear all ha proprio questa funzione.
3
close all I precedenti script potrebbero aver generato dei grafici. A volte risulta essere scomodo chiuderli manualmente, e si può quindi utilizzare il comando close all per chiudere tutti i grafici attualmente aperti in Matlab. Riassumendo, risulta quindi utile iniziare i propri algoritmi con questi tre comandi: %% Esempio di algoritmo in Matlab clc clear all all close all all
% serve a pulire la command window % serve a pulire il workspace % serve a chiudere i grafici aperti
help Se hai dei dubbi su come operi una certa funzione di Matlab, della quale ti ric ricordi ordi il nome ma di cui non ricordi la struttura e gli effetti, puoi ricercarla nella Command Window utilizzando il comando help. Ammettiamo ad esempio che io non ricordi come utilizzare il comando plot. Basta che io scriva sulla Command Window: Wi ndow: help plot
In questo modo Matlab mi mostra la struttura e l’effetto della funzione. funzione. Ora che abbiamo ripulito Matlab dai risultati di algoritmi precedenti, siamo pronti ad eseguire nuovi programmi. Uno step fondamentale risulta essere la definizione di nuove variabili.
Definizione di nuove variabili Definizione di variabile Se vogliamo definire una nuova variabile, in Matlab la procedura risulta essere alquanto semplice. Basta decidere un nome per la nuova variabile, scrivere = e affiancarla al suo valore numerico. Di fianco alla nuova variabile risulta essere sempre opportuno scrivere le unità di misura della medesima. Se ad esempio volessimo definire in Matlab la costante universale dei gas (R), ci basterebbe scrivere: R=8.314;
% J/(mol K)
Nota che dopo la scrittura del valore numerico della variabile compare un ; Mettere il ; dopo la definizione di una variabile permette di non farne comparire il valore sulla Command Window. Infatti, senza il ;, Matlab farebbe comparire sulla Command Window tutte le variabili definite, e questo rende difficile la visualizzazione di risultati che sono invece di interesse. Per questo motivo, dopo aver definito una nuova variabile, un nuovo vettore o una nuova matrice risulta essere sempre opportuno inserire il ;
Definizione di un vettore Per alcune quantità risulta essere più comoda una definizione vettoriale. Si pensi ad esempio alla composizione comp osizione di una corrente in ingresso ad un’apparecchiatura chimica, contenente cinque diversi composti. Se volessimo esprimere la composizione di tale corrente mediante delle frazioni molari, risulterebbe opportuno creare un singolo vettore che contiene tutte le informazioni di nostro interesse. Immaginando, ad esempio, che tutti i composti siano caratterizzati dalla medesima frazione molare, risulterebbe opportuno definire il vettore delle frazioni molari come segue: x=[0.2 0.2 0.2 0.2 0.2];
4
x=[0.2,0.2,0.2,0.2,0.2];
Le diciture ora espresse permettono di generare dei vettori riga, specificandone i singoli elementi. I singoli elementi possono essere separati da uno spazio (come nel primo caso) oppure da una virgola (come nel secondo caso). Se volessimo invece generare un vettore colonna, basta sostituire le , con dei ; x=[0.2;0.2;0.2;0.2;0.2];
Questi comandi risultano essere comodi ed opportuni quando bisogna creare vettori aventi un numero limitato di elementi. Immaginiamo ora di voler definire un nuovo vettore, che abbia come valori estremi 0 e 100 e i cui elementi siano distanziati di 1e-3 (10^-3, in linguaggio Matlab). Se dovessimo inserire a mano tutti i valori non finiremmo più. Per creare un vettore come questo, basta utilizzare il seguente comando: s=0:1e-3:100;
Tra i due : è riportata la spaziatura desiderata, mentre nelle zone esterne sono riportati gli estremi del vettore. Nel caso in cui il valore della spaziatura venisse omesso, Matlab lo porrebbe automaticamente uguale ad 1. Se volessimo trasformare il vettore ora introdotto in un vettore colonna, basterebbe trasporlo nel seguente modo, utilizzando ‘ : : s=s';
Altri comandi utili per la definizione di un vettore risultano essere i seguenti: linspace e logspace Immaginiamo di voler generare un nuovo vettore riga avente estremi 0 e 100, come nel caso precedente. Questa volta però, invece che voler specificare la spaziatura dei singoli elementi, vogliamo definire il numero di elementi contenuti dal vettore (e lasciare a Matlab la determinazione della spaziatura). Ammettiamo nel nostro caso di voler ottenere un vettore contenente 1000 elementi. Questo può essere fatto con il comando linspace, così definito: y=linspace(0,100,1000);
I primi due input del comando linspace corrispondono agli estremi del vettore desdierato, mentre il terzo input corrisponde al numero totale di elementi che si desiderano nel vettore. Funziona in modo analogo il comando logspace, con la differenza che crea una spaziatura logaritmica invece che lineare. y=logspace(a,b,n);
Il comando scritto genera un vettore di n elementi, logaritmicamente distanziati tra
10 10 e
.
Definizione di una matrice Per alcune applicazioni risulta essere opportuno definire delle matrici. Si pensi ad esempio alla determinazione di un equilibrio chimico che coinvolge più di una reazione chimica. In questo caso risulta ri sulta utile definire una matrice di coefficienti stechiometrici, mettendo ad esempio nelle righe le varie specie chimiche e nelle colonne le reazioni chimiche nelle quali prendono parte. Vediamo il tutto mediante un esempio:
: 2 → 5
Coefficienti stechiometrici
: →
-1 0 -2 0 +1
+1 -1 -1 +1 0
In Matlab è possibile creare una matrice come quella descritta in modo del tutto analogo a come sono stati definiti i vettori. In particolar modo, m odo, si definiscono le varie righe separando gli elementi mediante delle virgole o degli spazi, e le varie colonne distinguendo le righe con dei ; nu=[-1 +1;0 -1;-2 -1;0 +1;+1 0];
Un altro possibile metodo per creare delle matrici è definendo prima i vettori che le compongono, e poi unendo i due vettori per creare cr eare la matrice di interesse. i nteresse. Costruiamo ora la matrice precedentemente descritta, ma unendo i vettori colonna che la caratterizzano. nuR1=[-1;0;-2;0;+1]; nuR2=[+1;-1;-1;+1;0]; nu=[nuR1 nuR2];
Lo stesso può essere fatto definendo prima i vettori riga e unendoli in colonne: nuCO=[-1 +1]; nuCO2=[0 -1]; nuH2=[-2 -1]; nuH2O=[0 +1]; nuCH3OH=[+1 0]; nu=[nuCO;nuCO2;nuH2;nuH2O;nuCH3OH];
Vi sono altri comandi, che permettono di definire delle matrici o dei vettori speciali. Essi sono riassunti nella seguente tabella: Linea di comando: eye(n)
Descrizione: Crea una matrice identità n x n Crea una matrice n x n avente tutti gli elementi uguali a 1 Crea una matrice m x n avente tutti gli elementi uguali a 1 Crea una matrice n x n avente tutti gli elementi uguali a 0 Crea una matrice m x n avente tutti gli elementi uguali a 0
ones(n) ones(m,n) zeros(n) zeros(m,n)
Ora che abbiamo imparato a definire delle variabili scalari, dei vettori e delle matrici, possiamo vedere come effettuare operazioni tra questi elementi.
6
Operazioni tra scalari Come primo argomento, affrontiamo il più semplice, ossia le operazioni tra scalari. Le operazioni principali tra scalari, in Matlab, si fanno utilizzando i seguenti simboli: a=5; b=6; c=a+b;
% somma tra due scalari
c=a-b; c=a*b; c=a/b; c=a^b;
% % % %
differenza tra due scalari prodotto tra due scalari divisione tra due scalari elevamento a potenza tra due scalari
Possono ovviamente essere essere applicate ad uno scalare un’ampia serie di funzioni matematiche (esponenziali, logaritmiche, goniometriche, etc etc). In seguito è presente l’elenco di questi comandi: comandi: Funzione
Scopo
ceil(x) fix(x) floor(x) round(x) sign(x)
Arrotonda per eccesso all’intero più vicino vicino Arrotonda al numero intero più vicino verso 0 Arrotonda per difetto all’intero più vicino vicino Arrotonda al numero intero più vicino Determina il segno della quantità x
exp(x) sqrt(x) log(x) log10(x) abs(x) angle(x) conj(x) imag(x) real(x) cos(x) cot(x) csc(x) sin(x)
Calcola il numero di Nepero elevato alla x Calcola la radice quadrata di x Calcola il logaritmo naturale di x Calcola il logaritmo in base 10 di x Calcola il valore assoluto di x Calcola l’angolo di un numero complesso x x Calcola il complesso coniugato di un numero complesso x Determina la parte immaginaria di un numero complesso x Determina la parte reale di un numero complesso x Calcola il coseno di x Calcola la cotangente di x Calcola la cosecante di x Calcola il seno di x
sec(x) tan(x) acos(x) acot(x) acsc(x) asin(x) asec(x) atan(x) cosh(x) coth(x) csch(x) sinh(x) sech(x) tanh(x) acosh(x)
Calcolalalatangente secante di Calcola dixx Calcola l’arcocoseno di x x Calcola l’arcocotangente di x x Calcola l’arcocosecante di x x Calcola l’arcoseno di x x Calcola l’arcosecante di x x Calcola l’arcotangente di x x Calcola il coseno iperbolico di x Calcola la cotangente iperbolica di x Calcola la cosecante iperbolica di x Calcola il seno iperbolico di x Calcola la secante iperbolica di x Calcola la tangente iperbolica di x Calcola l’arcocoseno iperbolico di x x 7
acoth(x) acsch(x) asinh(x) asech(x) atanh(x)
Calcola l’arcocotangente iperbolica di x x Calcola l’arcocosecante iperbolica di x x Calcola l’arcoseno iperbolico di x x Calcola l’arcosecante l’arcosecante iperbolica di x x Calcola l’arcotangente iperbolica di x x
Operazioni con operare i vettori e con le matrici Prima di vedere come matematicamente con dei vettori, vediamo alcuni comandi di Matlab Matl ab utili, che permettono di determinarne alcune caratteristiche importanti.
Selezione di elementi Ad esempio, alcuni elementi di un vettore potrebbero non interessarci, e potremmo dunque essere interessati a considerare una sola porzione del vettore stesso. Ammettiamo di considerare un vettore avente 8 elementi, ma che ci interessino i nteressino solamente gli elementi che vanno dal terzo al quinto. Tali elementi possono essere selezionati con il seguente comando: v=[1 2 3 4 5 6 7 8]; v(3:5) ans = 3
4
5
In particolar modo, se fossimo interessati al valore di uno specifico elemento del vettore, basterebbe mettere tra parentesi la posizione corrispondente a quell’elemento, e Matlab ce ne restituisce il valore: valore: v=[10 20 30 40 50 60 70 80]; v(5) ans = 50
Con le matrici ci si può comportare in modo del tutto analogo. Consideriamo una matrice 3 x 3, e ammettiamo di voler considerare solamente i primi due elementi della seconda riga. È possibile fare questo utilizzando il seguente comando: A=[1 2 3;4 5 6;7 8 9]; A(2,1:2) ans = 4
5
Il primo elemento presente tra parentesi corrisponde alla riga nella quale vogliamo considerare gli elementi. Il secondo elemento (dopo la virgola) corrisponde alla selezione degli elementi che vogliamo prendere in quella riga. Può essere effettuata un’operazione un ’operazione analoga per selezionare gli elementi appartenenti ad una determinata colonna: A(1:2,2) ans =
8
2 5
Come possiamo operare se vogliamo considerare tutti gli elementi di una riga o di una colonna? In questo caso, invece che imporre una selezione di elementi, basta specificare la riga o la colonna che si vogliono considerare, e utilizzare il simbolo : (che consente di prendere tutti gli elementi in quella riga o in quella colonna) A(:,2) ans = 2 5 8 A(1,:) ans = 1
2
3
Se volessimo invece considerare uno specifico valore all’interno della matrice, matr ice, basta specificarne la posizione (riga, colonna). Ad esempio, se nella matrice A volessimo selezionare l’elemento 6, basterebbe specificare che si trova nella seconda riga e nella terza colonna: A(2,3) ans = 6
Determinazione delle dimensioni Nella sezione precedente abbiamo visto come selezionare degli specifici elementi di un vettore o di una matrice. In alcuni contesti risulta essere utile anche saper determinare le dimensioni di specifici vettori o di specifiche matrice. Per determinare il numero di elementi contenuti in un determinato vettore, è possibile utilizzare il comando length: v=1:1e-3:10; length(v) ans = 9001
È possibile effettuare una procedura analoga nel caso delle matrici, utilizzando però questa volta il comando size. Tale comando restituisce come output due diversi valori: il primo corrisponde al numero delle righe di della matrice, mentre il secondo corrisponde al numero delle sue colonne: A=[1 2 3;4 5 6;7 8 9]; size(A) ans = 3
3
9
Ricerca di massimi e minimi Ammettiamo di voler ricercare gli elementi massimi e gli elementi minimi presenti in un determinato vettore, oppure in una determinata matrice. È possibile fare questo utilizzando i comandi max e min. Se applichiamo questi operatori ad un vettore, ci restituiscono immediatamente l’elemento più grande (e più piccolo) del vettore stesso: v=[-9 -5 -8 1 -6 7 7 2 6]; min(v) ans = -9 max(v) ans = 7
Applicando i comandi min e max ad una matrice otteniamo invece dei vettori riga che contengono, per ogni posizione, rispettivamente gli elementi minimi e massimi delle colonne associate a quella posizione. Ad esempio, se ho una matice 3 x 3, ottengo nelle terze terze posizioni del vettore riga rispettivamente l’elemento più grande e l’elemento più piccolo della terza colonna: colonna: A=[-9 -5 -8; 1 -6 7; 7 2 6]; min(A) ans = -9
-6
-8
2
7
max(A) ans = 7
Per trovare gli elementi massimi e minimi di tutta la matrice, basta applicare due volte i comandi max e min, e utilizzare così in modo congiunto le due regole che abbiamo visto ora: min(min(A)) ans = -9 max(max(A)) ans = 7
Un altro comando utile, nel caso delle matrici, è la determinazione del suo rango. Basta utilizzare il comando
rank.
10
rank(A) ans = 3
Somma degli elementi Se si desidera sommare tutti gli elementi che compaiono in un determinato vettore o in una determinata sum, al quale viene dato come input il nome del vettore o della matrice. matrice, utilizzare il comando Nel caso basta di vettori, il comando offre come dato di output un numero, corrispondente alla somma di tutti gli elementi del vettore:
v=[-9 -5 -8 1 -6 7 7 2 6]; sum(v) ans = -5
Se applichiamo invece il comando ad una matrice, otteniamo come output un vettore riga, in cui ciascun elemento corrisponde alla somma degli elementi della matrice presenti nella medesima colonna:
A=[-9 -5 -8; 1 -6 7; 7 2 6]; sum(A) ans = -1
-9
5
Anche in questo caso, come con i comandi min e max, se si vuole determinare la somma degli elementi di tutta la matrice bisogna applicare il comando sum due volte: sum(sum(A)) ans = -5
Trasposizione Una matrice o un vettore possono essere trasposti utilizza utilizzando ndo ‘ A=[1 2 3; 4 5 6; 7 8 9]; A' ans = 1 2 3
4 5 6
7 8 9
v=[1 2 3]; v'
11
ans = 1 2 3
Determinante di una matrice In Matlab il determinante di una matrice può essere calcolato utilizzando il comando det. A=[3 0 4;4 2 6;8 1 0]; det(A) ans = -66
Inversione di una matrice In Matlab una matrice può semplicemente essere invertita utilizzando il comando inv. A=[3 0 4;4 2 6;8 1 0]; inv(A) ans = 0.0909 -0.7273 0.1818
-0.0606 0.4848 0.0455
0.1212 0.0303 -0.0909
A livello teorico, l’operazione effettuata per calcolare c alcolare l’inversa di una matrice quadrata è la seguente: seguente:
⋯ ⋯ 1 … ̿ ⋮ ⋮ …⋱ ⋮ ⇒ −−̿ det( )̿ ⋮ ⋮ ……⋱ ⋮ , 1+
Nella precedente formula, la grandezza corrisponde al minore complementare dell’elemento (i,j). In altri termini, corrisponde al determinante della matrice che c he si otterrebbe eliminando dalla matrice di partenza la i-esima riga e la j-esima colonna.
Operazioni tra matrici/vettori e scalari Le operazioni che abbiamo precedentemente visto per gli scalari scal ari possono essere utilizzate anche se si vuole fare un’operazione tra un vettore/matrice ed uno scalare scalare (tranne che per l’elevamento a potenza, che che funziona diversamente). In particolar modo, vigono le seguenti equivalenze:
: ̿ ; : ̿ ̿ ̿ ∗ ∗ ∗
12
//̿ // //
Complessivamente, effettuare un’operazione tra una matrice ed uno scalare corrisponde ad effettuare tale procedura matematica tra i diversi elementi della matrice e lo scalare stesso. Dunque, se si parte con una matrice avente dimensioni n x m, si ottiene infine una matrice avente sempre dimensioni n x m. Le stesse considerazioni valgono utilizzando le funzioni matematiche goniometriche, esponenziali e logaritmiche: esse vengono applicate indipendentemente a ciascun elemento della matrice, m atrice, ottenendo così sempre una matrice n x m.
Operazioni tra matrici e vettori Come visto nel corso di Algebra Lineare, le operazioni tra matrici e vettori seguono delle regole diverse rispetto alle operazioni tra scalari. Analizziamo dunque il funzionamento di ciascuna operazione: Somma e sottrazione Due matrici o due vettori possono essere sommati o sottratti se e solo se hanno le stesse dimensioni (le dimensioni sono riportate sotto i vettori e le matrici):
⃗1, ± 1, 1, ⃗ ,, ⃗ ̿1± ±±,, 1 ,, ⃗ 1̿
Se le dimensioni delle matrici o dei vettori non fossero le medesime, Matlab restituirebbe un messaggio di errore. La somma di due matrici o di due vettori consente di sommare gli elementi che occupano le medesime posizioni, in modo tale di ottenere come risultato una matrice o un vettore avente le stesse dimensioni degli elementi di partenza. A=[1 2 3;4 5 6;7 8 9]; B=[10 11 12;13 14 15;16 17 18]; A+B ans = 11 17 23
13 19 25
15 21 27
-9 -9 -9
-9 -9 -9
A-B ans = -9 -9 -9
Quando si effettua la somma o la sottrazione di due vettori, è importante controllare non solo che abbiano le medesime dimensioni, ma anche che siano entrambi dei vettori riga o dei vettori colonna. Se si effettuasse 13
la somma tra un vettore riga ed un vettore colonna, anche a nche se con un medesimo numero di elementi, Matlab restituirebbe un messaggio di errore: a=[1 2 3]; b=[1;2;3]; a+b ??? Error using ==> plus Matrix dimensions must agree.
Prodotto tra vettori e matrici In algebra lineare, il prodotto matriciale è definito nel seguente modo:
, ̿ ∗ ,, , , ̿ , =∑
Dalla precedente formula, notiamo subito come il numero delle colonne della prima matrice debba essere uguale al numero di righe della seconda. Il risultato è una matrice che ha il numero di righe della prima matrice e il numero di colonne della seconda. Questo è molto importante. Infatti, se in Matlab effettuiamo un prodotto matriciale fra due matrici che non rispettano le condizioni ora esposte, esce un messaggio di errore. Dalla precedente espressione, notiamo subito che se moltiplichiamo per se stesso un vettore riga o un vettore colonna uscirà un messaggio di errore. Se moltiplichiamo un vettore riga per un vettore colonna (delle medesime dimensioni), otterremo come risultato del prodotto uno scalare. Se moltiplichiamo un vettore colonna per un vettore riga, otteniamo come risultato dell’operazione una matrice n x n, dove n è il numero di elementi presenti in ciascun vettore. A=[1 2;3 4;5 6;7 8]; B=[1 2 3 4;5 6 7 8]; A*B ans = 11 23 35 47
14 30 46 62
17 37 57 77
20 44 68 92
Come esempio del prodotto tra un vettore riga e un vettore colonna, effettuiamo la determinazione del peso molecolare medio di una corrente gassosa. Consideriamo una corrente gassosa avente la seguente composizione:
Composto
Peso molecolare (g/mol) 2 18 28 44
∑∑= ∙ 14
Frazione molare 0.2 0.4 0.15 0.25
… ; ̅ ⋮ ⟹ ∑∑= ∙ ∗ ̅
%g/mol PM=[2 18 28 44]; %g/mol x=[0.2;0.4;0.15;0.25]; PMmix=PM*x PMmix = 22.8000
Se moltiplicassimo invece il vettore frazioni molari per il vettore masse molecolari, otterremmo una matrice n x n contenente il prodotto di ciascun elemento di x per ciascun elemento di PM: x*PM ans = 0.4000 0.8000 0.3000 0.5000
3.6000 7.2000 2.7000 4.5000
5.6000 11.2000 4.2000 7.0000
8.8000 17.6000 6.6000 11.0000
Divisione tra matrici La trattazione sulla divisione tra matrici m atrici risulta essere utile nel ccaso aso si volessero effettuare delle risoluzioni di sistemi lineari. Immaginiamo di avere un sistema lineare strutturato come segue:
⋯ … ̿ ⋮ ⋮ …⋱ ⋮ ; ̅ ⋮ ; ⋮ ⟹ ̿ ∗ ̅ ̿ ̅
Se conosciamo la matrice dei coefficienti e e il vettore dei termini noti , è possibile calcolare il vettore utilizzando due diversi metodi. delle incognite utilizzando Il primo metodo è quello di riduzione di Gauss. Per utilizzare questo metodo, basta utilizzare la divisione a sinistra, nel seguente modo: A=[0 4 6;5 1 9;7 10 5]; b=[2;5;3]; x=A\b x = 0.2927 -0.1073 0.4049
Un altro metodo per risolvere il i l sistema lineare consiste nell’utilizzo della matrice inversa: i nversa:
[ −−̿ ∗ ]̿ ∗ ̅ [ −−̿ ∗ ] 15
̿∗ ̅ [ −−̿ ∗ ]
x=inv(A)*b x = 0.2927 -0.1073 0.4049
Operazioni elemento per elemento Nella trattazione delle operazioni tra vettori e matrici, abbiamo visto come la somma e la sottrazione si applichino elemento per elemento. In altri termini, l’elemento che occuperà la posizione pos izione (i,j) nella nuova matrice corrisponde alla somma o alla sottrazione degli elementi che occupano le medesime posizioni nelle matrici di partenza. Abbiamo visto, invece, che il prodotto e la divisione tra matrici seguono delle regole diverse, definite dalla teoria dell’algebra lineare. lineare. La domanda che ci poniamo è: esiste un modo per effettuare una procedura simile a quella di somma e sottrazione, ma utilizzando prodotto, divisione ed elevamento a potenza? La risposta è fortunatamente sì: basta utilizzare le operazioni elemento per elemento. Queste possono essere fatte anteponendo un punto all’operatore che vuole essere utilizzato (prodotto, divisione o elevamento a potenza). potenza).
⋯ ̿ ⋮ ⋮ ∗…⋱⋮ ; ∗ ⋮⋯ ⋮ ∗ ⋯…⋱ ⋮ .̿∗ ∗∗⋮ ∗∗⋮ ……⋱ ∗∗⋮ / / ⋯ / / / … / .̿/ /⋮ /⋮ …⋱ /⋮ ^ ^ ⋯ ^
.̿ ^^ ^⋮ ^⋮ …⋱ ^⋮
Come possiamo vedere nelle precedenti espressioni, per effettuare delle operazioni elemento per elemento le matrici o i vettori di partenza devono avere esattamente le stesse dimensioni. Ad esempio, non risulta possibile effettuare un’operazione elemento per elemento elemen to che coinvolge un vettore riga e un vettore colonna. Per vedere un esempio con i vettori, consideriamo lo stesso esempio di prima, ossia quello del calcolo del peso molecolare medio di una corrente gassosa. Stavolta, invece che definire il vettore dei pesi molecolari come un vettore riga, e il vettore delle frazioni molari come un vettore colonna, decidiamo di definire entrambi i vettori come vettori riga, e di utilizzare il prodotto elemento per elemento e il comando sum per effettuare il calcolo del peso molecolare medio: PM=[2 18 28 44]; % g/mol x=[0.2 0.4 0.15 0.25];
16
PMmix=sum(PM.*x)
PMmix =
22.8000
Cicli for, if, while Nell’ambito della creazione di programmi, i cicli for, if e while assumono una grandissima importanza, per effettuare le operazioni più disparate. Analizziamo nel dettaglio cosa permette di fare ciascuno di questi cicli, e come possono essere utilizzati nei tipici problemi dell’Ingegneria Chimica. Chimica.
Ciclo for
Consideriamo un vettore, avente lunghezza n. Un ciclo for ci consente di effettuare delle operazioni su tale vettore, facendo variare l’indice dopo ogni operazione in modo tale che quest’ultima venga ripetuta per ciascun elemento del vettore stesso. I cicli for risultano essere dunque di estrema utilità quando vogliono essere effettuate delle medesime operazioni per i diversi elementi che caratterizzano dei vettori. Si pensi ad esempio alla determinazione di un equilibrio termodinamico. Se siamo interessati a valutare le composizioni all’equilibrio a diverse T, basta creare un vettore vettore di T desiderate e far variare la temperatura stessa mediante un ciclo for, ripetendo ad ogni step le medesime operazioni di determinazione dell’equilibrio termodinamico. termodinamico. Vediamo un esempio applicato alle matrici. Ammettiamo di voler vo ler calcolare il prodotto tra due diverse matrici A e B, senza però ricorrere a *. In altri termini, vogliamo creare noi un algoritmo che permetta di calcolare il prodotto tra due matrici. Questo può essere fatto nel seguente modo:
, ̿ ∗ ,, , , ̿ , =∑
Come puoi notare, l’operazione da fare risulta essere la medesima per ciascun elemento (i,j) della matrice. Scrivere dunque la stessa operazione per ciascun elemento della matrice risulterebbe essere poco pratico. Meglio inserire il comando all’interno di due cicli for diversi: il primo che faccia variare le i (fino al numero totale di righe), il secondo che faccia variare le j (fino al numero totale di colonne.
A=[1 2 3 4;5 6 7 8]; B=[5 9 6;4 7 2;11 24 5;4 7 6];
% Creazione di una matrice 2x4 % Creazione di una matrice 4x3
% La matrice risultante dall'operazione di prodotto matriciale avrà 2 righe % e 3 colonne. Come prima cosa, utilizziamo gli appositi comandi di Matlab
17
% per determinare le dimensioni delle due matrici. a=size(A); b=size(B); % % % %
Le dimensioni di nostro interesse (quelle da inserire all'interno del ciclo for) sono solamente il numero di righe di A e il numero di colonne di B. Selezioniamo dunque il primo elemento di a e il secondo elemento di b.
N=a(1); M=b(2); % % % %
Creiamo una matrice C, risultato dell'operazione di prodotto vettoriale, che abbia il numero di righe e il numero di colonne desiderato, e composta da soli zeri. Nel successivo passaggio, andremo a sostituire gli zeri con gli elementi di nostro interesse:
C=zeros(N,M); % Implementiamo due cicli for, che permettano di calcolare ciascun elemento % della nuova matrice. for i=1:N for i=1:N for j=1:M for j=1:M C(i,j)=sum(A(i,:).*B(:,j)'); % % % % % %
Con questa scrittura abbiamo effettuato il prodotto elemento per elemento della i-esima riga di A con la j-esima colonna di B. La j-esima colonna di B è stata trasposta per ottenere un vettore riga, e per poter così effettuare l'operazione di prodotto elemento per elemento. Il risultato del prodotto è un nuovo vettore, i cui elementi sono stati sommati con il comando sum.
end end C C = 62 158
123 311
49 125
Da questo algoritmo possiamo notare la struttura del ciclo for. In ciascun ciclo, si specificano gli estremi tra cui varia la variabile (nel caso di i, tra 1 e N, mentre nel caso di j tra 1 e M). Ciascun ciclo for viene quindi concluso mediante un end. Nel nostro specifico caso, prima viene fissato un valore di i, poi con il ciclo for interno si fa la stessa operazione per tutte le colonne (j viene fatto variare). Dunque, cambiando valore di i, si cambia riga, e viene vi ene nuovamente effettuata la medesima operazione per tutte le colonne. In questo modo, variano i e j, riusciamo ad effettuare la medesima operazione a tutti gli elementi della matrice di nostro interesse. Un altro utilizzo dei cicli for è quello mirato alla risoluzione di equazioni differenziali. Matlab contiene numerose funzioni che permettono di risolvere sistemi di equazioni differenziali (e le vedremo più avanti in
18
questa guida). Ammettiamo di voler risolvere una semplice equazione differenziale a livello numerico (discretizzandola). Prendiamo una reazione chimica caratterizzata da una cinetica del primo ordine:
⟶ , 0.01 2
L’espressione che permette di valutare le concentrazione di A nel tempo è ricavabile risolvendo il seguente problema di Cauchy (ammettendo di lavorare in un reattore batch):
00 ∆∆ ; 1 1 ∆
L’equazione differenziale, accompagnata dalla sua condizione al contorno, potrebbe essere tranquillamente integrata matematicamente, per giungere in questo modo ad una soluzione analitica (esatta). Ammettiamo però di voler procedere in via numerica, e di voler determinare l’andamento di nel tempo mediante una procedura di discretizzazione. Come prima cosa, effettuiamo una discretizzazione discre tizzazione dell’intervallo temporale nel quale vogliamo stimare i valori di concentrazione. Ciascun elemento dell’intervallo temporale è distante dal precedente di una grandezza pari a .
∆ 0 ∆ 2∆ … ∆ 2∆ …
A questo vettore di tempi sarà associato un vettore ci concentrazioni, ciascuna della quale è valutata nel relativo istante temporale:
Possiamo impostare un ciclo for che funziona nel seguente modo:
%% Risoluzione di un'equazione differenziale con un ciclo for clc clear all
19
close all % Dati: k=0.01; CA0=2;
% Hz % mol/m^3
% Risoluzione: % Generiamo il vettore temporale, che nel nostro caso ha una spaziatura di % 0.01 s e un valore massimo di 1000 s. dt=1e-3; t=0:dt:6e2; % % % %
Generiamo dei corrispondenti vettori riga di concentrazioni di A e di variazioni infinitesime di concentrazioni di A, aventi la medesima lunghezza di t ma costituiti solamente da 0. I vari elementi di questi vettori saranno poi modificati lungo il ciclo for:
CA=zeros(1,length(t)); DCA=zeros(1,length(t)); % Impostiamo lo step (1) dell'equazione differenziale: CA(1)=CA0; DCA(1)=-k*CA(1)*dt; % % % % %
Impostiamo i successivi step dell'equazione differenziale, mediante un ciclo for. All'i-esimo step, determiniamo la concentrazione di A come somma della concentrazione di A allo step precedente e la variazione di concentrazione di A dello step precedente. Dunque, per il nuovo step, determiniamo la nuova variazione di concentrazione di A.
for i=2:length(t) for i=2:length(t) CA(i)=CA(i-1)+DCA(i-1); DCA(i)=-k*CA(i)*dt; end % Questi comandi servono a generare il grafico: vedremo più avanti nella % guida il loro funzionamento 'Name', ,'Andamento della concentrazione di A', A','NumberTitle', 'NumberTitle' ,'off') 'off') figure('Name' figure( plot(t,CA) grid on 'C_{A}') ) legend('C_{A}' legend( xlabel('t xlabel( 't [s]' [s]') ) 'Concentrazione di A [mol/m_{3}]' [mol/m_{3}]') ) ylabel('Concentrazione ylabel( title('Andamento title( 'Andamento della concentrazione di A' A') )
20
Proseguiamo ora con la nostra trattazione, e analizziamo il ciclo if.
Ciclo if Prima di effettuare la trattazione del ciclo if, introduciamo una serie di connettivi logici che risulteranno essere funzionali nella nostra analisi.
Connettivo logico
Significato del connettivo logico
< > = ==
Maggiore o uguale Uguale Diverso. Il primo simbolo è la tilde (può essere scritta con alt + 126 sul tastierino numerico) Not And Or
~= ~ & |
Il ciclo if permette di eseguire delle istruzioni diverse in funzione della casistica esaminata. In particolar modo, se determinate condizioni di nostro interesse sono verificate, diciamo al programma di proseguire in un determinato modo. Se tali condizioni non dovessero invece essere verificate, diciamo al programma di proseguire in modo diverso.
21
Vediamone un esempio applicativo, prendendo in esame la struttura precedentemente creata per effettuare il prodotto matriciale. Come abbiamo visto precedentemente, dal punto di vista teorico è possibile effettuare il prodotto tra due matrici o tra due vettori se e solo se il numero di colonne della prima matrice è uguale al numero di righe della seconda. Nel programma creato in precedenza, possiamo implementare un ciclo if, che ci restituisca un messaggio di errore nel caso in cui le dimensioni delle due matrici non siano compatibili. Per il messaggio di errore utilizzeremo il comando disp, che permette di visualizzare sulla Command Window la stringa che viene racchiusa tra parentesi tonde e tra virgolette ‘ ‘. ‘. Come nel caso del ciclo for, il ciclo if va chiuso mediante un “end”. “end”. A=[1 2 3 4;5 6 7 8]; B=[5 9 6;4 7 2;11 24 5;4 7 6]; a=size(A); b=size(B); % % % % % %
Prima diinnanzitutto procedere con operazionieffettuare già precedentemente descritte, vediamo se le è possibile l'operazione di prodotto tra la matrice A e la matrice B. Sappiamo che è possibile fare tale operazione se il numero di colonne di A è uguale al numero di colonne di B. Se tale condizione è verificata, possiamo procedere con l'algoritmo, altrimenti facciamo uscire un messaggio di errore che ci avvisi del fatto che c'è qualcosa che non va.
if if a(2)==b(1) a(2)==b(1) N=a(1); M=b(2); C=zeros(N,M); for i=1:N i=1:N for for j=1:M for j=1:M C(i,j)=sum(A(i,:).*B(:,j)');
22
end
end
else 'Non è possibile effettuare l''operazione' l''operazione') ) disp('Non disp( end C C =
62
123
49
158
311
125
Nel caso appena visto le due matrici sono adatte per l’operazione di prodotto matriciale, e dunque l’operazione l’operazio ne viene effettuata. Vediamo ora un caso in cui le due matrici non sono tra di loro compatibili. A=[1 2 3 4 5;6 7 8 9 10]; B=[5 9 6;4 7 2;11 24 5;4 7 6]; a=size(A); b=size(B); if a(2)==b(1) if a(2)==b(1) N=a(1); M=b(2); C=zeros(N,M); for i=1:N i=1:N for for j=1:M for j=1:M C(i,j)=sum(A(i,:).*B(:,j)'); end end else disp('Non disp( 'Non è possibile effettuare l''operazione' l''operazione') ) end Non è possibile effettuare l'operazione
Se volessimo essere ancora più precisi, potremmo avvalerci della struttura if-elseif. In particolar modo, immaginiamo che oltre a voler sapere che l’operazione non può essere effettuata, vogliamo anche sapere se il numero delle colonne di A è maggiore del numero delle righe di B, o viceversa. Questo può essere effettuato mediante il seguente algoritmo. A=[1 2 3 4 5;6 7 8 9 10]; B=[5 9 6;4 7 2;11 24 5;4 7 6];
23
a=size(A); b=size(B); if a(2)==b(1) a(2)==b(1) if N=a(1); M=b(2); C=zeros(N,M); for for i=1:N i=1:N for j=1:M for j=1:M C(i,j)=sum(A(i,:).*B(:,j)'); end
end
elseif elseif a(2)>b(1) a(2)>b(1) 'Non è possibile effettuare l''operazione: il numero di colonne di A è disp('Non disp( maggiore del numero di righe di B') B' ) elseif a(2)0 if (q2+sqrt(D))>0 && (-q2+sqrt(D))>0 Z1=(-q2+sqrt(D))^(1/3)+(-(q2+sqrt(D))^(1/3))-a3; elseif (q2+sqrt(D))>0 && (-q2+sqrt(D))0 Z1=(-(+q2-sqrt(D)))^(1/3)+(-(q2+sqrt(D))^(1/3))-a3; elseif (q2+sqrt(D))
View more...
Comments