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.