Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduzione a Scicoslab
7 maggio 2010
Introduzione a Scicoslab
1 Introduzione 9
1.1 Origini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Piattaforme HW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 Toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Basi 11
2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Tipi di dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Indirizzamento di matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Manipolazione di matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5 Espressioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.6 Informazioni sul Workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.7 Accesso al sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.8 Salvataggio e richiamo di dati . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.9 Formati dei numeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.10 Altre caratteristiche di base . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.11 Stringhe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3 L’Help in linea 21
3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2 Il comando help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 Il comando apropos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 Calcolo scientifico 25
4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.2 Funzioni matematiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3 Numeri complessi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6 Matrici sparse 35
7 Semplici script 37
9 Analisi di dati 43
9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
9.1.0.1 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10 Polinomi 45
10.1 Scomposizione in termini di frazioni parziali . . . . . . . . . . . . . . . . . . 47
11 Interpolazione 51
12 Grafica 53
12.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
12.2 Figure e grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
12.3 Grafica 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
12.4 Esempi di grafica 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
12.5 Il comando subplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
12.6 Grafica 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
12.7 Stampa di immagini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
12.8 Animazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
13 Equazioni differenziali 61
14 Input/Output 65
14.1 Dati in formato ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
14.2 Emulazione comandi C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
14.3 Lettura file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
15 Strutture particolari 67
15.1 Matrici multidimensionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
15.2 Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
A Caricamento di funzioni 71
Introduzione
1.1 Origini
Scicoslab è un ambiente matematico e di simulazione numerica nato nei primi anni ’80
in ambito universitario. A differenza di altri sistemi nati contemporaneamente che sono
in seguito diventati prodotti commerciali (per esempio Matlab), Scicoslab, sviluppato in
collaborazione dall’IRIA (Institut National de Recherche en Informatique et Automatique)
e dalla ENPC (École Nationale des Ponts et Chaussée) è stato da subito reso disponibile
gratuitamente sul WEB.
Il suo sviluppo è garantito da un consorzio formato dalle più grosse compagnie francesi (e
non) e da diverse università, che ne supporano finanziariamente lo sviluppo.
La sua licenza, pur non essendo una licenza GPL, ne permette la copia e la distribuzione,
a condizione che non venga modificato. Questa limitazione serve soprattutto a garantire
che i risultati numerici del sistema restino affiabili, ciò che non può più essere garantito se
vengono apportate modifiche rilevanti al SW. Tutto il codice è distribuito in codice aperto,
ciò che permette a chiunque di poter controllare quanto fatto dal programma.
1.2 Piattaforme HW
Scicoslab gira su diverse piattaforme HW e diversi sistemi operativi, tra cui Il PC con
Windows e Linux, sistemi Unix, Sun e Mac. La maggior parte delle funzioni è scritta
utilizzando un codice ascii, ciò che permette uno scambio molto semplice tra le diverse
piattaforme.
1.3 Toolbox
La maggior parte delle funzionalità di un programma di questo genere sono già integrate
nella versione di base scaricabile dalla rete. Quidi, a differenza di altri prodotti dove
ogni nuova funzionalit‘a deve essere acquistata separatamente, qui ci sono già una grande
quantità di toolbox integrati nella versione base. Tra le varie caratteristiche della versione
base troviamo
• Calcolo matriciale
• Sistemi di controllo
• Controllo robusto
• Analisi di segnali
• Identificazione
• Grafica 2D e 3D
• Ottimizzazione
Inoltre, grazie alla filosofia di ambiente libero e aperto, molti sviluppatori esterni hanno
creato toolbox specifici che possono essere integrati quali contributi nell’ambiente di base.
Tra i contributi migliori troviamo ad esempio
Basi
2.1 Introduzione
• La stringa
• Il tipo booleano
• Il polinomio
2. I nomi delle variabili devono iniziare con una lettera e possono contenere lettere,
numeri e ’_’.
1. 2. 3.
4. 5. 6.
7. 8. 9.
−−>b = [ 1 , 2 , 3
−−>4,5,6
− − >7 ,8 ,9]
b =
1. 2. 3.
4. 5. 6.
7. 8. 9.
Per matrici di dimensione più grande è spesso utile utilizzare alcuni metodi o alcune
funzioni messe a disposizione da Scicoslab.
−−>x =1:10
x =
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
−−>y=l i nspace ( 0 , 1 , 1 1 )
y =
−−>x = 0 : 0 . 4 : 2
x =
−−>y=logspace ( − 1 , 1 , 1 0 )
y =
column 1 t o 6
column 7 t o 10
1. 0. 0.
0. 1. 0.
0. 0. 1.
−−>ones ( 2 , 3 )
ans =
1. 1. 1.
1. 1. 1.
−−>zeros ( 2 , 4 )
ans =
0. 0. 0. 0.
0. 0. 0. 0.
Quando si creano matrici molto grandi si può eliminare l’output terminando il comando
con “;”.
I comandi rand e grand creano matrici di numeri casuali di dimensioni n x n o n x m,
secondo varie ditribuzioni.
3.8
−−>x (6)= si n ( x ( 1 ) )
x =
−−>A= [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 , 8 , 9 ] ;
−−>r =[10 11 1 2 ] ;
−−>A=[A; r ]
A =
1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.
Scicoslab unisce tra di loro matrici e vettori. Si possono estrarre anche più elementi
contemporaneamente
−−>b=A ( 1 : 3 , : )
b =
1. 2. 3.
4. 5. 6.
7. 8. 9.
7. 8.
4. 5.
1. 2.
Altre operazioni speciali su una matrice sono descritte nella tabella 2.1
−−>s i z e ( a , 1 ) // numero r i g h e
ans =
3.
−−>[r , c ]= s i z e ( a ) // d i m e n s i o n i r i g h e e c o l o n n e
c =
3.
r =
3.
È possibile accedere ad un elemento di una matrice con un solo indice. In questo caso gli
elementi sono visti come una colonna sotto l’altra
−−>a = [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 , 8 , 9 ]
a =
1. 2. 3.
4. 5. 6.
7. 8. 9.
−−>a ( 4 )
ans =
2.
2.5 Espressioni
variabile = espressione
o semplicemente espressione
>> 100/3
ans =
33.3333
Con gli esempi precedenti sono state create delle variabili che si trovano memorizzate nel
workspace. È possibile avere informazioni su queste variabili con i comandi who e whos.
Questi comandi mostrano però anche tutto quanto è stato definito a livello di sistema, per
cui danno una quantità notevole di informazioni. Più utile è il comando browsevar che
apre una finestra supplementare con solo le variabili definite dall’inizio della sessione.
Esistono inoltre alcune variabili predefinite di sistema che sono
2. %pi π
3. %eps il numero più piccolo che addizionato a 1 crea un numero floating- point
maggiore di 1 nel computer
4. %inf infinito
Interessante è la possibilità di avere calcoli che danno risultati infiniti o non definiti senza
che il sistema si blocchi o dia particolari errori. Per ottenere questo risultato occorre però
inizializzare il sistema con il comando ieee(2).
−−>i e e e ( 2 )
−−>1/0
ans =
Inf
−−>−1/0
ans =
−I n f
−−>0/0
ans =
Nan
Mediante il comando clear si possono cancellare tutte le variabili definite o solo alcune di
esse.
È inoltre possibile registrare un’intera sessione di lavoro utilizzando il comando diary.
Per esempio
−−>host ( ’ emacs ’ )
Tutte le variabili definite o calcolate in una sessione di lavoro possono essere salvate e
richiamate a piacimento mediante il comando save e load.
Per salvare le variabili definite attualmente è sufficiente date
−−>save ( ’ m y f i l e ’ )
−−>format ( ’ v ’ , 1 0 ) ; x
x =
−−>format ( 2 0 ) ; x
x =
column 1 t o 3
column 4 t o 5
0.87821648130193353 0.06837403681129217
−−>format ( ’ e ’ , 1 0 ) ; x
x =
−−>format ( 2 0 ) ; x
x =
column 1 t o 3
column 4 t o 5
8 . 7 8 2 1 6 4 8 1 3 0 1 9 3 E−01 6 . 8 3 7 4 0 3 6 8 1 1 2 9 2 E−02
−−>
−−>format ( ’ e ’ , 1 0 ) ; x
x =
1 . 0 0 0 E+02 2 . 2 2 0 E−16
−−>format ( ’ v ’ , 1 0 ) ; x
x =
100. 2 . 2 2 0 E−16
−−>
−−>format ( ”v ” )
5.
gomme =
3.
penne =
2.
−−>
2.11 Stringhe
Scicoslab conosce il tipo stringa e mette a disposizione diverse funzioni per poterlo
manipolare.
−−>a= ’ Mi ’
a =
Mi
−−> b= ’ chiamo ’
b =
chiamo
−−>c= ’ R oberto ’
c =
R oberto
−−>d=[a , ’ ’ , b , ’ ’ , c ]
d =
! Mi chiamo R oberto !
Mi chiamo R oberto
Mettendo le stringhe in una matrice colonna, viene creata una matrice con elementi di
tipo stringa.
−−>[a ; b ; c ]
ans =
! Mi !
! !
! chiamo !
! !
! R oberto !
−−>s i z e ( ans )
ans =
3. 1.
L’Help in linea
3.1 Introduzione
Scicoslab contiene un sistema di help che fornisce numerose informazioni sull’uso di tutte
le funzioni. I comandi help e apropos permettono una ricerca veloce di informazioni.
È sufficiente chiamare il comando help seguito dalla funzione desiderata. Viene aperta
una finestra supplementare contenente tutti le informazioni in formato ipertestuale (vedi
figura 3.1
−−>help l i nspace
La chiamata semplicemente di help mostra la stessa finestra con tutti gli argomenti
disponibili in Scicoslab.
Questo comando permette di cercare tutti i comandi associati ad una certa parola chiave.
In questo caso viene mostrata la finestra con la lista di tutti i comandi correlati (figura 3.2
−−>apropos ( ’ ode ’
Calcolo scientifico
4.1 Introduzione
2.3025851
−−>y=si n ( x )
y =
column 1 t o 7
column 8 t o 11
−−>x=l i nspace (− p i / 2 , p i / 2 , 7 ) ;
−−>y=0.3+4∗cos ( x ) . ∗ si n ( x . ∗ x )
y =
Scicoslab lavora senza problemi e senza accorgimenti particolari anche con numeri com-
plessi. Le operazioni vengono svolte esattamente nello stesso modo di quelle con numeri
reali.
4. + 7. i
4. + 7. i
−−>c2=2−4∗%i
c2 =
2. − 4. i
−−>c1+c2
ans =
6. + 3. i
−−>c1 / c2
ans =
− 1. + 1.5 i
−−>c1 ∗ c2
ans =
36. − 2. i
Le operazioni tradizionali sui numeri complessi sono riportate nella tabella 4.2
−−>2∗a−1
ans =
1. 3. 5. 7. 9.
In questo caso la matrice a è stata moltiplicata per 2 e ad ogni elemento è stato sottratto
1.
È possibile definire operazioni tra gli elementi di due matrici solo nel caso che le due
matrici abbiano la stessa lunghezza.
−−>a = 1 : 5 ;
−−>b=2∗a −1;
−−>a+b
ans =
2. 5. 8. 11. 14.
−−>a−b
ans =
0. − 1. − 2. − 3. − 4.
−−>a . ∗ b
ans =
−−>a . / b
ans =
−−>a . ˆ b
ans =
−−>2.ˆa
ans =
2. 4. 8. 16. 32.
−−>a . ˆ 2
ans =
1. 4. 9. 16. 25.
Sono particolarmente da notare le ultime operazioni (.*, ./, .^) che sono definite come
operazioni “.”, poiché, anche tra matrici, queste operazioni sono normalmente definite in
un modo differente (vedi capitolo dedicato all’algebra lineare). Tutte queste operazioni
sono svolte elemento per elemento. Il tentativo di eseguire una normale moltiplicazione
tra le due matrici a e b porta ad un errore :
−−>a ∗b
!−−error 10
inconsistent multiplication
Abbiamo visto precedentemente che i valori di una riga di una matrice vengono separati
tra di loro con una “,”, mentre per passare alla riga successiva si utilizza un “;”. Possiamo
anche trasporre una matrice riga con l’operatore “ ’ ”, per arrivare ad ottenere un vettore
colonna.
−−>a = 1 : 5 ;
−−>b=a ’
b =
1.
2.
3.
4.
5.
Esiste anche l’operatore .’ , La differenza esiste unicamente quando viene trasposta una
matrice di elementi complessi.
−−>d=a+%i∗ a
d =
1. + i 2. + 2. i 3. + 3. i 4. + 4. i 5. + 5. i
−−>d ’
ans =
1. − i
2. − 2. i
3. − 3. i
4. − 4. i
5. − 5. i
−−>d . ’
ans =
1. + i
2. + 2. i
3. + 3. i
4. + 4. i
5. + 5. i
> maggiore
< minore
>= maggiore o uguale
<= minore o uguale
== uguale
~= diverso (not uguale)
column 1 t o 11
column 12
36.
& And
| Or
~ Not
L’operazione
−−>A= [ 1 , 0 , 3 , 2 , 1 ]
A =
1. 0. 3. 2. 1.
−−>B= [ 2 , 3 , 4 , 5 , 6 ]
B =
2. 3. 4. 5. 6.
−−>A & B
ans =
T F T T T
dà come risultato una matrice di dimensioni uguale a quelle di A e B, con 1 dove gli
elementi di entrambe sono diversi da 0, altrimenti 0.
Altri operatori sono riportati nella tabella 5.3
Ax = b (5.1)
dove A è una matrice n x n, x e b due vettori colonna di n elementi.
La soluzione tramite Scicoslab di questa equazione può avvenire in due modi. Il primo
metodo utilizza l’inversa della matrice per risolvere il problema, sapendo che
x = A−1 b (5.2)
−−>a = [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 , 8 , 0 ]
a =
1. 2. 3.
4. 5. 6.
7. 8. 0.
−−>b = [ 1 2 ; 3 3 ; 3 6 ]
b =
12.
33.
36.
−−>x=inv ( a ) ∗ b
x =
4.
1.
2.
−−>a = [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 , 8 , 0 ]
a =
1. 2. 3.
4. 5. 6.
7. 8. 0.
−−>b = [ 1 2 ; 3 3 ; 3 6 ]
b =
12.
33.
36.
−−>x=a \b
x =
4.
1.
2.
Matrici sparse
Le matrici sparse sono una classe particolare di matrici che contengono un numero rile-
vante di valori nulli. Scicoslab permette di memorizzare queste matrici tenendo conto
unicamente degli indici occupati, al fine di occupare meno memoria.
−−>A=[0 0 0 5 ; 0 2 0 0 ; 1 3 0 0 ; 0 0 4 0 ]
A =
0. 0. 0. 5.
0. 2. 0. 0.
1. 3. 0. 0.
0. 0. 4. 0.
−−>B=sparse (A)
B =
( 4, 4 ) sparse matrix
( 1, 4) 5.
( 2, 2) 2.
( 3, 1) 1.
( 3, 2) 3.
( 4, 3) 4.
( 4, 1 0 ) sparse matrix
( 1, 2) 1.
( 3, 10) 3.
( 4, 5) 2.
−−>s i z e ( sp )
ans =
4. 10.
Le operazioni sulle matrici sparse possono essere degli stessi tipi di quelle sulle matrici
normali, sfruttando però in molti casi algoritmi specifici.
Semplici script
Tutte le operazioni che vengono immesse al prompt dei comandi nell’ambiente di Sci-
coslab possono essere integrati in un file testo che può essere richiamato ed eseguito
dall’interno dell’ambiente. Questi programmi, chiamati script, devono avere l’estensio-
ne .sci o .sce. Scicoslab riconosce questi file esattamente come un sistema operativo
riconosce i suoi files batch.
Questi file possono essere creati utilizzando Scipad, l’editore integrato nell’ambiente.
Possiamo ad esempio salvare la sequenza di comandi seguente come file esempio.sci
a =[1 ,2 ; 3 , 4 ]
b=[5 ; 7 ]
c=a ∗b
−−>a =[1 ,2 ; 3 , 4 ]
a =
1. 2.
3. 4.
−−>b=[5 ; 7 ]
b =
5.
7.
−−>c=a ∗b
c =
19.
43.
Tutte le variabili definite all’interno di uno script restano visibili anche nel workspace di
Scicoslab. All’interno di uno script possiamo utilizzare il comando halt per far attendere
il programma fino a quando non viene premuto un tasto.
Abbiamo visto precedentemente come sia possibile costruire degli script contenenti le varie
righe di comando da eseguire in Scicoslab. Nello stesso modo è possibile costruire delle
nuove funzioni che possono poi essere richiamate a piacere. Tutte queste funzioni vanno
salvate in file teminanti con l’estensione .sci o .sce, sono files di testo e quindi sono pure
portabili da un sistema all’altro. È possibile anche creare funzioni compilate in C, ma per
chi è interessato a queste possibilità rimando ai manuali specifici di Scicoslab.
Prima di poter utilizzare una nuova funzione all’interno della shell di Scicoslab, occor-
re renderla disponibile. Ad esempio una nuova funzione myfun.sci deve essere caricata
nell’ambiente Scicoslab tramite i comandi
−−>g e t f myfun . s c i
È pure possibile caricare in una volta sola tutte le funzioni contenute in una certa cartella
tramite il comando
−−>getd /home/ bucher
Utenti esperti possono poi in seguito compilare le proprie funzioni e caricarle ad ogni inizio
di sessione inserendo comandi appropriati nel file di inizializzazione .scilab contenuto nella
cartella nascosta .Scilab. Esempi di come compilare e caricare queste funzioni sono descritti
nell’allegato A.
Il nome del file dove è memorizzata la funzione è anche il nome della funzione. La dichia-
razione interna dovrebbe accordarsi al nome dato, ma non è rilevante. Una funzione viene
descritta inizialmente dalla sua definizione nel modo seguente
function [ output1 , output2 , . . . ] = f u n z i o n e ( input1 , input2 , . . . )
[ l h s , r h s ] = argn ( 0 ) ;
m = length ( x ) ;
i f length ( y ) <> m then
error ( ’ x and y must have same l e n g t h ’ ) ;
end
a =[];
f o r n = 0 : 1 : grad
a = [a,x’.ˆn ];
end
p=a \y ’ ;
i f r h s > 3 then
p=poly ( p , s , ’ c ’ ) ;
end
• for loop
• while loop
• if-elseif-else
• select-case-else
Tutti questi comandi devono avere alla fine del blocco da eseguire un comando end.
Questi comandi possono anche essere utilizzati all’interno della shell di Scicoslab e at-
tendono il comando end per far partire l’esecuzione. Esiste la possibilità di utilizzare un
comando break all’interno di questi cicli.
−−>f o r n=1 : 0 . 1 : 5
−−>y ( n)=3∗n ˆ 2 ;
−−>end
−−>y
y =
10.83
25.23
45.63
72.03
75.
−−>while (1+EPS)>1
−−>EPS=EPS/2 ;
−−>num=num+1 ;
−−>end
−−>EPS
EPS =
1 . 1 1 0 E−16
−−>num
num =
53.
−−> i f a>5
−−>b=7
−−>e l s e i f a>4
−−>b=2.7
−−>e l s e i f a>2
−−>b=1
b =
1.
−−>e l s e
−−>b=0
−−>end
−−>b
b =
1.
−−>a=4
a =
4.
−−>s e l e c t a
−−>case { 1 , 2 , 3 }
−−>y=2∗a ;
−−>case { 4 , 5 , 6 }
−−>y=3∗a
−−>case { 7 , 8 , 9 }
−−>y=4∗a ;
−−>e l s e
−−>y=a ;
−−>end
−−>y
y =
4.
Analisi di dati
9.1 Introduzione
9.1.0.1 Esempi
−−>a = [ 2 1 , 1 0 ; 2 , 3 ; 1 5 , 4 ; 3 , 6 0 ; 7 , 1 3 ]
a =
21. 10.
2. 3.
15. 4.
3. 60.
7. 13.
−−>max( a )
ans =
60.
−−>max( a , ’ c ’ )
ans =
21.
3.
15.
60.
13.
−−>max( a , ’ r ’ )
ans =
21. 60
−−>mean( a , ’ r ’ )
ans =
9.6 18.
−−>median ( a , ’ r ’ )
ans =
7. 10.
−−>prod ( a , ’ c ’ )
ans =
210.
6.
60.
180.
91.
−−>cumprod( a , ’ r ’ )
ans =
21. 10.
42. 30.
630. 120.
1890. 7200.
13230. 93600.
Polinomi
x3 + 2x2 + 7x + 5 (10.1)
può essere definito mediante il comando
−−>p1=poly ( [ 5 , 7 , 2 , 1 ] , ’ x ’ , ’ c ’ ) // p o l i n o m i o t r a m i t e i c o e f f i c i e n t i
p1 =
2 3
5 + 7x + 2x + x
−−>p2=poly ( [ 0 , 1 ] , ’ x ’ ) // p o l i n o m i o t r a m i t e l e r a d i c i
p2 =
2
− x + x
−−>p3=poly ( [ 2 , 3 , 1 ] , ’ x ’ , ’ c ’ )
p3 =
2
2 + 3x + x
3 4
1 + 2s + 3s + s
ans =
− 1.
− 2.
2
7 + 4x + 3x
2 3 4 5
10 + 29 x + 30 x + 15 x + 5x + x
2 3
2x + 3x + x
−−>p2=poly ( [ − 1 ] , ’ x ’ )
p2 =
1 + x
−−>p1 / p2
ans =
2
2x + x
−−−−−−
1
[ l h s , r h s ] = argn ( 0 ) ;
m = length ( x ) ;
i f length ( y ) <> m then
error ( ’ x and y must have same l e n g t h ’ ) ;
end
a =[];
f o r n = 0 : 1 : grad
a = [a,x’.ˆn ];
end
p=a \y ’ ;
i f r h s > 3 then
p=poly ( p , s , ’ c ’ ) ;
end
−−>x = 0 : 0 . 1 : 1 ;
−−>y = [ − . 4 4 7 , 1 . 9 7 8 , 3 . 2 8 , 6 . 1 6 , 7 . 0 8 , 7 . 3 4 , 7 . 6 6 , 9 . 5 6 , 9 . 4 8 , 9 . 3 , 1 1 . 2 ] ;
−−>p=p o l y f i t ( x , y , 2 , ’ x ’ )
p =
2
− 0.0316713 + 20.129294x − 9.8108392x
2
− 0.0316713 + 20.129294x − 9.8108392x
−−>x1 = 0 : 0 . 0 1 : 1 ;
−−>y1=horner ( p , x1 ) ;
−−>plot2d ( x , y , s t y l e =[ −1])
−−>plot2d ( x1 , y1 )
−−>p1=poly ( [ 0 , − 1 ] , ’ s ’ )
p1 =
2
s + s
−−>p2=poly ([ −2 , −3 , −4] , ’ s ’ )
p2 =
12
10
−2
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
2 3
24 + 26 s + 9 s + s
2
s + s
−−−−−−−−−−−−−−−−−
2 3
24 + 26 s + 9 s + s
−−>p f s s ( f r )
ans =
ans ( 1 )
6
−−−−−
4 + s
ans ( 2 )
− 6
−−−−−
3 + s
ans ( 3 )
1
−−−−−
2 + s
Interpolazione
In Scicoslab l’interpolazione dei dati viene fatta sfruttando le due funzioni splin e interp.
−−>o r a r i o = 1 : 1 2 ;
−−>t e m p e r a t u r e =[5 8 9 15 25 29 31 30 22 25 27 2 4 ] ;
−−>o r e = 1 : 0 . 1 : 1 2 ;
−−>dk = s p l i n ( o r a r i o , t e m p e r a t u r e ) ;
−−>d f = s p l i n ( o r a r i o , temperature , ” f a s t ” ) ;
−−>xbasc ( )
−−>legends ( [ ” n o t a k n o t s p l i n e ” , ” f a s t sub−s p l i n e ” , ” i n t e r p o l a t i o n p o i n t s ” ] , . . .
−−> [ 1 2 −9] , ” ur ” , %f )
−−>x t i t l e ( ” s p l i n e i n t e r p o l a t i o n ” )
spline interpolation
35
not_a_knot spline
fast sub−spline
interpolation points
30
25
20
15
10
5
0 2 4 6 8 10 12
Grafica
12.1 Introduzione
In Scicoslab è possibile utilizzare comandi per grafica 2D e 3D. Esistono inoltre comandi
per creare delle animazioni.
12.3 Grafica 2D
Esisteono diversi comandi per gestire la grafica 2D. L’help mostra una grande quantità
di possibili funzioni, che in parte sono state ora sostituite dall’unico comando plot2d che
viene chiamato con vari parametri.
Il comando plot2d ha molte possibilità, per cui per risolvere problemi particolari è meglio
utilizzare l’help integrato. Uno dei parametri principali è sicuramente il logflag che per-
mette di defininre se gli assi sono lineari (“n”) o logaritmici (“l”). L’esempio relativo al
comando subplot (proposto in seguito) mostra un caso di utilizzo di questo flag.
La tabella 12.2 mostra alcuni di principali comandi per la grafica 2D.
La sequenza di comandi seguente crea un grafico con due funzioni sin(x) e 2 sin(x) + cos(x)
−−>x=l i nspace ( 0 , 2 ∗ p i ) ;
−−>y1=si n ( x ) ;
−−>y2=2∗ si n ( x)+cos ( x ) ;
−−>plot2d ( x , y1 , s t y l e =12)
−−>plot2d ( x , y2 )
−−>xgrid ( −3)
−−>xgrid ( 3 )
−−>x l a b e l ( ’ Asse x ’ )
−−>y l a b e l ( ’ Asse y ’ )
−−>x t i t l e ( ’ G r a f i c o d e l l e 2 f u n z i o n i ’ )
−−>xstri ng ( x ( 5 ) , y1 ( 5 ) , ’ s i n ( x ) ’ )
−−>xstri ng ( x ( 3 0 ) , y2 ( 3 0 ) , ’ 2 s i n ( x)+ c o s ( x ) ’ )
dove x è il vettore delle ordinate, y il vettore (o anche la matrice !) delle ascisse, <
opta rgs > permette di settare tutta una serie di opzioni per il grafico (vedi help plot2d).
Per creare un nuovo grafico senza perdere quello precedente è possibile farlo disegnare in
una nuova finestra creata mediante il comando scf .
Il bottone zoom on permette di cliccare con il mouse (sinistro) all’interno di un grafico
oppure di selezionare una zona, per ingrandire determinati particolari, mentre l’utilizzo
del bottone destro riporta gradatamente l’immagine alle dimensioni normali.
2.5
2.0
2sin(x)+cos(x)
1.5
1.0
0.5
sin(x)
Asse y
0.0
−0.5
−1.0
−1.5
−2.0
−2.5
0 1 2 3 4 5 6 7
Asse x
Strofoide
90
−−>f=−p i / 3 : p i / 3 0 : p i / 3 ; 1.0
120
1
60
0.8 0.8
0.6 0.6
0.2 0.2
−0.2
−0.4
−−> t i t l e ( ’ S t r o f o i d e ’ ) −0.6
210 330
−0.8
240 300
−1.0
−1.0 −0.5 270
0.0 0.5 1.0 1.5
−−>v=rand ( 1 , 2 0 0 0 0 , ’ n ’ ) ; 0.45
0.40
−−>h i s t p l o t ( 4 0 , v ) // 40 c l a s s i 0.35
0.30
0.25
0.20
0.15
0.10
0.05
0.00
−4 −3 −2 −1 0 1 2 3 4 5
−−>d e f f ( ” yprim=f ( t , y ) ” , . . 10
−−> [ ” yprim1=y ( 2 ) ” ; . . 8
−−> ” yprim2=−y ( 1 ) + 0 . 5 ∗ y ( 2 ) ” ; . . 4
−4
−6
−10
−10 −8 −6 −4 −2 0 2 4 6 8 10
−−>fchamp ( f , 1 , xr , y r )
È possibile portare più grafici sulla stessa finestra, suddividendola in zone con il comando
subplot.
−−>x =0:2∗ p i / 5 0 : 4 ∗ p i ;
−−>y=si n ( x ) ;
−−>xbasc ( )
−−>subplot ( 2 , 2 , 1 )
−−>plot2d ( x , y )
−−>t = [ 0 : 0 . 1 : 2 ∗ %pi ] ’ ;
−−>subplot ( 2 , 2 , 2 )
−−>plot2d ( x , y )
−−>x3=logspace ( − 2 , 2 ) ;
−−>y3=1+%i∗ x3 ;
−−>y3=−20∗log10 ( abs ( y3 ) ) ;
−−>subplot ( 2 , 1 , 2 ) ;
−−>plot2d ( x3 , y3 , l o g f l a g=” l n ” )
−−>xgrid
1.0 1.0
0.8 0.8
0.6 0.6
0.4 0.4
0.2 0.2
0.0 0.0
−0.2 −0.2
−0.4 −0.4
−0.6 −0.6
−0.8 −0.8
−1.0 −1.0
0 2 4 6 8 10 12 14 0 1 2 3 4 5 6 7
−0
−5
−10
−15
−20
−25
−30
−35
−40
−45
−2 −1 0 1 2
10 10 10 10 10
12.6 Grafica 3D
Alcuni esempi di grafica 3D sono riportati nelle figure 12.6, 12.7, 12.8 e 12.9.
−−>param3d( si n ( t ) , cos ( t ) , t )
0
10
15
Z
20
25
−1.0
30
−0.6
35 −0.2
−1.0 0.2
−0.8 −0.6 −0.4 −0.2 0.6
0.0 0.2 X
0.4 0.6 1.0
Y 0.8 1.0
−−>x = − 5 : 0 . 1 : 5 ;
6
0.0533 0.0533
−−>y=x ; 4
−0.082 −0.082
−−>R=sqrt (X.ˆ2+Y. ˆ 2 ) ; −2
−4 −0.082 −0.082
−6
−6 −4 −2 0 2 4 6
−−>contour ( x , y , Z , 8 )
Un grafico può essere stampato da menu, oppure si può esportare il grafico in uno dei
tanti formati grafici da poi utilizzare in un elaboratore testi (tabella 12.4),
Z
−0.2
−0.4
−0.6
−−>mesh (X, Y, Z ) ;
−0.8
−1.0
1.0
0.6
1.0
0.2 0.8
0.6
−0.2 0.4
0.2
0.0
−0.6 −0.2
Y −0.4
−0.6 X
−1.0 −0.8
−1.0
−−>plot3d ( x , y , Z )
1.0
0.8
0.6
0.4
Z
0.2
0.0
−0.2
−8
−0.4 −6
−4
−8 −2
−6 0
−4
−2 2
0 4 X
2
Y 4 6
6
8
12.8 Animazioni
Equazioni differenziali
x1 = x (13.2)
x2 = ẋ1 = ẋ (13.3)
nel sistema
ẋ1 = x2 (13.4)
ẋ2 = x2 1 − x21 − x1 (13.5)
e quindi risolto.
La soluzione di un’equazione o di un sistema di equazioni differenziali richiede la program-
mazione di una funzione dichiarata come
−−>function x dot=vdp ( t , x )
−−>x dot1=x ( 2 ) ;
−−>x dot2=x (2)∗(1 − x ( 1 ) . ∗ x (1)) − x ( 1 ) ;
−−>x dot =[ x dot1 ; x dot2 ]
−−>endfunction
−−>t = 0 : 0 . 0 0 1 : 3 0 ;
4.
− 4.
−−>x=ode ( x0 , 0 , t , vdp ) ;
−−>plot2d ( t ’ , x ’ )
−1
−2
−3
−4
0 5 10 15 20 25 30
Interessante è la possibilità di vedere il grafico delle due variabili di stato, una in funzione
dell’altra, per vedere meglio il ciclo che si forma con diverse condizioni iniziali, con i
comandi
−−>plot2d ( x ( 1 , : ) , x ( 2 , : ) )
−−>xgrid ( 4 )
−1
−2
−3
−4
−3 −2 −1 0 1 2 3 4 5
Per chi lavora molto a livello di equazioni differenziali è consigliabile l’uso di uno strumento
quale Scicos che rispetto a Scicoslab presenta soluzioni più complete, oppure, nel caso
di sistemi lineari, utilizzare le varie funzioni a disposizione per la simulazione di sistemi di
controllo (syslin).
Input/Output
Spesso si è confrontati con dati raccolti con altri programmi che si vorrebbero analizzare
mediante Scicoslab.
Il metodo più semplice consiste nell’avere questi dati in un file in formato ASCII, come
nel prossimo esempio
1 2 −5
2 0.2500 −9
3 0.0740 −23
4 0.0310 −53
5 0.0160 −105
6 0.0090 −185
7 0.0050 −299
8 0.0030 −453
9 0.0020 −653
10 0.0020 −905
Se questi dati si trovano ad esempio in un file chiamato operaz.dat), possono essere caricati
in Scicoslab con un semplice comando
−−>x=read ( ’ o p e r a z . dat ’ , −1 ,3)
x =
1. 2. − 5.
2. 0.25 − 9.
3. 0.074 − 23.
4. 0.031 − 53.
5. 0.016 − 105.
6. 0.009 − 185.
7. 0.005 − 299.
8. 0.003 − 453.
9. 0.002 − 653.
10. 0.002 − 905.
−−>y=si n ( t ) ;
−−>write ( ’ d a t i . dat ’ , [ t ’ , y ’ ] )
Esiste tutta una serie di comandi che permettono di emulare gli analoghi comandi in
C. Questi comandi utilizzano lo stesso comando, ma preceduto dalla lettera m (mopen,
mscanf, mprintf ecc.). La tebella 14.1 mostra una serie di questi comandi.
È possibile leggere completamente un file e riscriverlo dopo aver effettuato alcune modifi-
che, utilizzando i comandi mgetl e mputl.
−−>T=mgetl ( ’ M a k e f i l e ’ ) ;
−−>T=strsubst (T, ’ . o ’ , ’ . o b j ’ ) ;
−−>mputl (T, ’ M a k e f i l e ’ ) ;
Strutture particolari
In Scicoslab le dimensioni delle matrici non sono limitate a 2, ma possono essere più
grandi. Le funzioni che permettono di creare matrici speciali nelle due dimensioni, possono
essere utilizzate anche su n dimensioni. Per esempio, il comando ones(2, 3, 4, 1) permette
di creare una matrice di “1” su 4 dimensioni.
Quando vogliamo utilizzare una matrice a 3 dimensioni, ad esempio, per crearla occorre
utilizzare il comando cat, per concatenare delle matrici bidimensionali sulla 3. dimensione.
−−>a = [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 , 8 , 9 ]
a =
1. 2. 3.
4. 5. 6.
7. 8. 9.
−−>b=10∗a
b =
−−>c=c a t ( 3 , a , b )
c =
(: ,: ,1)
1. 2. 3.
4. 5. 6.
7. 8. 9.
(: ,: ,2)
15.2 Liste
Le liste sono strutture che possono contenere elementi di tipo diverso fra di loro. Le liste
possono essere create direttamente per assegnamento, o utilizzando il comando list. Da
notare che l’indicizzazione ad una lista viene fatto utilizzando le parentesi tonde.
−−>L=l i s t ( ’ Ciao ’ , [ 1 , 2 , 3 , 4 ] , − 5 )
L =
L(1)
Ciao
L(2)
1. 2. 3. 4.
L(3)
− 5.
−−>L ( 2 )
ans =
1. 2. 3. 4.
−−>L ( 1 )
ans =
!V name value !
−−>L ( 2 )
ans =
!a b c !
−−>L ( 3 )
ans =
1. 2. 3.
−−>L . name
ans =
!a b c !
−−>g e t f i e l d ( ’ name ’ , L)
ans =
!a b c !
−−>s e t f i e l d ( ’ v a l u e ’ , 0 : 1 0 , L)
−−>L
L =
L(1)
!V name value !
L(2)
!a b c !
L(3)
0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Una terza possibilità è data dal comando mlist. In questo caso l’accesso ai campi non è
possibile tramite l’indice.
È possibile inizializzare direttamente delle tlist come strutture, dando direttamente un
valore ai campi.
−−>a . num=2
a =
num : 2
−−>a . den=3
a =
num : 2
den : 3
−−>a
a =
num : 2
den : 3
−−>a . nome= ’ c i a o ’
a =
num : 2
den : 3
nome : ” c i a o ”
Caricamento di funzioni
Per semplificare la soluzione di determinati problemi può essere utile creare delle funzioni.
Queste funzioni sono implementate utilizzando il linguaggio di programmazione messo a
disposizione dall’ambiente Scicoslab. Il loro utilizzo non è immediato, come ad esempio
in altri linguaggi come Matlab, ma queste funzioni devono essere prima caricate nell’am-
biente di Scicoslab. La soluzione più semplice è quella di raccogliere tutte queste funzioni
all’interno di una stessa cartella, e di poi caricarle all’inizio della sessione Scicoslab tramite
il comando
−−> getd ’< c a r t e l l a > ’
Ogni utente ha a disposizione un suo file di inizializzazione .scilab, che in Linux si trova
sotto la cartella nascosta
. Scilab /4.4
o una cartella analoga, dipendente dalla versione utilizzata di Scicoslab. Il comando per il
caricamento della cartella delle funzioni può essere inserito in questo file nascosto .scilab,
ed automaticamente eseguito ad ogni inizio di sessione.
Ci sono altri metodi per crearsi dei propri ambienti di funzioni. Uno è quello di compilare
tutte le funzioni personali, creando una libreria e caricando poi questa libreria tramite lo
script di inizializzazione. Occorre quindi aggiungere alla cartella delle funzioni il seguente
file “buildmacros.sce“ per la compilazione e la creazione della libreria
// S c i l a b ( h t t p : / /www . s c i l a b . o r g / ) − Thi s f i l e i s p a r t o f S c i l a b
// C o p y r i g h t (C) 2007 −2008 − INRIA − A l l a n CORNET <a l l a n . c o r n e t @ i n r i a . f r >
//
// Thi s f i l e must be used under t h e terms o f t h e CeCILL .
// Thi s s o u r c e f i l e i s l i c e n s e d as d e s c r i b e d i n t h e f i l e COPYING, whi ch
// you s h o u l d have r e c e i v e d as p a r t o f t h i s d i s t r i b u t i o n . The terms
// are a l s o a v a i l a b l e at
// h t t p : / /www . c e c i l l . i n f o / l i c e n c e s / Licence CeCILL V2−en . t x t
i f ( i s d e f ( ’ g e n l i b ’ ) == %f ) then
exec ( SCI+ ’ / modules / f u n c t i o n s / s c r i p t s / b u i l d m a c r o s / l o a d g e n l i b . s c e ’ ) ;
end
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
t o o l b o x d i r = pwd ( ) ;
genlib ( ’ l i b s u p s i f u n ’ , t o o l b o x d i r , %f , %t ) ;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
clean :
rm −f ∗ . b i n l i b names
nel file .scilab, dove cartella è sostituito dal percorso completo dove sono i files compilati.