Introduzione a Scilab
Introduzione a Scilab
Introduzione a Scilab
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Contenuto<br />
<strong>Introduzione</strong> a <strong>Scilab</strong><br />
Fabio Checconi<br />
7 novembre 2004<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Contenuto<br />
Contenuto<br />
1 Il linguaggio<br />
Tipi fondamentali<br />
Aggregati<br />
2 Sistemi lineari<br />
3 Equazioni differenziali<br />
4 Simulazione<br />
Risposte temporali<br />
Scicos<br />
5 Programmazione<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Contenuto<br />
Contenuto<br />
1 Il linguaggio<br />
Tipi fondamentali<br />
Aggregati<br />
2 Sistemi lineari<br />
3 Equazioni differenziali<br />
4 Simulazione<br />
Risposte temporali<br />
Scicos<br />
5 Programmazione<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Contenuto<br />
Contenuto<br />
1 Il linguaggio<br />
Tipi fondamentali<br />
Aggregati<br />
2 Sistemi lineari<br />
3 Equazioni differenziali<br />
4 Simulazione<br />
Risposte temporali<br />
Scicos<br />
5 Programmazione<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Contenuto<br />
Contenuto<br />
1 Il linguaggio<br />
Tipi fondamentali<br />
Aggregati<br />
2 Sistemi lineari<br />
3 Equazioni differenziali<br />
4 Simulazione<br />
Risposte temporali<br />
Scicos<br />
5 Programmazione<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Contenuto<br />
Contenuto<br />
1 Il linguaggio<br />
Tipi fondamentali<br />
Aggregati<br />
2 Sistemi lineari<br />
3 Equazioni differenziali<br />
4 Simulazione<br />
Risposte temporali<br />
Scicos<br />
5 Programmazione<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Contenuto<br />
Cos’è <strong>Scilab</strong><br />
<strong>Scilab</strong> è un’alternativa a MATLAB a sorgenti aperte,<br />
sviluppata dall’INRIA e liberamente scaricabile da Internet.<br />
Offre un linguaggio simile a quello di MATLAB e numerose<br />
routine dedicate ai problemi di controllo.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Tipi fondamentali<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
I tipi fondamentali manipolati da <strong>Scilab</strong> sono:<br />
scalari<br />
booleani<br />
stringhe<br />
polinomi<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Tipi fondamentali<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
I tipi fondamentali manipolati da <strong>Scilab</strong> sono:<br />
scalari<br />
booleani<br />
stringhe<br />
polinomi<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Tipi fondamentali<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
I tipi fondamentali manipolati da <strong>Scilab</strong> sono:<br />
scalari<br />
booleani<br />
stringhe<br />
polinomi<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Tipi fondamentali<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
I tipi fondamentali manipolati da <strong>Scilab</strong> sono:<br />
scalari<br />
booleani<br />
stringhe<br />
polinomi<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Polinomi<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
La funzione poly(r,’x’) crea un polinomio nella variabile x<br />
che ha gli elementi del vettore r come radici.<br />
Per introdurre p(x) = x 2 − 3x + 2 = (x − 1)(x − 2) si può<br />
usare:<br />
-->p=poly([1 2],’x’);<br />
oppure, più comodamente,<br />
-->x=poly(0,’x’);<br />
-->p=x^2-3*x+2;<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Polinomi: secondo esempio<br />
Tipi fondamentali<br />
Aggregati<br />
Si può usare il monomio x della slide precedente per creare<br />
una funzione razionale fratta. Ad esempio se si vuole<br />
si può scrivere<br />
f (x) =<br />
x − 1<br />
x 3 + 3x 2 − 2x + 2<br />
-->f=(x-1)/(x^3+3*x^2-2*x+2);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Aggregati<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
È possibile aggregare oggetti appartenenti ai tipi fondamentali<br />
in matrici oppure in liste.<br />
Quindi a differenza di MATLAB la matrice non è un tipo<br />
fondamentale; si possono creare matrici di scalari, di booleani,<br />
di stringhe e di polinomi.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Liste<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
Una lista è un vettore di oggetti di tipo eventualmente non<br />
omogeneo. Possono far parte delle liste anche oggetti di tipo<br />
aggregato.<br />
-->l=list([1 2 3],’testo’,[1 2;3 4]);<br />
crea una lista contenente un vettore, una stringa ed una<br />
matrice.<br />
Per accedere un elemento della lista si usa la stessa notazione<br />
usata per gli elementi di un vettore:<br />
-->s=l(2);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Liste con tipo<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Tipi fondamentali<br />
Aggregati<br />
Una lista con tipo è una lista i cui elementi sono indirizzati<br />
tramite un nome specificato al momento della creazione, con<br />
la funzione tlist.<br />
-->tl=tlist([’tipolista’ ’primo’ ’secondo’],<br />
[1 2 3],’testo’);<br />
crea una lista di tipo ’tipolista’ avente per elementi un<br />
vettore ed una stringa.<br />
Si può accedere, per esempio, alla stringa con la notazione<br />
-->tl(’secondo’);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Sistemi lineari a tempo continuo<br />
Un sistema lineare stazionario a tempo continuo del tipo<br />
ẋ = Ax + Bu<br />
y = Cx + Du<br />
x(0) = x 0<br />
è rappresentato da una lista con tipo creata con la funzione<br />
syslin (i parametri D ed x0 sono facoltativi):<br />
-->sl=syslin(’c’,A,B,C,D,x0);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Sistemi lineari a tempo discreto<br />
Un sistema lineare stazionario a tempo discreto del tipo<br />
x(k + 1) = Ax(k) + Bu(k)<br />
y(k) = Cx(k) + Du(k)<br />
x(0) = x 0<br />
si rappresenta nel solito modo, specificando che è a tempo<br />
discreto con il primo parametro ’d’<br />
-->sl=syslin(’d’,A,B,C,D,x0);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Funzioni di trasferimento<br />
La funzione syslin può essere usata anche per descrivere un<br />
sistema nel dominio delle variabili s o z, specificando come<br />
parametro una funzione (o una matrice) di trasferimento:<br />
-->sl=syslin(dom,H);<br />
con dom=’c’ per un sistema a tempo continuo e dom=’d’ per<br />
un sistema a tempo discreto.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Cambiamento di rappresentazione<br />
Per passare dalla rappresentazione di un sistema sl nello<br />
spazio degli stati alla matrice di trasferimento si può usare la<br />
funzione ss2tf(sl).<br />
Per il passaggio inverso si usa tf2ss(sl).<br />
Si può notare che avere i polinomi come tipi predefiniti<br />
permette di ottenere la matrice di trasferimento dalla relazione<br />
G(s) = C(sI − A) −1 B:<br />
-->G=C*inv(s*eye()-A)*B;<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Definizione di una funzione<br />
Una funzione si può definire in linea con deff(). Per esempio<br />
f (t) = 3t + sin(2πt) si definisce come:<br />
-->deff(’[x]=f(t)’,’x=3*t+sin(2*%pi*t)’);<br />
Il primo argomento dichiara il nome della funzione e i<br />
parametri in ingresso ed uscita, mentre il secondo è il corpo<br />
vero e proprio.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Integrazione<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Un’equazione differenziale del tipo<br />
dy<br />
dt<br />
= f (t, y)<br />
y(0) = y 0<br />
si risolve con ode(y0,t0,t,f), in cui y0 è il vettore delle<br />
condizioni iniziali, t0 l’istante iniziale, t un vettore con i tempi<br />
per cui si vogliono le soluzioni ed f è la funzione di t ed y da<br />
integrare.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Esempio<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Per avere i valori di y(t) soluzione di<br />
dy<br />
dt<br />
= 3t + sin(2πt)<br />
y(0) = 0<br />
per t = 1, 2, . . . , 10 si può scrivere:<br />
-->deff(’x=f(t,y)’,’x=3*t+sin(2*%pi*t)’);<br />
-->y=ode(0,0,1:10,f);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Esempio: risposta di un sistema lineare<br />
Data la rappresentazione nello spazio degli stati di un sistema<br />
SISO sl si vuole risolvere<br />
dx<br />
dt<br />
= Ax + Bu<br />
Rispetto al caso precedente f è funzione di x ma anche di u:<br />
invece di specificare f come funzione si specifica come lista di<br />
funzioni. La prima è quella da integrare e può chiamare le<br />
successive.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Esempio (continua)<br />
Per estrarre A, B, C e D da sl si scrive:<br />
-->[A,B,C,D]=abcd(sl);<br />
Si definiscono u e la funzione da integrare e si crea la lista:<br />
-->deff(’x=u(t)’,’if t < 0 then x=0; else x=1; end’);<br />
-->deff(’x=sist(t,y,u)’,’x=A*y+B*u(t)’);<br />
-->l=list(sist,u);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Esempio (continua)<br />
Si può risolvere l’equazione, richiedendo il vettore degli stati<br />
per t = 0, . . . , 20 e calcolare le uscite corrispondenti:<br />
-->x=ode(sl(’x0’),0,0:20,l);<br />
-->y=C*x+D;<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Risposte temporali<br />
Scicos<br />
Risposta di un sistema a tempo continuo<br />
Per avere la risposta temporale ad un ingresso u agli istanti<br />
contenuti nel vettore t del sistema sl si usa la funzione csim:<br />
-->y=csim(u,t,sl);<br />
u può essere una funzione, un vettore contenente gli ingressi ai<br />
tempi in t, la stringa ’step’ per la risposta al gradino oppure<br />
’impuls’ per la risposta impulsiva.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Risposte temporali<br />
Scicos<br />
Risposta di un sistema a tempo discreto<br />
Per i sistemi a tempo discreto si usa flts:<br />
-->y=flts(u,sl);<br />
u è il vettore degli ingressi.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Disegnare un grafico<br />
Risposte temporali<br />
Scicos<br />
La funzione plot2d([x],y) disegna in un grafico i valori di y<br />
in corrispondenza di quelli di x. x è opzionale, sia x che y<br />
devono essere vettori colonna.<br />
Per esempio per disegnare f (t) = sin(2πt) per 0 ≤ t ≤ 1<br />
spaziando i campioni di 0.01 si usa:<br />
-->t=0:.01:1;<br />
-->f=sin(2*%pi*t);<br />
-->plot2d(t’,f’);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Risposta in frequenza<br />
Risposte temporali<br />
Scicos<br />
La risposta in frequenza di un sistema sl si può disegnare<br />
usando la funzione bode:<br />
-->bode(sl);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Scicos<br />
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Risposte temporali<br />
Scicos<br />
<strong>Scilab</strong> offre un toolbox analogo al Simulink di MATLAB per<br />
creare modelli di sistemi complessi e per simularli. Per<br />
richiamarlo si usa il comando scicos.<br />
L’interfaccia è la stessa di Simulink, ma i modelli creati non<br />
sono compatibili.<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Programmazione<br />
È possibile estendere le funzionalità dell’ambiente di <strong>Scilab</strong><br />
definendo nuove funzioni (come in parte si è già visto) in un<br />
linguaggio che offre costrutti simili a quelli di MATLAB.<br />
Nonostante gli M-file non siano completamente compatibili<br />
con la sintassi di <strong>Scilab</strong> si possono importare con<br />
mfile2sci(path).<br />
A differenza di MATLAB bisogna caricare in modo esplicito i<br />
file che contengono funzioni, con getf(path).<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Esempio: algoritmo di Leverrier<br />
Si vuole calcolare (zI − A) −1 con A, I ∈ R N mediante<br />
l’algoritmo di Leverrier:<br />
Inizializzazione:<br />
Ricorsione:<br />
Verifica:<br />
a 0 = 1<br />
M 1 = I .<br />
a k = − 1 k tr (AM k) , con k = 1, . . . , N<br />
M k+1 = a k I + AM k , con k = 1, . . . , N − 1.<br />
AM N + a N I = 0. (1)<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Esempio (continua)<br />
function [P,err]=leverr(A)<br />
z=poly(0,’z’);<br />
M=eye(A);<br />
N=M;D=1;<br />
for k=1:size(A,1)-1<br />
a=-trace(A*M)/k;<br />
M=A*M+a*eye();<br />
N=N*z+M;<br />
D=D*z+a;<br />
end<br />
a=-trace(A*M)/k;<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Il linguaggio<br />
Sistemi lineari<br />
Equazioni differenziali<br />
Simulazione<br />
Programmazione<br />
Esempio: usare la funzione<br />
Prima di usare la funzione bisogna salvarla in un file esterno,<br />
per esempio lev.sci e caricarla con:<br />
-->getf(’lev.sci’);<br />
A questo punto si può chiamare con:<br />
-->x=leverr(A);<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>
Riferimenti<br />
Riferimenti<br />
Download e documentazione: scilabsoft.inria.fr<br />
Fabio Checconi<br />
<strong>Introduzione</strong> a <strong>Scilab</strong>