28.03.2015 Views

Introduzione a Scilab

Introduzione a Scilab

Introduzione a Scilab

SHOW MORE
SHOW LESS

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>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!