La formazione di un matematico, fisico, chimico, ingegnere di oggi non sarebbe completa senza la conoscenza di almeno uno strumento informatico di calcolo. Uno strumento di questo tipo è Octave. Octave (per Linux e per Windows) é disponibile gratuitamente in rete all'indirizzo:
Cominciamo questa parte di corso con una brevissima introduzione ai
sistemi di calcolo in genere. Subito dopo inizieremo la descrizione di
Octave.
4. 0. Sistemi di calcolo oggi disponibili.
Nel campo degli strumenti di calcolo non si vede ancora la netta prevalenza di un programma su di un altro. Di conseguenza, vista la possibilità che lo studente si trovi in futuro ad usare un altro programma, il nostro obbiettivo sarà impare non soltanto lo strumento di calcolo scelto, ma anche imparare ciò che uno strumento di calcolo può fare.
Octave è una versione gratuita di un sistema commerciale chiamato Matlab. Octave/Matlab sono usati sia per la didattica all’Università, sia dagli ingegneri per i calcoli legati alla loro professione. Lo strumento di calcolo più avanzato oggi disponibile è Mathematica. Strumenti dello stesso tipo di Octave e Mathematica, disponibili oggi, sono: Maple (una semplificazione di Mathematica), Derive (ancora più semplice, per la didattica nelle scuole secondarie), Per il disegno matematico, ricordiamo: MathCad, e, per l’insegnamento della geometria Euclidea nelle scuole secondarie: Cabrì.
Sistemi di calcolo e matematica applicata. Uno strumento di calcolo completo, come Mathematica o Maple, può svolgere ogni calcolo della matematica applicata, fornendo la soluzione non solo sotto forma di numeri, ma anche di equazioni dipendenti da parametri. Octave, più semplice, svolge soprattutto calcoli con risultato numerico, e, per i soli polinomi, alcuni calcoli il cui risultato é una formula. Per questa limitazione, Octave va considerato più un sistema (molto avanzato) per il calcolo numerico che non un sistema di calcolo completo, che includa anche il calcolo simbolico.
L'esistenza di strumenti avanzati di calcolo avrà, verosimilmente, profondi influssi sull'insegnamento e sull'uso della matematica. I calcoli simbolici non dovrebbero più essere più considerati come un'attività da svolgere manualmente. Molto del tempo dedicato ad essi dovrebbe essere - e verrà verosimilmente - dedicato ad apprendere il funzionamento di un sistema di calcolo simbolico.
Scelto un sistema di calcolo, all’utente resterà comunque da impostare il problema, e da interpretare la soluzione. Questo è un lavoro che richiede, in ogni caso, una buona preparazione matematica.
Le possibilità offerte da uno strumento di calcolo. Riassumiamo qui brevemente i tipici compiti svolti da una strumento di calcolo.
Algebra: il calcolo numerico e letterale, la soluzione (numerica per Octave, simbolica ad esempio per Mathematica) di equazioni;
Analisi: limiti, derivate, integrali, sviluppi in serie, soluzioni di equazioni differenziali, con la soluzione soprattutto in forma numerica, o di grafico (in Octave), o data anche come formula (in Mathematica).
Grafica: disegno a due o tre dimensioni, di una funzione, di una curva o superfice parametrica. Generazione di suoni (in Mathematica, e, in forma più limitata, in Octave). Generazione di animazioni (solo in Mathematica).
Fine dell'Introduzione
Testo per Octave: Manuale "GNU Octave. A high-level interactive language for numerical computations". E’ disponibile nell"Help" del programma Octave, o nel sito di Octave: http://www.che.wisc.edu/octave/.
Questo manuale è molto ampio (40 sezioni). Sottolineiamo però che dispense del corso, incluse qui di seguito, equivalgono a soltanto 5 sezioni (incomplete):
Sez. 2 (tutta), 8 (pag.1), 12 (pagg.1-8), 15 (pagg. 1-6)
Consigliamo di leggere prima le dispense e di utilizzare il manuale solo per consultazione. E’ buona norma, ogni volta che si incontra una operazione nuova, cercarne la descrizione nel manuale prima di usarla, utilizzando il comando:
help nomecomando
4.1. Presentazione di Octave.
Come abbiamo detto, Octave è uno strumento per il calcolo numerico avanzato: risolve sistemi di equazioni lineari, equazioni differenziali (che qui non tratteremo), fa la regressione lineare e i grafici del piano e dello spazio. Octave è anche un vero e proprio linguaggio di programmazione.
Data una finestra Unix del Laboratorio del corso, Octave si mette in funzione scrivendo il comando
octave
Variabili. Octave definisce variabili con un comando della forma
x = 3;
oppure
x = 3
Entrambi i comandi definiscono x come 3. Il secondo, inoltre, fa anche stampare il valore 3 a terminale. Se non si desidera rivedere il valore appena definito, é sufficiente terminare, come nel primo comando, la definizione con un punto e virgola. Un punto e virgola rende "invisibile" una definizione.
I nomi delle variabili sono sequenze di lettere, numeri e segni "_" (detti "underscore"). Non possono però iniziare con cifre. Per esempio, x, xy, xyz_33 sono nomi corretti (si noti che il xy é considerato come un nome unico, e non come il prodotto di x e di y). 3x invece non è un nome corretto. Lettere maiuscole e minuscole sono considerate distinte (come in Unix). Dunque i quattro nomi:
aa Aa aA AA
sono considerati distinti tra loro.
Una variabile può venire ridefinita a piacere:
x = 5;
rende x uguale a 5 e fa dimenticare il precedente valore 3.
In Octave, però, non esistono incognite, cioè variabili che non hanno fissato un valore. Se scrivo x = y+1; e y è definita come 10, allora x viene definita come 11. Se invece y non è stata definita, allora Octave segnala errore, e non dà nessun valore a x. Non è possibile, in altre parole, definire x in Octave come un'espressione y+1 che dipenda da un'incognita (un valore non fissato) y.
Cicli for e while. In Octave sono inoltre disponibili, per gli studenti che già conoscono la programmazione, le istruzioni "for" e "while". In questo corso introduttivo, doverosamente, noi cercheremo di farne a meno. Solo per completezza, accenniamo che tali istruzioni hanno la forma:
for i=a:b
istruzione_1; ... istruzione_n;
endfor;
e
while condizione
istruzione_1; ... istruzione_n;
endwhile;
La condizione del "while" si scrive come nel linguaggio di programmazione
"C". Non diamo qui esempi (mancherebbe il tempo per insegnare anche queste
istruzioni).
4.2. Matrici in Octave.
Octave è principalmente immaginato per eseguire calcoli su matrici, vettori-riga e vettori colonna. Per chi non conosce le matrici, è sufficiente sapere che una matrice n x m é un insieme di numeri disposti a rettangolo, con n righe ed m colonne. Un esempio di matrice 2 x 2 è:
A = 1 2
B = 1 2 3 4 5
Una matrice n x 1 é costituita da una sola colonna di lunghezza n ed è detta un vettore-colonna. Un esempio di vettore-colonna 1 x 3 è:
C = 1
3
M=[a_11,...,a_1m;...;a_n1,...,a_nm];
dove a_11,...,a_nm sono numeri. Per esempio: A, B, C di cui sopra si definiscono mediante:
A = [1,2;3,4]; B = [1,2,3,4,5]; C = [1;2;3];
Il valore nella riga i e nella colonna j si ottiene con M(i,j). Per esempio: A(2,2) vale 4. Nel caso di un vettore (riga o colonna, non importa) V, il valore i-esimo si ottiene con V(i). Per esempio: B(3) = 3, C(3) = 3.
Una matrice si può anche preparare con:
M=zeros(n,m);
Si ottiene una matrice M che (provvisoriamente) include solo zeri. Se n=m=2, allora
M = 0 0
for i=1:n for j=1:m M(i,j)=...; endfor; endfor;
Al posto dei puntini dobbiamo scrivere il valore che intendiamo assegnare all'elemento M(i,j) della matrice M.
Concatenazione di matrici.
Una matrice si può anche costruire giuntando delle matrici già costruite. Il comando ha sempre la forma
M=[a_11,...,a_1m;...;a_n1,...,a_nm];
dove, però, questa volta a_11,...,a_1m sono matrici. Il comando costruisce M come segue. a_12 viene incollato alla sinistra di a_11, poi a_13 alla sinistra di a_12 e così via. Poi a_21 viene incollato sotto a_11, a_22 alla sinistra di a_21, eccetera. Il comando segnala un errore se la regione così ottenuta non è rettangolare. Per esempio: riprendiamo le matrici A = [1,2;3,4]; B = [1,2,3,4,5]. Allora avremo:
[A,A] = 1 2 1 2
[A;A] = 1 2
Operazioni su matrici
A meno che venga esplicitamente indicato il contrario, ogni operazione in Octave si intende un'operazione su matrici. Lo studente vedrà queste operazioni nei corsi di geometria: per ora, ci limitiamo ad elencarne i nomi. Le operazioni su matrici includono:
eye(n) = matrice identità n x n
M' = trasposta di M (righe e colonne scambiate)
det(M) = determinante di M
inv(M) = M-1 (inversa di M)
M * N = prodotto di matrici
M^n = M * ... * M n volte (come prodotto di matrici)
M/N = M * N-1
M\N = M-1 * N
L'ultima operazione ci consente di risolvere sistemi di equazioni lineari in Octave. Sia dato infatti un sistema lineare in n righe ed n incognite, scritto nella forma MX = N (dove M=matrice dei coefficienti delle variabili, N = colonna termini noti). Allora X = M-1*N = M\N, come ci insegna la teoria delle matrici, è la colonna di soluzioni del sistema MX = N. Per esempio: consideriamo il sistema
x + y = 3
x - y = 1
Allora M = [1,1;1,-1] è la matrice dei coefficenti di x, y, e N = [3;1] è la colonna dei termini noti. La colonna delle soluzioni (che possiamo calcolare utilizzando Octave) è M\N = [2;1]. Il primo valore è la soluzione per la prima variabile (in questo caso, la x), e il secondo valore è la soluzione per la seconda variabile (in questo caso, la y).
Operazioni su numeri.
Sono contraddistinte da un punto iniziale, per non confonderle con le corrispondente operazioni su matrici. Possono venire applicate anche a matrici, ma soltanto elemento per elemento. Le operazioni su numeri, e su matrici ma elemento per elemento includono:
M+N = somma elemento per elemento
M-N = sottrazione elemento per elemento
M.*N = prodotto elemento per elemento
M./N = divisione elemento per elemento
M.^n = elevazione alla n elemento per elemento
Per esempio: se B = [1,2,3,4,5]; abbiamo B+B = [2,4,6,8,10], e B.*B = B.^2 = [1,4,9,16,25], e B./B = [1,1,1,1,1].
Un avvertimento: a differerenza di quanto siamo abituati a fare in algebra, qui non possiamo omettere di scrivere i prodotti. Per esempio, BB in Octave non indica B.*B, bensì la variabile di nome BB. Allo stesso modo, xy non è x.*y bensì la variabile di nome xy, e così via.
Applicazione di una funzione su numeri a matrici.
Per ogni nome f di funzione definita su numeri, vale la seguente convenzione:
f(M) = applicazione di f ad ogni elemento di M
In altre parole, M+1 è la matrice di elementi (M(i,j)+1), mentre sin([x_1,...,x_n]) è il vettore [sin(x_1), ..., sin(x_n)].
Questa convenzione, come vedremo nella prossima sezione, varrà anche una funzione f definita da noi. Tuttavia, occorrerà che f sia definita solo con operazioni su numeri oppure elemento per elemento. In altre parole, f potrà utilizzare le operazioni
+, .*, ./, .^n
ma non le operazioni su matrici,
*, /, ^n
4.3. Funzioni in Octave.
Definizioni di Funzioni. Se f è un nome qualunque, si può definire una funzione di nome f come segue:
function y = f(x_1,...,x_m)
corpo funzione (contenente y = ...;)
endfunction;
Oppure, in alternativa:
function [y_1,...,y_m] = f(x_1,...,x_m)
corpo funzione (contenente y_1=...;...;y_m = ...;)
endfunction;
Le variabili x_1,...x_m sono detti valori in ingresso o parametri di f. Le espressioni y ed [y_1,...,y_m] sono dette valori in uscita o valori di ritorno. y può essere un numero o un vettore o una matrice. [y_1,...,y_m] è un vettore.
Come primo esempio di funzione si può prendere
function y = square(x)
y = x.^2;
endfunction;
"square" esegue il quadrato di un numero x (si noti l'uso dell'operazione .^2 di quadrato su numeri, al posto dell'operazione ^2 di quadrato su matrici).
Ogni istruzione f(a_1,...,a_n) ha il seguente effetto:
z=square(10);
assegna 100 a z (senza scrivere nulla, a causa del punto e virgola posto alla fine).
Sottolineiamo che una funzione puo' restituire un vettore o una matrice. Per esempio, si possono usare funzioni per definire soluzioni di sistemi lineari i cui coefficienti dipendano da parametri. Come caso concreto, sia dato il sistema nel parametro t:
x + y = 3
x - y = t
la seguente funzione ne calcola la colonna delle soluzioni:
function X = soluzione(t)
X = [1,1;1,-1]\[3;t];
endfunction;
Per esempio, soluzione(1) = [2;1] (la colonna che corrisponde alle soluzioni: x=2, y=1).
Nomi locali e globali. I nomi utilizzati nella definizione di una funzione f sono detti locali alla funzione stessa. Tra i nomi locali ci sono i parametri x_1, .., x_n e i i nomi dei valori di ritorno (y oppure y_1, ..., y_n). Una funzione ignora il valore dei nomi non locali, quelli definiti all'esterno di essa. Viceversa, all'esterno di una funzione i valori dei nomi locali della funzione stessa sono ignoti.
Un esempio. Se scrivo Raggio = 1; prima di definire una funzione f, all'interno di f il nome Raggio sarà indefinito. All'interno di f potrò però usare un nome locale Raggio = 2. Ma attenzione: il valore del nome locale Raggio sarà indipendente dal valore assunto dal nome Raggio originario, che continuerà (fuori dalla definizione di f) a valere 1.
Un secondo esempio: se scrivo square(10), l'esecuzione di questa funzione assegna 10 ad x e 100 ad y (il valore di ritorno di square). Tuttavia, fuori della definizione di square, x e y sono indefiniti, oppure mantengono i valori che avevano prima.
Questa regola, tuttavia, può essere violata dichiarando (sia dentro che fuori dalla funzione) un nome come globale. Supponiamo che io scriva, sia prima della definizione di f, sia all'interno di essa:
global Raggio;
In questo caso, e solo in questo caso, se definisco Raggio = 1; prima di definire f, Raggio varrà 1 anche all'interno della definizione di f.
Files con definizioni Octave.
Non ci conviene definire una funzione direttamente entro una finestra Octave. Infatti:
Chiameremo i files che contengono istruzioni Octave "files Octave", per brevità. I nomi dei files Octave hanno estensione (cioè devono terminare con) ".m" (esempio: "pippo.m").
Files con programmi Octave (solo per notizia, non fanno parte del corso).
Un altro motivo per scrivere un file Octave è voler scrivere un programma. Questo argomento, che accenniamo appena, è riservato agli allievi che già conoscono la programmazione.
Quando Octave legge un programma, ne esegue tutte le istruzioni nell'ordine in cui sono scritte. Un esempio di programma Octave sarà il file di interfaccia grafica disponibile nel sito del corso. Spiegheremo l'uso di tale programma nella prossima sezione.
Un comando utile per scrivere programmi in Octave è:
disp("Risoluzione equazione data:");
che stampa il testo dato tra virgolette:
Risoluzione equazione data:
Un altro è:
x = input("x=?");
che stampa il testo dato tra virgolette:
x=?
quindi aspetta che venga scritto una espressione Octave (numero, vettore, matrice), lo legge e lo assegna a x.
Sono inoltre disponibili in Octave, come già detto, i cicli "for" e "while". I commenti a un programma si devono scrivere preceduti da un segno %.
Scrittura di Files Octave (estensione ".m").
C'è un'unica avvertenza da tener presente nello: il file deve iniziare con un comando che non sia la definizione di una funzione, per esempio:
disp("Commento");
che stampa un certo commento.
Altrimenti, Octave richiede che il file sia di forma molto particolare: dovrà contenere una sola definizione di funzione e nient'altro, e inoltre il nome della funzione definita dovrà essere lo stesso nome del file. Per esempio, se il file si chiama "pippo.m", la funzione dovrà chiamarsi "pippo".
Lettura di files Octave. Siano progr.m e def.m due files Octave, il primo contenente un programma, il secondo solo delle definizioni. Se siamo in una finestra di terminale, possiamo eseguire il file prog.m di programma con il comando:
octave prog.m
Se siamo dentro Octave, possiamo eseguire prog.m scrivendone il nome privo di estensione:
prog
Allo stesso modo, possiamo leggere (per poi usare) le definizioni in def.m scrivendo:
def
Nel primo caso, terminati i comandi inclusi nel file letto ritorneremo alla finestra di terminale, e ogni definizione Octave sarà dimenticata. Nel secondo caso, terminati i comandi ritorneremo ad Octave, e ogni definizione Octave letta verrà ricordata (per la durata della sessione).
Salvataggio su file di dati.
Dati. Per salvare i valori delle variabili x_1,...,x_m (numeri, vettori, matrici) su di un file abbiamo i comandi:
save("nomefile", "x_1",...,"x_m");
oppure:
save nomefile "x_1" ... "x_m";
Si noti che tutti gli argomenti del primo comando, e gli ultimi m argomenti del secondo, non sono le variabili vere e proprie, ma i lori nomi (per questa ragione sono compresi tra virgolette). Per leggere (magari a distanza di tempo) i dati salvati occorre:
load nomefile
oppure:
load -force nomefile
Il primo legge x_1,...,x_m, ma non cancella i loro valori originari, quando ne hanno: il secondo cancella i loro valori originari. Infine i comandi:
load nomefile x_1 x_3
load -force nomefile x_1 x_3
leggono solo x_1 ed x_3 (rispettivamente, non cancellando, cancellando,
i valori originari).
4.4 Istruzioni grafiche in Octave.
Completiamo il corso accennando a come sia possibile ottenere grafici in Octave senza bisogno di utilizzare l'interfaccia descritta nella sezione precedente.
(1) Linee. Il comando e' plot(X,Y), dove X, Y sono i vettori-riga delle ascisse e delle ordinate degli n punti del grafico. Se f e' la funzione di cui si vuole fare il grafico, e se f contiene solo operazioni elemento per elemento (e non operazioni su matrici), é sufficiente scrivere plot(X,f(X)). Infatti se X = [x_1,...,x_n] allora f(X) = [f(x_1), ..., f(x_n)] è il vettore delle ordinate dei punti del grafico.
X si puo' definire come
X = (a:s:b);
e in tal caso contiene tutti i valori della forma a+i*s (con i³ 0), che siano < b.
X = [a,a+s,a+2*s,..., a+i*s, ....]
Il numero di elementi di X è n = 1+(parte intera di (b-a)/s).
Per disegnare contemporaneamente i grafici di f, g, ... il comando da usare è
plot(X,f(X),X,g(X), ...);
(2) Linee parametriche: usare plot(f(T),g(T)) per disegnare il grafico di x=f(t), y=g(t). T deve essere un vettore di valori per il parametro t (tempo).
Alternativamente: usare gplot(M) (dove M e' la matrice n x 2 delle coordinate degli n punti della linea). M può esserre definito con un ciclo "for":
M = zeros(n,2); t = a; n = (b-a)/s + 1;
for i=1:n M(i,1)=f(t); M(i,2)=g(t); t=t+s; endfor;
(3) Linee parametriche nello spazio. Definire con un ciclo "for" una matrice M degli n punti della linea, di dimensione n x 3, poi scrivere:
gset parametric; gsplot(M);
(4) Superfici nello spazio. Siano X = [x_1,...,x_n], Y = [y_1,...,y_m] due vettori riga di valori per le coordinate x e y. Tali valori di x, y formano i lati del rettangolo al partire dal quale vogliamo disegnare z=f(x,y). Se M e' una matrice n x m, con M (i,j) = f(x_i,y_j), allora il comando per generare il grafico di z=f(x,y) e':
mesh(x,y,M);
M si puo' generare con un opportuno ciclo "for". Alternativamente, si può usare il comando:
mesh(X,Y,f(MX,MY));
dove
MX = meshdom(x,y) ;
MY = meshdom(y,x)' (trasposta);
sono le matrici associate, rispettivamente, alle funzioni f(x,y) = x e f(x,y) = y. Per esempio, se X = [1,2,3], e Y = [4,5], allora
MX = 1 2 3
(5) Superfici parametriche, tipo sfera. Si consiglia di ricorrre all'interfaccia Octave introdotta a lezione. In essa, una superficie parametrica è disegnata tramite una linea parametrica nello spazio. Tale linea percorre tutti e soli gli spigoli della griglia di coordinate della superficie richiesta.
Rifinitura dei grafici.
Con i comandi:
axis(); axis([a,b]); axis([a,b,c,d]); axis([a,b,c,d,e,f]);
possiamo decidere quali punti del grafico saranno inclusi nel disegno. Il primo comando fa disegnare tutti i punti del grafico, anche a prezzo di usare scale diverse per i diversi assi, e di deformare notevolmente il grafico. Il secondo, fa disegnare solo i punti con a £ x £ b. Il terzo, solo i punti con a £ x £ b, c £ y £ d. Il quarto, solo i punti con a £ x £ b, c £ y £ d, e £ z £ f. Si noti che scegliendo (b-a) = (d-c) = (f-e) forziamo Octave ad utilizzare la stessa scala nei diversi assi.
I comandi:
title("TTT"); xlabel("X"); ylabel("Y"); zlabel("Z");
fanno inserire dei testi nel grafico, rispettivamente, come titolo, come etichette di x, di y, di z. Aggiungere un testo o un'etichetta è importante se desideriamo inserire un grafico in una relazione o in una tesi.
Per vedere l'effetto di una modifica occorre far ridisegnare il grafico con il comando:
replot;
Salvataggio su file di disegni.
Supponiamo di voler stampare su file un disegno per poterlo stampare, oppure aggiungere ad una relazione d'esame o a una tesi.
Occorre modificare sia il formato dei disegni (che normalmente è un formato Unix chiamato x11), sia ridefinire il file di output (che normalmente è una finestra, detta STDOUT o "standard output"). Fatto questo, bisogna far generare un'altra volta il disegno. Un esempio. Se vogliamo salvare un disegno nel formato "postscript", formato che rende possibile stamparlo, e se vogliamo chiamare X la copia salvata, dobbiamo dare i comandi:
gset terminal postscript;
gset out "X.ps";
replot;
Per riprendere a scrivere nel formato usuale, e sulla finestra di output usuale, occorrerà scrivere:
gset terminal x11; gset out "STDOUT";
In questo modo sia il formato del grafico chee il luogo dove esso viene
generato (una finestra del terminale) ritornano ad essere quelli originari.
5. Argomenti omessi di Octave.
In questo corso, come si è detto, per motivi di semplicità abbiamo omesso quella che forse è la caratteristica più interessante di Octave, la risoluzione delle equazioni differenziali.
Sono state anche quasi completamente omesse le caratteristiche di Octave come linguaggio di programmazione: manipolazioni di stringhe, uso di strutture dati, passaggio dei parametri per valore, ricorsione, eccetera.
Per tutti questi argomenti, ed altri ancora, rimandiamo chi fosse interessato al manuale disponibile nel sito di Octave:
http://www.che.wisc.edu/octave/
Scheda Octave. 1. Istruzioni di calcolo
Assegnazioni. x=3 (visualizza 3) oppure x=3; (non visualizza 3).
Nomi. Sequenze di lettere, numeri e "_". Es.: x,XX,x_1. Non iniziano con una cifra: 2x è un nome errato. xy é un nome unico, non è "x per y". f ed F sono variabili distinte.
Cicli for. for i=a:b istr_1; ...; istr_n; endfor;
Cicli while. while cond istr_1; ...; istr_n; endwhile;
Matrici. Matrici n´ m: M=[a_11,..,a_1m;..;a_n1,..,a_nm];
Matrici 1´ m: (vettori riga). V=[a_1,..,a_m];
Matrici n´ 1 (vettori colonna)W=[a_1;..;a_n];
M(i,j) vale a_ij. V(i) e W(i) valgono a_i. M=zeros(n,m); ha n´ m zeri.
Matrici: concatenazioni. Siano A, B, C matrici. [A,B,C] concatena B, C alla sinistra di A, mentre [A;B;C] concatena B, C sotto A.
Matrici: operazioni. eye(n) (matrice identità n´ n), M' (trasposta), det(M), inv(M) (inversa), M*N (prodotto di matrici), M^n (potenza di matrici), M/N (divisione di matrici), M\N (= M-1 * N=soluzione del sistema MX=N).
Matrici: operazioni elemento per elemento. M+N, M-N, M.*N, M./N, M.^n. Se f è definita solo con operazioni elemento per elemento: f(M) = applicazione di f ad ogni elemento di M. Esempio: se B = [1,2,3,4,5]; allora B+B = [2,4,6,8,10], B.*B = B.^2 = [1,4,9,16,25], B./B = [1,1,1,1,1], sin(B) = [sin(1), sin(2), sin(3), sin(4),sin(5)].
Funzioni. Definizione di una funzione di nome f.
function y = f(x_1,...,x_m)
corpo funzione (contenente y = ...;)
endfunction;
function [y_1,...,y_m] = f(x_1,...,x_m)
corpo funzione (contenente y_1=...;...;y_m = ...;)
endfunction;
Funzioni: nomi locali e non locali. y, y_i, x_j e i nomi definiti dentro f sono locali = indefiniti fuori f. Viceversa, f ignora il valore dei nomi non locali = definiti all'esterno di essa. Per violare la regola, dichiarare un nome global sia dentro che fuori la funzione.
Files Octave. Estensione ".m", es.: "pippo.m".
Files Octave: istruzioni Input/Output. disp("XXX"); stampa XXX. Invece x = input("x=?"); (i) stampa x=? (ii) si aspetta un valore da noi (iii) lo assegna ad x.
Files Octave: scrittura. Iniziare il file con disp("Commento");. Altrimenti, scrivere una sola definizione di funzione, di nome = nome del file (senza ".m").
Files Octave: lettura. In una shell Unix: octave prog.m esegue il programa Octave prog.m. Dentro Octave: usare solo prog. Dentro Octave: per leggere un file def.m di definizioni, scrivere def.
Files di dati. Per salvare i valori di x_1, ..., x_m: save("nomefile", "x_1",...,"x_m"); oppure save nomefile "x_1" ... "x_m". Per leggere i valori di x_1,..., x_m: load nomefile oppure load -force nomefile (per cancellare i valori originari). Invece load nomefile x_1 x_3 e load -force x_1 x_3 leggono solo x_1 ed x_3.
Scheda Octave. 2. Istruzioni grafiche
Linee. plot(X,Y), dove X, Y sono i vettori-riga delle ascisse e delle ordinate degli n punti della linea. Se f e' una funzione su numeri, usare plot(X,f(X)). Vettore delle ascisse X = (a:s:b). Per disegnare più grafici: plot(X,f(X),X,g(X)).
Linee parametriche. plot(f(T),g(T)), per il grafico di x=f(t), y=g(t). T vettore di valori per il parametro t. Oppure: gplot(M); dove M = matrice n´ 2 delle coordinate degli n punti della linea.
Linee parametriche nello spazio. Data M matrice degli n punti della linea, di dimensione n´ 3, scrivere gset parametric; gsplot(M).
Superfici nello spazio. Se X, Y sono due vettori riga di n, m valori per le coordinate x e y, ed M e' una matrice n´ m, con M (i,j) = f(x_i,y_j), allora il grafico di z=f(x,y) si ottiene con mesh(x,y,M);. M si puo' definire come f(MX,MY), dove MX = meshdom(x,y); e MY = meshdom(y,x)' (trasposta);
Superfici parametriche. Si consiglia di ricorrere all'interfaccia Octave di cui sopra.
Rifiniture: assi. I comandi axis(); axis([a,b]); axis([a,b,c,d]); axis([a,b,c,d,e,f]); fanno disegnare tutti i punti del grafico, solo quelli con a £ x £ b, solo quelli con a £ x £ b e c £ y £ d, solo quelli con a £ x £ b, c £ y £ d, e £ z £ f.
Rifiniture: commenti. I comandi: title("TTT"); xlabel("X"); ylabel("Y"); zlabel("Z"); fanno inserire titolo e etichette di x, di y, di z.
Rifiniture. Terminare sempre una modifica con replot per renderla esecutiva.
Salvataggio su file di grafici. Per salvare nel formato "postscript":
gset terminal postscript; gset out "X.ps";
replot. Per riprendere a disegnare
i grafici in una finestra: gset terminal
x11; gset out "STDOUT".
Scheda Octave. 3.Informazioni generali
Help. scrivere: help nomecomando.
Sito Octave (distribuisce gratuitamente il sistema e il manuale):
Octave è la versione gratuita di Matlab, un sistema per il calcolo di matrici utilizzato dagli ingegneri.
di Stefano Berardi - Università di Torino