Una funzione di Derive poco conosciuta: FIT (prima parte)

Una funzione di Derive poco conosciuta:
FIT
(prima parte)
Sebastiano Cappuccio
Mathesis - Forlì
I moderni programmi di elaborazione simbolica dispongono di numerosissime
funzioni predefinite che possono aiutare l'utente in una grande varietà di casi. Si
pensi ad esempio ad un programma come Mathematica di Wolfram, che
possiede oltre 800 funzioni, o come il recentissimo Maple V che arriva
all'astronomico numero di 2500.
Il povero Derive oltrepassa a mala pena le 150 funzioni predefinite, tuttavia
riesce ugualmente a dare all'utente molti utili strumenti per il suo lavoro.
In questa sede vogliamo parlare di una funzione poco nota ma che può essere
utile ad insegnanti e studenti che lavorano con la matematica a livello di Scuola
Secondaria Superiore: la funzione FIT.
A cosa serve
La funzione FIT risolve un classico problema dell'analisi numerica: determinare
la funzione di migliore approssimazione, cioè la funzione f (x) di un certo tipo
prefissato che meglio approssima un insieme di m punti di osservazione P1, P2, .
. . , Pm di coordinate, rispettivamente, (x0,y0), (x1,y1), . . . . (xm,ym).
La funzione f (x) è del tipo
f (x) = a0 ϕ0(x) + a1 ϕ1(x) + . . . + an ϕn(x)
con n < m, ove le funzioni ϕk(x) sono funzioni elementari definite in un
intervallo [a, b] che contiene le ascisse x0, x1, ... xm di tutti i punti di
osservazione dati.
Per funzioni elementari si intendono, in questo contesto, funzioni polinomiali,
esponenziali e trigonometriche.
Si tratterà quindi di determinare i parametri a0, a1, ... am in modo che il grafico
della funzione f (x) passi il più possibile vicino ai punti di osservazione dati.
P2
P0
Pm
P1
x
0
x
1
x
2
........
x
m
Il metodo che viene seguito è quello, ben noto, dei minimi quadrati che
permette di determinare i parametri a0, a1, ... am della funzione f (x) in modo
che la somma dei quadrati degli scarti yi − f(xi) sia minima.
Un caso particolarmente importante è quello della retta dei minimi quadrati, in
cui la funzione di migliore approssimazione è la funzione lineare mx + q.
Non è questa la sede per scendere in dettaglio sul metodo dei minimi quadrati:
si vedano, ad esempio, i testi di G. C. Barozzi [3] oppure di I. Galligani [6]
citati in Bibliografia.
Per cominciare
Si suppone che il Lettore abbia già una certa dimestichezza con l'uso di Derive.
I "listati" di Derive sono scritti seguendo le convenzioni già apparse il questa
stessa Rivista in [1] e [5], vale a dire:
l Le espressioni precedute da un numero di linea sono quelle che
appaiono sullo schermo di calcolo.
l Prima di ogni espressione, allineati sulla destra e chiusi tra
parentesi quadre, sono indicati i comandi che l'utente deve
impartire da menu o ciò che deve digitare. In particolare i
comandi sono scritti in grassetto.
NOTA BENE
In queste pagine per delimitare i comandi da impartire o le
espressioni da digitare saranno usate le parentesi graffe invece delle
quadre; ciò per evitare confusione con i delimitatori delle matrici,
che in Derive sono, per l'appunto, delle parentesi quadre.
E' da notare, come vedremo più avanti, che la sintassi della funzione FIT si è
modificata con il procedere delle versioni di Derive.
In questo ed in tutti gli esempi successivi si farà riferimento alla versione 2.5 di
Derive. Gli utenti di versioni precedenti (a partire dalla 2) sono pregati di
leggere prima l'Appendice di questo articolo.
Un primo esempio: la retta dei minimi quadrati
La funzione FIT accetta due argomenti: il vettore v e la matrice m.
Il primo argomento v rappresenta il vettore che riporta la variabile indipendente
x e la funzione f (x), dipendente da certi parametri, che deve "onorare" i punti le
cui coordinate sono riportate nella matrice m. Derive calcola il valore dei
parametri tali da rendere minima la somma dei quadrati degli scarti tra f(xi) ed
yi, con i = 1, 2, . . . , n.
1: "Retta dei minimi quadrati"
{Author m:=[[1,1],[2,3],[3,2],[4,3]]}1


