Matematica II, 08.05.06

Octave e' un linguaggio di alto livello e un interprete per la soluzione numerica
di problemi di algebra lineare e di analisi matematica. Questo software e’ molto 
simile a Matlab, come sintassi, come orientamento al calcolo numerico e per la 
possibilita’ da parte dell’utente di estenderne le potenzialita’. 
Il sito ufficiale e’

http://www.gnu.org/software/octave/ 

Octave, a differenza di Matlab, e’ freeware: si puo’ copiare, ridistribuire e 
modificare secondo quanto stabilito dalla GNU General Public License della 
Free Software Foundation.

Una volta lanciato il programma, appare una finestra con un breve messaggio ed 
una linea di comando, 

>>

col simbolo di prompt >> al suo inizio ed il cursore di seguito; sulla linea di 
comando si digitano istruzioni, che vengono impartite col tasto di invio.

Octave lavora, sistema permettendo, su numeri floating-point a doppia precisione. 
Impartendo il comando 'realmin' si ottiene la visualizzazione 

realmin = 2.2251e-308 

del piu’ piccolo, in valore assoluto, di tali numeri; questa scrittura significa 
2.2251 10-308; impartendo il comando 'realmax' si ottiene la visualizzazione 
del piu’ grande di tali numeri. Impartendo il comando 'eps' si ottiene la 
visualizzazione 

eps = 2.2204e-16 

della precisione relativa; col comando 'help eps' si ottiene l'informazione 

eps is a built-in constant

 - Built-in Variable: eps
     The machine precision.  More precisely, `eps' is the largest
     relative spacing between any two adjacent numbers in the machine's
     floating point system.  This number is obviously system-dependent.
     On machines that support 64 bit IEEE floating point arithmetic,
     `eps' is approximately  2.2204e-16.

Con 'help' si ottiene l'elenco degli operatori, parole riservate, costanti, ..., 
funzioni incorporate nella applicazione. 

Con 'help -i' si ottiene il manuale di Octave. Nel manuale, seguendo il percorso

*Introduction:: A brief introduction to Octave
*Simple examples

troviamo la descrizione del modo nel quale Octave tratta i sistemi di equazioni 
lineari

Solving Linear Equations
To solve the set of linear equations ax = b, use the left division operator, ' \ ':

octave:7> a \ b

This is conceptually equivalent to ' inv(a)*b ', but avoids computing the inverse of a matrix directly.
If the coefficient matrix is singular, Octave will print a warning message and compute a minimum 
norm solution.

Un primo obiettivo delle lezioni in laboratorio e' comprendere con buona precisione
questa descrizione. In questa prima lezione partiremo un po' da lontano: passeremo 
in rassegna i vari modi che conosciamo per risolvere un sistema lineare, usando 
gli strumenti messi a disposizione da Octave in modo via via piu' fine.

====================================
Problema 1: determinare un polinomio

f(x) = p + q x + r x2

di grado al piu' 2 tale che

f(1)=5,   f(4)=1,   f(6)=3.
====================================

Svolgimento.
------------
Imponendo le tre condizioni sul polinomio otteniamo il sistema di tre equazioni
lineari nelle 3 incognite p, q, r

p +  q +   r = 5

p + 4q + 16r = 1

p + 6q + 36r = 3

Uno degli elementi fondamentali su cui opera Octave e’ la matrice. Per introdurre
una matrice assegnadola ad una variabile si digita sulla linea di comando il 
simbolo scelto per la variabile seguito dall’uguale = e dagli elementi della 
matrice, racchiusi fra parentesi quadre [...], listati riga per riga, separando
elementi della stessa riga con spazi e separando le righe con punti e virgola ;

1. Dalla linea di comando introduciamo la matrice dei coefficienti, con un nome,
ad es. A, la colonna dei termini noti, con un nome, ad es. b, e la matrice 
completa, con nome C

