Comincia ora la prima, di una serie, guida di Octave.
In questo capitolo parlerò dei valori scalari, vettori e matrici, come anche delle operazioni principali che possiamo effettuare con esse. Per chi avesse ravanato un poco nei miei articolu più vecchi avrebbe trovato questo articolo su gnuplot, dove avevo messo una tabella riassuntiva di molte funzioni analitiche, ovviamente anche presenti in Octave.
Valori scalari
Con valori scalari si intendono le cifre, reali o complesse è indifferente. In questo modo si assegnano ad una variabile i valori scalari:
>a=5
a=
5
>b=5-1
b=
1
Se non viene specificata una variabile, il valore viene assegnato in automatico alla variabile ans
>3
ans=
3
>0*2
ans=
0
Le operazioni elementari +,-,*,/,^ sono definite nel modo naturale, attraverso le parentesi “(” e “)” è possibile dare la precedenza alle operazioni. (In Octave è possibile scrivere anche ** al posto di ^, ma in Matlab questa sintassi non è accettata.) Se scriviamo “;” alla fine di un comando, viene omesso l’output:
>z=5;
Se abbiamo bisogno di sapere quali variabili abbiamo già usato, possiamo usare il comando “who”
>who
Con il seguente comando cancelleremo tutte le variabili in memoria
>clear all
Sono definite inoltre molte altre funzioni, come ad esempio: abs(x), sqrt(x), exp(x), log(x), sin(x),cos(x), tan(x), asin(x), …
E anche alcune variabili: pi, i,j, exp(1) che ovviamente possono venir sovrascritte con una assegnazione
I vettori
I vettori vengono assegnati nel seguente modo: vettore riga
>a=[1 2 3]
a=
1 2 3
vettore colonna
>b=[1;2;3]
b=
1
2
3
Si possono inoltre assegnare vettori nel seguente modo:
>c=[1:4]
c=
1 2 3 4
>d=[1:0.5:4]
d=
1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000
qui 0.5 segna il “passo”, cioè la distanza tra due numeri adiacenti
>e=linspace(0,1,5) e= 0.00000 0.25000 0.50000 0.75000 1.00000
mentre qui abbiamo l’intervallo [0,1] diviso in 5 sottointervalli larghi uguali.
Esistono svariate operazioni (non solitamente usate in matematica) che si possono fare con i vettori: per conoscere la lunghezza di un vettore:
>length(c)
ans= 3
per accedere ad un singolo componente:
>d(2)
ans= 1.5000
l’ultima posizione del vettore è sempre end:
>d(end)
ans= 4.0000
Per chi sa un poco programmare: In Octave, al contrario che, ad esempio in C, l’indicizzazione comincia da 1, non da 0, infatti proviamo a vedere cosa conterrebbe il componente 0 di un vettore:
>d(0)
error: subscript indices must be either positive integers or logicals.
Ovviamente un indice non naturale non è di alcun significato.
Si può inoltre trasporre un vettore:
>c=c'
c=
1
2
3
4
Ovviamente le operazioni matematiche sono tutte definite, in modo particolare la norma euclidea:
>norm(e)
ans= 1.3693
oppure altri tipi di norme con la seguente sintassi: “norm(v,p)” Dove p è un valore numerico positivo oppure inf. In Octave è definita anche la norma -inf (anche se non si tratta propriamente di una norma, come tutte le norme negative).
La somma e la differenza vengono trattati in modo analogo ai scalari, si deve solo fare attenzioni che i vettori abbiano le stesse dimensioni e siano tutti e due orizzontali o verticali.
Per il prodotto scalare invece ci si deve preoccupare di avere due vettori di ugual dimensioni, il primo orizzontale, il secondo verticale. In alternativa si può usare il comando “dot(v,w)” con v,w due vettori di ugual lunghezza. Octave provvederà da solo ad assicurarsi che uno sia orizzontale e l’altro verticale.
È definito anche il prodotto vettoriale attraverso il comando “cross(v,w)”, con v e w due vettori di ugual lunghezza.
È possibile sommare tutti gli elementi di un vettore, attraverso il comando “sum(v)”, con v vettore, mentre con “prod(v)” verrà eseguito il prodotto delle componenti. Le funzioni “max(v)” e “min(v)” vi daranno come output l’elemento massimo e minimo del vettore. La funzione “sort(v)” ordinerà gli elementi del vettore in ordine di grandezza mentre il comando “diff(v)” effettuerà la differenza a due a due di tutti i componenti del vettore (secondo componente meno il primo, terzo componente meno il secondo…) e come output vi darà un vettore di con n-1 entrate (supponendo che la dimensione di v fosse n) .
Inoltre è possibile fare anche alcuni operazioni “componente per componente”. Queste non sono operazioni che vengono di solito definite/usate in matematica, ma sono di largo uso in ambito numerico e permettono di risparmiare (per chi conoscesse un poco di programmazione) l’uso di cicli for.
Abbiamo ad esempio il prodotto componente per componente:
>a=[1 2 3];
>b=[4 5 6];
>c=a.*b
c=
4 10 8
Allo stesso modo si definisce la divisione, e l’elevamento a potenza tra due vettori. Operazioni come la somma, la differenza, il prodotto/divisione con uno scalare, sono già definite componente per componente come normalmente lo sono in matematica, mentre funzioni come modulo, seno, coseno, logaritmo, exp… oppure la somma/sottrazione con uno scalare sono anch’esse, in Octave, definite componente per componente (si può pensare che lo scalare viene prima moltiplicato con un vettore di 1 prima di effettuare la somma/sottrazione).
In sostanza le uniche funzioni per la quale serviva una definizione a parte per le operazioni “componente per componente” sono il prodotto, la divisione e l’elevamento a potenza tra due vettori.
Matrici
Come gli scalari sono un caso particolare dei vettori (si trattano, a tutti gli effetti, di vettori con una riga (o una colonna, dipende come si pone il vettore)), i vettori sono matrici particolari, nuovamente con una sola riga, oppure colonna. In Octave è possibile definire matrici n*m, e normalmente si lavora con esse. Ovviamente sono anche definite le operazioni “det(A)” (il determinante) e inv(A) (per calcolare l’inversa di una matrice), supponendo che A sia una matrice quadrata. Tutti i discorsi sulle operazioni “componente per componente” introdotte sui vettori, si applicano anche alle matrici, mentre per le funzioni che sono state introdotte ai vettori si estendono alle matrici, ricordandosi che le operazioni vengono effettuate sulle righe, e quindi l’output non sarà uno scalare, bensì un vettore.
Ad esempio
>A=[1 2 3;7 8 9; 4 5 6];
>sum(A)
ans=
12 15 18
La somma viene quindi fatta sulle colonne (si può pensare che le matrici siano vettori di vettori…)
>prod(A)
ans=
28 80 162
>sort(A)
ans=
1 2 3
4 5 6
7 8 9
Anche la funzione “max” e “min” lavorano allo stesso modo, su colonne. se invece diamo il comando
>a=diag(A)
a=
1 8 6
otteniamo in output la diagonale di A, se diamo invece
>A2=diag(a)
A2=
Diagonal Matrix
1 0 0
0 8 0
0 0 6
Dando “diag(a,n)” o “diag(A, n)” si sposta di n righe (verso l’alto o il basso dipende dal segno di n) la diagonale interessata. Al posto di lavorare direttamente sulle matrici, si può lavorare anche su sottomatrici, ad esempio:
>A(1,2)
ans= 2
>A(2,:)
ans=
7 8 9
Se vogliamo, ad esempio eliminare una colonna dobbiamo scrivere
>A(:,2)=[]
A=
1 3
7 9
4 6
Un’altra operazione importante che si può fare con le matrici (e quindi anche i vettori), è la concatenazione. Scrivete ad esempio
>B=[A A]
oppure
>B=[A;A]
Esistono poi matrici particolari che vengono spesso usate in calcolo numerico:
eye(n) %crea la matrice identità di dimensione n*n
ones(m,n) %crea una matrice di 1 di dimensione m*n
zeros(m,n) %crea una matrice di 0 di dimensione m*n
rand(n,m) %crea una matrice di dimensione n*m di valori pseudocasuali
Dopo questo lungo capitolo, eccovi un po’ di esercizi, giusto per vedere se avete capito tutto e per eventualmente chiarire dubbi!
I risultati sono salvati sui file con l’estensione .m, per ora vi basta sapere che dovete copiare-incollare le singole istruzioni sulle righe, la prossima volta vedremo invece meglio cosa sono.
Mi piace:
Mi piace Caricamento...