2: m := 







{Author v := [x, ax + b]}
3: v := [x, ax + b]
{Author fit(v,m)}
4: FIT{v,m)
{Simplify #3}
5: x/2 + 1
Si ottiene così la retta dei minimi quadrati di equazione y = ax + b relativa ai
quattro punti di coordinate (1, 1), (2, 3), (3, 2), (4, 3).
Può essere interessante visualizzare graficamente l'insieme dei punti dati e la
retta trovata:
{Jump #2}
{Plot Overlay Plot}
{<F10>}
Si sarebbe anche potuto usare il comando Declare Matrix, ma per
semplicità abbiamo preferito la digitazione diretta della matrice.
1
{Algebra}
{Jump #5}
{Plot Plot}
Il comando Jump evidenzia la linea specificata. Il comando Plot fa
passare all'ambiente di grafica e il successivo comando Plot dà
esecuzione al disegno del grafico della espressione evidenziata. In questo
caso, poiché l'espressione evidenziata è una matrice 4 x 2, viene
interpretata da Derive come un insieme di punti che vengono così
rappresentati sullo schermo.
Il comando Overlay, necessario solo per chi usa la versione 2.5 di
Derive o una successiva, serve per indicare che si desidera lavorare con
l'ambiente di grafica a "pieno schermo".
Il comando <F10> indica la pressione del corrispondente tasto funzione:
questo tasto modifica la scala dello schermo di grafica per ottenere una
migliore visione dei punti.
Il comando Algebra fa tornare al normale ambiente di calcolo.
Con il comando Jump #5 si evidenzia la linea che reca l'equazione della
retta trovata.
Il successivo comando Plot Plot fa tornare all'ambiente di grafica e fa
tracciare la retta desiderata.
Ancora sulla retta dei minimi quadrati
Calcoleremo ora le coordinate del baricentro dei punti dati e verificheremo che
questo appartiene alla retta dei minimi quadrati.
E' noto 2 che il baricentro dei punti di coordinate (x1, y1), (x2, y2), . . . , (xn, yn) ha
come coordinate le medie aritmetiche delle ascisse e delle ordinate dei punti:
 Σn x Σn y 
 k=1 k k=1 k 
 n , n .




Le funzioni che ora costruiremo saranno congegnate in modo da poter operare
qualunque siano i valori riportati nella matrice m e soprattutto qualunque sia il
loro numero.
{Author x_bar:=sum(element(m,k,1),k,1,
dimension(m))/dimension(m)}
2
Vedi, ad esempio, [3].
Σ
k=
6: x_bar(m):=
{Author y_bar:=sum(element(m,k,2),k,1,
dimension(m))/dimension(m)}
D
7: y_bar(m):=
Σ
k=
{Author [x_bar(m), y_bar(m)]}
8: [x_bar(m), y_bar(m)]
{Simplify #8}
9: [5/2, 9/4]
{Plot Plot}
{Algebra}
{Transfer Save Derive MINQUA1.MTH}
Le funzioni element(m,k,1) ed element(m,k,2) forniscono,
rispettivamente, gli elementi della prima e della seconda colonna e della
k-esima riga della matrice m, vale a dire rispettivamente l'ascissa e
l'ordinata del k-esimo punto dato.
La funzione dimension(m) fornisce la dimensione del vettore m (si
ricordi che in Derive una matrice è vista come vettore di vettori) e quindi
"conta" il numero dei punti dati.
La funzione sum fornisce la somma rispettivamente delle ascisse e delle
ordinate con l'indice k che va da 1 al numero dei punti dati.
Il comando Plot Plot visualizza il punto trovato. E' facile verificare che
la retta dei minimi quadrati passa per il baricentro.
L'ultimo comando salva il lavoro fin qui svolto nel file di nome
MINQUA1.MTH.
Vogliamo ora fare un'altra osservazione: l'ultimo punto proposto nel precedente
esempio, (4,3), appartiene alla retta trovata. Quale sarà la retta dei minimi
quadrati se non si considera questo punto?
{Author m:=[[1,1],[2,3],[3,2]]}

10: m:= 


3





Gli utenti possono richiamare la matrice m nella linea di editing
evidenziandola e premendo il tasto funzione <F3> per poterla così modificare.
3
{Author fit(v,m)}
11: FIT(v, m)
{Simplify #11}
12: x/2 + 1
Si ottiene la stessa retta trovata in precedenza. E' facile giustificare il
risultato ottenuto.
Per concludere, vogliamo ampliare la nostra applicazione ad un insieme più
numeroso di punti, generato casualmente da Derive stesso.
{Plot Delete All}
{Algebra}
{Author vector([2+6 random(1),
1+3 random(1)],k,2,8,1/2)}
13:VECTOR([2+6RANDOM(1),1+3RANDOM(1)],K,2,8,1/2)
{Simplify #13}
14: . . . . . .
{Author m:=<F3>}
15: . . . . . .
{Plot Plot Algebra}
{Author fit(v,m)}
16: FIT(v, m)
{Simplify #16}
17: . . . . . .
{Plot Plot Algebra}
{Author [x_bar(m), y_bar(m)]}
18: [x_bar(m), y_bar(m)]
{Simplify #18}
19: . . . . . .
{Plot Plot}
{Algebra Transfer Save Derive MINQUA2.MTH}
{Transfer Clear Y}
I primi comandi servono per passare all'ambiente di grafica, cancellarlo e
tornare all'ambiente di calcolo.
Viene poi utilizzata la funzione random, disponibile solo a partire dalla
versione 2.15 di Derive, per generare casualmente le coordinate di un
punto.
La funzione random(1) genera un numero razionale casuale
appartenente all'intervallo [0,1[.
Quindi 6 random(1) fornisce un numero razionale casuale non minore
di 0 e minore di 6. Aggiungendo 2 si ottiene un numero casuale
appartenente all'intervallo [2, 8[ che rappresenta l'ascissa del punto 4.
Analogo discorso per le ordinate.
Le coordinate del punto sono state inserite all'interno di un ciclo
enumerativo, realizzato con la funzione vector, che ripete per 15 volte
(con la variabile k che va da 1 a 15 a passo di 1) la scelta casuale del
punto.
Con il comando Simplify viene così prodotta una "nube" di 15 punti di
coordinate casuali compresi tra le rette x = 2, x = 8, y = 1, y = 4.
Il risultato ottenuto non viene riportato nel "listato" perché, ovviamente,
varia in modo casuale.
L'assegnazione Author m:= <F3> viene fatta separatamente perché,
altrimenti, ogni volta che viene invocata la variabile m, verrebbe generata
una nuova successione di punti con ordinata casuale, sempre diversa dalla
precedente.
Il compito del tasto funzione <F3>, già accennato in precedenza, è quello
di richiamare nella linea di editing l'espressione evidenziata (in questo caso
le coordinate dei punti casuali) risparmiando così all'utente la noia di
doverla digitare manualmente..
I comandi successivi servono per disegnare la "nube di punti", per
determinare e disegnare il loro baricentro, utilizzando le funzioni
x_bar(m) ed y_bar(m) precedentemente definite, per trovare la retta
dei minimi quadrati corrispondente e per tracciarne il grafico.
Gli ultimi comandi salvano il lavoro fin qui svolto nel file di nome
MINQUA2.MTH e azzerano l'ambiente di calcolo.
Ecco come appare una "nube" di punti generata casualmente; il punto
contrassegnato dalla freccia è il loro baricentro:
4
Si osservi che le ascisse di alcuni dei punti dati possono anche
coincidere, ma non devono essere tutte coincidenti perché in tal caso la retta dei
minimi quadrati sarebbe parallela all'asse delle ordinate e non potrebbe essere
espressa nella forma y = ax + b; ma questa eventualità è assai remota.
La parabola dei minimi quadrati
Come si è detto in precedenza, la funzione FIT non produce solo la retta dei
minimi quadrati, ma, più in generale, la curva di migliore approssimazione del
tipo indicato nel vettore v. E' quindi possibile ottenere, ad esempio, la parabola
dei minimi quadrati che approssima un dato insieme di punti.
10: v:=[x,ax2+bx+c]
{Transfer Load Derive MINQUA1.MTH}
{Author v:=[x,ax^2+bx+c]}
{Author fit(v,m)}
11: FIT(v,m)
12: -x2/4+7/4x-1/4
{Simplify #11}
Con il noto comando Plot è consigliabile visualizzare l'insieme dei punti dati e
la parabola ottenuta.
Alcune applicazioni di geometria analitica
La funzione FIT è utile anche per risolvere molti problemi classici di geometria
analitica: se i punti dati sono solo due 5 , la retta dei minimi quadrati è,
ovviamente, la retta individuata da essi. E' quindi facile determinarne
l'equazione.
5
con diverse ascisse
Analogamente, senza ricorrere esplicitamente alla risoluzione di un sistema
lineare, è facile determinare l'equazione della parabola con asse parallelo all'asse
delle ordinate passante per tre punti dati (non allineati).
Vediamone un esempio: determinare l'equazione della parabola passante per i
punti A (0, 2), B (1, 1), C (4, 0) 6 .

1: m:= 







2: v:=[x,ax2+bx+c]
{Author m:=[[0,2],[1,1],[4,0]]}
{Author v:=[x,ax^2+bx+c]}
{Author fit(v,m)}
3: FIT(v,m)
4: 1/6 x2 - 7/6 x + 2
{Simplify #3}
Si consiglia di tracciare con l'ormai ben noto comando Plot il grafico
della parabola e dell'insieme dei punti dati.
Un altro problema molto comune nell'insegnamento della geometria analitica
nella scuola secondaria è quello di determinare la retta passante per un punto
dato e parallela ad una retta data.
Risolviamo con Derive il seguente problema: trovare la retta passante per A
(1,3) e parallela alla retta di equazione y = 2x + 3.
{Author m:=[[1,3]]}7
5: m:=[1 3]
{Author v:=[x,2x+b]}
6: v:=[x,2x+b]
{Author fit(v, m)}
7: FIT(v, m)
{Simplify #7}
8: 2x+1
La funzione lineare di migliore approssimazione indicata nel vettore v ha
un solo "grado di libertà", cioè dipende dal solo parametro b, dato che il
6
La numerazione ricomincia da 1: perché si suppone di iniziare una
nuova sessione di lavoro.
7
La doppia parentesi quadra è necessaria per informare Derive che si
tratta di una matrice, anche se costituita dalle coordinate di un solo punto e non
di un vettore.
coefficiente angolare a deve essere 2 a causa dell'imposto parallelismo con
la retta data.
Altre applicazioni di geometria analitica
Sorge spontanea la domanda; cosa succederebbe se si cercasse la retta di
migliore approssimazione con un insieme di punti dati costituito da un solo
punto? Ovvero, se si cercasse la parabola di migliore approssimazione con un
insieme di solo due punti dati?
La risposta è ovvia: si ottengono rispettivamente il fascio di rette di centro il
punto dato e il fascio di parabole che ha come punti base i due punti dati.
Vediamo come risolvere questi problemi con Derive:
{Author v:=[x,ax+b]}
9: v:=[x,2x+b]
{Author fit(v, m)}8
10: FIT(v, m)
{Simplify #10}
11: @1 x - @1 + 3
Il simbolo @n, ove n è un numero intero, viene usato da Derive per
rappresentare una variabile arbitraria.
Ciò significa che il problema proposto è indeterminato, cioè ammette
infinite soluzioni. In pratica nel nostro esempio @1 rappresenta il
parametro al variare del quale si ottengono le rette del fascio con centro
nel punto (1, 3).
E' possibile mostrare il grafico di alcune rette del fascio:
{Author vector(@1 x - @1 + 3, @1, -5, 5)
12: VECTOR(@1 x - @1 + 3, @1, -5, 5)
{Simplify #12}
13: [8-5x, 7-4x,6-3x, ............]
Come è noto, con la funzione vector si ottengono le equazioni delle rette del
fascio corrispondenti ai valori di @1 che variano a passo di 1 da −5 a 5.
Con il comando Plot è possibile ottenerne il grafico:
8
Rimane valida la definizione della matrice m fatta in precedenza.
Analogamente, nel caso della parabola per due punti:
−
14: m:= 




15: v:=[x, ax2+bx+c]
{Author m:=[[-1,1],[1,2]]}
{Author v:=[x, ax^2+bx+c]}
{Author fit(v, m)}
16: FIT(v, m)
{Simplify #16}
17: @2 x2 + x/2 - @2 + 3/2
{Author vector(<F3>,@2,-3,3,0.5)}
18: VECTOR(@2 x2 + x/2 - @2 + 3/2, -3, 3, 0.5)
{Simplify # 18}
19: [-3x2+x/2+9/2, .............]
Vengono così generate alcune rette del fascio, con il parametro @2 che
varia da −3 a 3 a passi di 1/2.
Con il comando Plot è possibile ottenerne il grafico:
Prossimamente . . .
Nella seconda parte di questo articolo si vedranno altre applicazioni della
funzione FIT, di una certa utilità in un contesto di scuola secondaria superiore;
tra queste: la ricerca del tipo di dipendenza tra due insiemi di valori
sperimentali, un cenno al metodo di interpolazione dei polinomi di Lagrange, ed
alla integrazione numerica con il metodo di Simpson, la possibilità di usare FIT
anche con funzioni in due variabili.
Si parlerà inoltre di GOODNESS_OF_FIT, una funzione presente in Derive ma
non documentata nel manuale. Si accennerà infine a come è stata realizzata in
Derive la funzione FIT e quali sono gli inconvenienti che si possono presentare.
Appendice
NOTA PER GLI UTENTI DI VERSIONI PRECEDENTI LA 2.5.
Premettiamo che la funzione FIT esiste solo a partire dalla versione 2 di Derive.
In questa versione l'argomento di FIT è una sola matrice del tipo







x, f(x) 
x 1 , y 1 
x 2 , y 2 

..., ... 

xn, yn 
che deve riportare nella prima riga, detta label row, la variabile indipendente x e
la funzione di migliore approssimazione f (x) del tipo desiderato.
Le righe successive riportano le coordinate dei punti di osservazione.
Si noti che la separazione della label row dalla matrice dei dati realizzata a
partire dalla versione 2.5 consente un più agile uso della funzione FIT: si
possono così realizzare vari FIT secondo diverse funzioni di migliore
approssimazione, senza dover riscrivere l'intera matrice ma riscrivendo il solo
vettore v.
Per facilitare il lavoro degli utenti di precedenti versioni si suggerisce di operare,
invece che la funzione FIT, con la seguente funzione FIT2, così definita:
{Transfer Load Utility VECTOR.MTH}
{Author fit2(v,m):=fit(append_vectors([v],m))}
1: FIT2(v, m):=FIT(APPEND_VECTORS([v],m))
Il primo comando serve per caricare una libreria di funzioni di nome
VECTOR.MTH. Queste funzioni, tra cui la APPEND_VECTORS che
qui utilizziamo, saranno disponibili per l'utente anche se non appariranno
nello schermo di Algebra. 9
Chi userà la funzione FIT2 ora definita dovrà fare attenzione che i numeri
di linea dei "listati" successivi vengono ovviamente alterati. In particolare
dovrà aumentare di una unità il numero di linea nei riferimenti; ad esempio
dovrà leggere jump #3 invece di jump #2.
La parentesi quadra che racchiude il vettore v è necessaria perché in
Derive una matrice è vista come un "vettore di vettori".
9
BIBLIOGRAFIA
[1] G. C. Barozzi, DERIVE: un sistema di calcolo simbolico al servizio della
didattica, La matematica e la sua didattica, Maggio-Agosto 1990.
[2] G. C. Barozzi, I sistemi di manipolazione algebrica nell'insegnamento
medio superiore: promessa o minaccia?, Atti del Convegno "Matematica e
Informatica a scuola" (a cura di B. D'Amore), Roma, Armando Editore, 1988.
[3] G. C. Barozzi, Corso di analisi matematica, Bologna, Zanichelli, 1989.
[4] G. C. Barozzi - S. Cappuccio, Matematica I, Consorzio Nettuno, Bologna,
Pitagora Edirice, 1993.
[5] S. Cappuccio, Per un uso "creativo" del laboratorio di informatica, La
matematica e la sua didattica, Ottobre-Dicembre 1993.
[6] I. Galligani, Elementi di analisi numerica, Bologna, Calderini, 1986.