---con Octave--------------------------------------------------------------------
>> A = [ 1 1 1; 1 4 16; 1 6 36]
A =

        1        1        1
        1        4       16
        1        6       36

>> b = [ 5; 1; 3]
b =

        5
        1
        3

>> C = [ A b]
C =

        1        1        1        5
        1        4       16        1
        1        6       36        3
---------------------------------------------------------------------------------

2. Possiamo selezionare un elemento di C, una riga o una colonna, nel modo
seguente

---con Octave--------------------------------------------------------------------
>> C(2,3)
ans = 16
>> C(2,:)
ans =

        1        4       16        1

>> C(:,3)
ans =

        1
       16
       36
---------------------------------------------------------------------------------

3. Possiamo applicare alla matrice C il processo di triangolarizzazione cosi'

---con Octave--------------------------------------------------------------------
>> C
C =

        1        1        1        5
        1        4       16        1
        1        6       36        3

>> C(2,:) = C(2,:) - C(1,:)
C =

         1         1         1         5
         0         3        15        -4
         1         6        36         3

>> C(3,:) = C(3,:) - C(1,:)
C =

         1         1         1         5
         0         3        15        -4
         0         5        35        -2

>> C(3,:) = C(3,:) - 5/3*C(2,:)
C =

  1.0e+01  *

   0.10000   0.10000   0.10000   0.50000
   0.00000   0.30000   1.50000  -0.40000
   0.00000   0.00000   1.00000   0.46667
---------------------------------------------------------------------------------

4. Da questo punto in poi i risultati sono approssimati.
Osserviamo che la matrice dei coefficienti e' ora triangolare superiore non 
degenere, dunque possiamo affermare che il sistema e' determinato, di piu',
possiamo affermare che la matrice dei coefficienti e' non singolare ...;
posssiamo poi arrivare a determinare la soluzione applicando ulteriori operazioni
elementari ... in realta' c'e' un comando apposito, il comando 'rref', che prende
in entrata una matrice qualsiasi e restituisce in uscita una matrice triangolare
superiore, sempre ottenibile con operazioni elementari sulle righe, ma di una
forma particolarmente semplice:

---con Octave--------------------------------------------------------------------
>> C = [ A b] 
C =

        1        1        1        5
        1        4       16        1
        1        6       36        3

>> D = rref(C)
D =

   1.00000   0.00000   0.00000   8.20000
   0.00000   1.00000   0.00000  -3.66667
   0.00000   0.00000   1.00000   0.46667
---------------------------------------------------------------------------------

5. Il sistema che ammette la matrice D come matrice dei coefficienti e'

p            =  8.20000

     q       = -3.66667

           r =  0.46667

sul quale si legge direttamente la soluzione ... che e' anche la soluzione del
sistema iniziale.

Osserviamo che la soluzione trovata non e' altro che la quarta colonna della
matrice D

---con Octave--------------------------------------------------------------------
>> s1 = D(:,4)
s1 =

   8.20000
  -3.66667
   0.46667
---------------------------------------------------------------------------------

6. Affrontiamo il problema di risolvere il sistema lineare

p +  q +   r = 5

p + 4q + 16r = 1

p + 6q + 36r = 3

da un altro punto di vista. Indicati con A la matrice dei coefficienti, che sappiamo
essere non singolare e dunque invertibile, con y la colonna delle 3 incognite, e con
b la colonna dei termini noti, possiamo scrivere il sistema nella forma

A y = b

e risolverlo premoltiplicando entrambi i membri per l'inversa A-1 della matrice A,
ottenendo la soluzione

y = A-1 b

Questo conto si puo' fare con Octave nel modo seguente

---con Octave--------------------------------------------------------------------
>> A, b
A =

        1        1        1
        1        4       16
        1        6       36

b =

        5
        1
        3

>> s2 = A^-1*b
s2 =

   8.20000
  -3.66667
   0.46667
---------------------------------------------------------------------------------

7. Abbiamo ottenuto lo stesso risultato.

In realta' il modo piu' adeguato per risolvere il sistema con Octave e' quello di
effettuare la "divisione a sinistra" della colonna b sulla matrice A; cio' e'
concettualmente equivalente a premoltiplicare per A-1, ma permette alla
applicazione di evitare il calcolo diretto dell'inversa; il comando per la
divisione a sinistra e' '\', mentre per quella a destra e' '/'; bisogna
distinguere fra destra e sinistra poiche' il prodotto di matrici non e'
commutativo.

---con Octave--------------------------------------------------------------------

>> s3 = A\b
s3 =

   8.20000
  -3.66667
   0.46667
---------------------------------------------------------------------------------

8. Abbiamo ottenuto lo stesso risultato.

Rispetto al problema posto, possiamo affermare che esiste uno ed un solo
polinomio di grado al piu' 2 che soddisfa le condizioni poste, ed e', con buona
approssimazione, dato da

f(x) = 8.2 - 3.66667 x + 0.46667 x2

====================================
Problema 2: determinare un polinomio

g(x) = p + qx

di grado al piu' 1 tale che

g(1)=5,   g(4)=1,   g(6)=3.
====================================

Svolgimento.
------------
Imponendo le tre condizioni sul polinomio otteniamo il sistema di tre equazioni
lineari nelle due incognite p, q

p +  q = 5

p + 4q = 1

p + 6q = 3

In realta' questo sistema non ha soluzioni; con il processo indicato da Octave,
pero', si trova una ed una sola 'soluzione' ... nella prossima lezione vedremo
cosa cio' significa, per il momento la calcoliamo.
Introduciamo la matrice dei coefficienti, con nome A, la colonna dei termini noti,
con nome b, e dividiamo a sinistra la colonna b per la matrice A

---con Octave--------------------------------------------------------------------
>> A = [1 1; 1 4; 1 6]
A =

        1        1
        1        4
        1        6

>> A, b
A =

        1        1
        1        4
        1        6

b =

        5
        1
        3

>> t = A\b
t =

   4.73684
  -0.47368
---------------------------------------------------------------------------------

Possiamo affermare che esiste uno ed un solo polinomio di grado al piu' 1 che
soddisfa, in un certo senso approssimato da definire, le condizioni poste,
ed e' dato da

g(x) = 4.73684 - 0.47368 x

====================================
Problema 3: determinare i polinomi

h(x) = p + q x + r x2 + s x3

di grado al piu' 3 tali che

h(1)=5,   h(4)=1,   h(6)=3.
====================================

Svolgimento.
------------
Imponendo le tre condizioni sul polinomio otteniamo il sistema di tre equazioni
lineari nelle quattro incognite p, q, r, s

p +  q +   r +   r = 5

p + 4q + 16r + 64r = 1

p + 6q + 36r +216r = 3

In realta' questo sistema ha infinite soluzioni; con  il processo indicato da 
Octave, pero', si trova una ed una sola 'soluzione' ... nella prossima lezione
vedremo come viene scelta, per il momento la calcoliamo.
Introduciamo la matrice dei coefficienti, con nome A, la colonna dei termini
noti, con nome b, e dividiamo a sinistra la colonna b per la matrice A

---con Octave--------------------------------------------------------------------

>> A = [1 1 1 1; 1 4 16 64; 1 6 36 216]
A =

        1        1        1        1
        1        4       16       64
        1        6       36      216

>> A, b
A =

        1        1        1        1
        1        4       16       64
        1        6       36      216

b =

        5
        1
        3

>> v = A\b
v =

   3.97217
   2.32276
  -1.47109
   0.17616
---------------------------------------------------------------------------------

Possiamo affermare che fra gli infiniti polinomi di grado al piu' 3 che
soddisfano le condizioni poste, se ne puo' scegliere uno, in un certo modo
canonico da definire, che nel nostro caso e' dato da

h(x) = 3.97217 + 2.32276 x - 1.47109 x2 + 0.17616 x3