Informatica per la Matematica Giorgio Meini © 2000 X Algoritmi numerici Prerequisiti: − − − − − − − − − − − − successioni numeriche convergenti e divergenti equazioni algebriche e trascendenti geometria analitica della retta e della parabola sistemi lineari e matrici derivata di una funzione e funzioni derivate teoremi relativi alle funzioni continue e derivabili polinomi in una variabile integrale definito funzionalità numeriche, algebriche e grafiche dell'ambiente Derive numeri, formule e grafici in ambiente Excel programmazione in linguaggio VBA/Excel errori del calcolo in aritmetica finita X.0 Introduzione X.1 Risoluzione approssimata di equazioni X.2 Risoluzione di sistemi lineari X.3 Interpolazione X.4 Derivazione e integrazione numerica Riferimenti bibliografici: - Demidovic e Maron, "Fondamenti di calcolo numerico", MIR, Mosca, 1981 - Bevilacqua, Bini, Capovani e Menchi, "Introduzione alla matematica computazionale", Zanichelli, Bologna, 1987 - Rossi, "La matematica dell'incertezza: didattica della probabilità e della statistica", Zanichelli, Bologna, 1999 Informatica per la Matematica Giorgio Meini © 2000 X.0 Introduzione X.0.0 Gli algoritmi numerici X.0.0.0 Molte situazioni reali sono rappresentabili mediante un modello matematico relativamente semplice (come una equazione polinomiale, un sistema lineare, …), ma spesso il valore numerico che rappresenta la soluzione di un problema reale non è di semplice determinazione. Un metodo numerico consente di approssimare - con il grado di precisione richiesto dal problema specifico - un valore altrimenti impossibile da determinare con metodi algebrici (è il caso della soluzione di una equazione polinomiale di grado superiore al IV per la quale non esiste - nel caso generale - una formula risolutiva basata sulle comuni operazioni aritmetiche), oppure di calcolare in modo semplice l'approssimazione numerica di un valore la cui determinazione esatta per via algebrica risulta difficile (è il caso della soluzione di una equazione polinomiale di III grado per la quale esiste una complessa formula risolutiva che quasi mai viene utilizzata). Come vedremo un metodo numerico è spesso caratterizzato dalla necessità di effettuare molti calcoli relativamente semplici in base a uno schema ripetitivo: è per questo motivo che gli algoritmi numerici sono quasi esclusivamente impiegati per la realizzazione di programmi di calcolo eseguiti da un computer. In alcuni casi (un esempio notevole è dato dalla risoluzione di sistemi lineari con molte equazioni e molte incognite: alcuni problemi reali hanno come modello matematico sistemi lineari con centinaia di equazioni e centinaia di incognite) pur esistendo algoritmi algebrici per la determinazione di soluzioni esatte, eventualmente espresse in termini di valori razionali o di radicali, la dimensione del problema rende comunque necessario il ricorso ad un programma di calcolo: gli algoritmi numerici approssimati si sono dimostrati in grado di calcolare approssimazioni delle soluzioni con maggiore velocità e precisione rispetto ad algoritmi derivati dal metodo algebrico esatto. X.0.0.1 In sintesi un algoritmo numerico approssimato viene utilizzato: per calcolare l'approssimazione di un valore numerico non altrimenti determinabile con metodi algebrici; per calcolare l'approssimazione di un valore numerico non facilmente determinabile in forma esatta con metodi algebrici; per calcolare l'approssimazione di un valore numerico con una precisione maggiore rispetto ad un algoritmo ottenuto come implementazione di un metodo algebrico esatto. X.0.1 Un metodo per calcolare π X.0.1.0 L'approssimazione con un elevato grado di precisione del valore numerico di π (il rapporto tra la misura della circonferenza e la misura del relativo diametro) ha costituito forse il principale compito della matematica numerica nell'antichità. Il valore Informatica per la Matematica Giorgio Meini © 2000 di π è stato approssimato sia da Archimede nel III secolo a. C., ricorrendo ad un algoritmo che ancora oggi porta il suo nome, che - con una precisione rimasta insuperata per molti secoli - dal matematico cinese Tsu Chung-chi nel V secolo d. C.. Tutti i metodi utilizzati nell'antichità per il calcolo del valore di π sono basati sull'osservazione che la misura della circonferenza è approssimata per difetto dal perimetro di un poligono regolare inscritto e con precisione progressivamente migliore al crescere del numero di lati (in particolare: al raddoppiare del numero di lati del poligono regolare inscritto). X.0.1.1 Tsu Chung-chi fornì per π il valore approssimato 3,141593 ricorrendo probabilmente a un metodo basato sull'applicazione ripetuta del teorema di Pitagora. sn l2n ln Informatica per la Matematica Giorgio Meini © 2000 Infatti, sia r il raggio della circonferenza e ln il lato del poligono di n lati: l'apotema an 2 è data da l r 2 − n ; denominando sn la differenza r - an (sagitta) si ha che il lato 2 2 l l2n del poligono avente 2n lati è dato da s n + n . Una semplice sostituzione 2 algebrica consente di esprimere la misura l2n del lato del poligono di 2n lati in funzione della misura ln del lato del poligono di n lati: 2 l 2n = r 2r − 4r 2 − l n 2 che, scegliendo il raggio r come unità di misura (r = 1), diviene: l 2n = 2 − 4 − l n 2 . Quest'ultima formulazione rappresenta bene il carattere "ripetitivo" del metodo che si suppone impiegato da Tsu Chung-chi: ripetendo il calcolo a partire da un quadrato inscritto nella circonferenza di raggio unitario, per il quale la misura del lato l = 2 è di facile determinazione, e calcolando successivamente la misura del lato dei poligoni inscritti aventi 8, 16, 32, 64, 128, 256, 1024, … lati si costruisce una successione numerica i cui termini (il prodotto della misura del lato per il numero di lati del poligono regolare) sono approssimazioni progressivamente migliori del valore 2π che esprime la misura della circonferenza. È possibile dimostrare che il limite di tale successione è esattamente il valore 2π, ma ciò che a noi interessa - come a Tsu Chungchi più di millecinquecento anni fa - è approssimare numericamente tale valore. X.0.1.2 Utilizzando a questo scopo Excel è sensato far corrispondere righe successive della tabella con passi successivi di approssimazione. Nelle celle della colonna A viene determinato il numero di lati del poligono regolare di volta in volta preso in considerazione (inizialmente è 4, poi raddoppia ad ogni riga successiva), nelle celle della colonna B si calcola la lunghezza del lato del poligono (inizialmente 2 , nelle righe successive viene calcolato utilizzando la formula ricorsiva vista in precedenza), nelle celle della colonna C si ottiene l'approssimazione del valore π moltiplicando la lunghezza del lato per il numero di lati (approssimando in tal modo la lunghezza della circonferenza) e dividendo successivamente per 2. Una Informatica per la Matematica Giorgio Meini © 2000 volta impostati i valori iniziali e le formule è possibile utilizzare le funzionalità di Excel per "copiare" le formule nelle righe sottostanti ottenendo come risultato lo svolgimento dei calcoli previsti (le colonne B e C sono state precedentemente formattate per visualizzare numeri con 10 cifre decimali): Con 10 passi di approssimazione si arriva a calcolare il perimetro di un poligono regolare di 2048 lati in relazione al quale Excel produce una approssimazione del valore di π pari a 3,1415914215. Sappiamo - dato che non siamo i primi a calcolare il valore di π! - che il risultato ottenuto è preciso solo relativamente alle prime cinque cifre decimali (Derive fornisce un valore di 3,141592653 approssimando la costante π e impostando una precisione di 10 cifre e la funzione PI.GRECO() di Excel restituisce come risultato il valore 3,141592654). Dato che i primi 10 termini della successione generata rappresentano approssimazioni progressivamente migliori del valore π viene spontaneo pensare che la precisione migliorerà ulteriormente - se non indefinitamente, almeno fino a rendere esatte tutte le cifre decimali di cui dispongono i valori numerici utilizzati da Excel - aumentando il numero di passi di approssimazione e prendendo quindi in considerazione poligoni con un numero sempre maggiore di lati: Informatica per la Matematica Giorgio Meini © 2000 Osservando con attenzione la successione delle approssimazioni nella colonna C si nota che, a partire dalla riga 15, i valori, anziché aumentare progressivamente mantenendo come valore limite 3,14159265… come sarebbe logico aspettarsi (si tratta infatti dei perimetri di poligoni regolari inscritti aventi un numero crescente di lati), dapprima diminuiscono e dopo superano addirittura tale valore contraddicendo la teoria, secondo la quale i termini successivi di una successione crescente superiormente limitata rappresentano approssimazioni per difetto progressivamente più precise del limite della successione stessa. I passi successivi del procedimento di approssimazione sono addirittura catastrofici e l'errore commesso, invece che diminuire, cresce rapidamente fino a raggiungere un inaspettato 100% in corrispondenza dell'annullamento dell'approssimazione del valore di π: X.0.1.3 Che cosa accade? I concetti introdotti nel capitolo * sono sufficienti per capire che si tratta di errori dovuti alla finitizza dell'aritmetica impiegata da Excel per eseguire i calcoli: la misura del lato del poligono è progressivamente minore e finirà inevitabilmente, quando la misura calcolata sarà minore del più piccolo valore numerico rappresentabile, per provocare una condizione di underflow; ancora prima che si verifichi la condizione di underflow l'approssimarsi a 0 della misura del lato l del poligono nella formula 2 − 4 − l 2 causa cancellazione nel calcolo della differenza 2 − 4 − l 2 ; la necessaria moltiplicazione della misura del lato del poligono per il numero rapidamente crescente dei lati causa amplificazione dell'eventuale errore presente nel risultato del calcolo della formula 2 − 4 − l2 . Aggiungendo nelle celle della colonna D la formula che fornisce la differenza tra l'approssimazione calcolata (celle della colonna C) e il valore restituito dalla funzione Excel PI.GRECO() è possibile tabulare e rappresentare graficamente l'errore commesso in funzione del numero di passi di calcolo effettuati: Informatica per la Matematica Giorgio Meini © 2000 0,5 0,4 0,3 0,2 0,1 0,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 -0,1 L'errore relativo commesso, che è inizialmente il 10% del valore di π, diminuisce nei passi successivi fino a raggiungere un valore minimo pari a circa 10-9 (approssimativamente lo 0,00000004% del valore di π) in corrispondenza della quattordicesima iterazione del calcolo, ma torna a crescere in seguito fino all'impennata osservata nelle iterazioni successive alla venticinquesima. X.0.1.4 Questo andamento ad "U" caratterizza i grafici dell'errore - tracciati in funzione del numero di iterazioni effettuate - di molti algoritmi numerici; è causato dal diverso comportamento dei due tipi di errore che si sommano in un metodo numerico: l'errore analitico è l'errore teorico commesso ricorrendo ad una tecnica approssimata anziché ad un metodo esatto: in questo caso diminuisce progressivamente al crescere del numero di iterazioni1; l'errore algoritmico è l'errore di calcolo commesso dalla macchina che esegue una implementazione dell'algoritmo: in questo caso aumenta proporzionalmente al numero di iterazioni contrastando e talvolta annullando la precisione del risulato. X.0.1.5 Il problema può essere superato operando in un ambiente software per il calcolo simbolico come Derive? Considerando che il valore di π calcolato con il metodo di Tsu Chung-chi è definito dal limite per i→∞ della successione 2 i +1 ⋅ l i πi = = 2 i ⋅ li 2 i = 1,2,3,... dove l1 = 2 2 l i +1 = 2 − 4 − l i In Derive è possibile definire direttamente la formula ricorsiva che esprime la misura del lato del poligono regolare di 2n lati inscritto in una circonferenza di raggio unitario 1 si tratta della differenza tra i termini di una successione convergente e il limite della successione stessa: tale differenza deve necessariamente tendere a 0 al crescere dell'indice dei termini considerati. Informatica per la Matematica Giorgio Meini © 2000 ed esplicitamente la formula che definisce la successione stessa L'istruzione VECTOR(s(i),i,ii,if) costruisce un vettore dei valori della successione s(i) assegnando alla variabile-indice i i valori compresi tra l'indice iniziale ii e l'indice finale if inclusi Con l'istruzione VECTOR è possibile costruire in Derive un vettore avente per elementi i termini di una successione (in questo caso i primi 10) la cui semplificazione fornisce un vettore di espressioni algebriche che approssimate producono i valori ricercati [2.828427124, 3.061467458, 3.121445152, 3.136548490, 3.140331157, 3.141277248, 3.141513804, 3.141572987, 3.141587827, 3.141591756] La semplificazione algebrica del vettore dei soli primi 10 termini della successione (assolutamente insufficienti per una precisione che si estenda anche solo alle cifre decimali normalmente visualizzate da Derive) ha impegnato un PC relativamente potente (Pentium-II 350 MHz, 64 Mbyte RAM) per circa 20 secondi, ma lo stesso PC impiega più di 20 minuti per semplificare i primi 12 termin: la via della determinazione simbolica dei termini della successione si dimostra presto impraticabile sotto l'aspetto della complessità computazionale. X.0.1.6 Impostando Derive in modalità numerica invece che simbolica è possibile evitare questa difficoltà (rinunciando all'esattezza simbolica del calcolo algebrico) e, al tempo stesso, selezionare il numero di cifre da utilizare nei calcoli numerici In questo nuovo contesto la semplificazione del vettore dei termini della successione (esteso ai primi 50 termini) produce direttamente i valori approssimati [2.828427124, 3.061467458, 3.121445152, 3.136548490, 3.140331157, 3.141277248, 3.141513803, 3.141572946, 3.141587735, 3.141591344, 3.141592823, 3.141599476, 3.141596935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Informatica per la Matematica Giorgio Meini © 2000 Siamo nuovamente nella situazione verificata in ambiente Excel: la finitezza dell'aritmetica impiegata nei calcoli produce fenomeni di underflow e di cancellazione che azzerano i termini della successione a partire da un certo indice in poi; in ambiente Derive è però possibile intervenire sul numero di cifre impiegate nei calcoli e ripetere la semplificazione [2.8284271247461900976, 3.0614674589207181738, 3.1214451522580522855, 3.1365484905459392638, 3.1403311569547529121, 3.1412772509327728682, 3.1415138011443010755, 3.1415729403670913806, 3.1415877252771597313, 3.1415914215112001991, 3.1415923455701173019, 3.1415925765848738428, 3.1415926343385626015, 3.1415926487769988788, 3.1415926523865325040, 3.1415926532892119286, 3.1415926535151062855, 3.1415926536038939641, 3.1415926536101606406, 3.1415926536007606258, 3.1415926545666121457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Il numero dei termini "azzerati" è ora decisamente inferiore e la precisione delle approssimazioni fornite sicuramente migliore (l'ultimo termine non nullo - che non è il più preciso in quanto già risente di errori dovuti al fenomeno della cancellazione numerica - ha 8 cifre decimali corrette e presenta quindi un errore assoluto inferiore a 10-8). Aumentando ancora le cifre impiegate nei calcoli da Derive la semplificazione del vettore dimostra la permanenza di termini "azzerati" [2.828427124746190097603377448419396157139, 3.061467458920718173827679872243190934090, 3.121445152258052285572557895632355854843, 3.136548490545939263814258044436539067556, 3.140331156954752912317118524331690132143, 3.141277250932772868062019770788214408380, 3.141513801144301076328515059456822307948, 3.141572940367091384135800110270761429581, 3.141587725277159700628854262701918739459, 3.141591421511199973997971763740833955890, 3.141592345570117742340375994157369930476, 3.141592576584872665681606092237875308062, 3.141592634338562989095478263627791306375, 3.141592648776985669485107969277177149612, 3.141592652386591345803525521057963755529, 3.141592653288992765271943042173743830565, 3.141592653514593120163348243281094868980, 3.141592653570993208887718344859780980520, 3.141592653585093231068905795335816815944, 3.141592653588618236614208590772865505967, 3.141592653589499488000534660433798010642, 3.141592653589719800847116201025424888244, 3.141592653589774879058761587601897638893, 3.141592653589788648611672934348526478529, 3.141592653589792090999900770893396708829, 3.141592653589792951596957728180735500623, 3.141592653589793166746221966750872513422, 3.141592653589793220533538018943552437817, 3.141592653589793233980367095528156329952, Informatica per la Matematica Giorgio Meini © 2000 3.141592653589793237342074487619170207095, 3.141592653589793238182500090458864856465, 3.141592653589793238392606635678155740558, 3.141592653589793238445121649153462242430, 3.141592653589793238458328356221753124359, 3.141592653589793238461429931366579013297, 3.141592653589793238465025507391326767610, 3.141592653589793238466666966011320307622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] che scompaiono dai primi 50 solo raddoppiando ulteriormente il numero di cifre significative in questo caso è stata modificata l'espressione-vettore da semplificare in modo che Derive visualizzasse solo l'ultimo termine calcolato [3.141592653589793238462643383278483732551771296666640504454582527544 9994277917638] Le prime 29 cifre decimali di quest'ultimo valore sono tutte corrette: è possibile verificarlo confrontando il valore calcolato con il valore restitutito da Derive semplificando la costante π (Derive utilizza un algoritmo più veloce e più preciso di quello di Tsu Chung-chi per approssimare il valore numerico di π). X.0.1.7 In conclusione il ricorso a un ambiente di calcolo software in cui la precisione è sotto il controllo dell'utente (in termini di cifre da impiegare nei calcoli) ha consentito di migliorare significativamente la precisione complessiva dell'algoritmo di approssimazione numerica, ma non ha modificato il ruolo reciproco giocato dall'errore analitico e dall'errore algoritmico: l'errore (sia assoluto che relativo) del metodo presenta comunque un andamento ad "U" in funzione del numero di iterazioni effettuate (inizialmente elevato per la presenza di un considerevole errore analitico e poi, dopo un tratto "stabile" in corrispondenza del quale si ottengono le approssimazioni migliori, di nuovo elevato a causa della comparsa dell'errore algoritmico dovuto a fenomeni di underflow-overflow e/o di cancellazioneamplificazione). Il grafico che segue rappresenta la differenza tra le approssimazioni successive fornite dall'algoritmo e il valore di π calcolato da Derive in funzione del numero di iterazioni ed è stato tracciato in ambiente Derive rappresentando graficamente il risultato del seguente comando dopo avere nuovamente impostato la precisione a 40 cifre significative: Informatica per la Matematica Giorgio Meini © 2000 X.0.2 Un algoritmo per il calcolo della radice quadrata X.0.2.0 Una calcolatrice è in grado di calcolare il valore approssimato della radice quadrata di un qualsiasi numero con l'accuratezza di molte cifre decimali: come è possibile? Esiste di fatto un semplice algoritmo numerico capace di determinare il valore della radice quadrata effettuando ripetutamente semplici operazioni aritmetiche. X.0.2.1 Dovendo calcolare la radice quadrata di un numero positivo n si scelga casualmente un numero positivo x 0 considerandolo una prima approssimazione del valore n che intendiamo approssimare (si scelga il numero x 0 in modo che risulti sicuramente maggiore di n , sarà a questo scopo sufficiente che il suo quadrato sia x 0 2 > n ; in questo modo il numero x 0 costituirà un valore approssimato per eccesso di n ). n ; si ha che x 0 ⋅ y 0 = n e il valore n che intendiamo Calcoliamo y 0 = x0 approssimare è la media geometrica di x 0 e y 0 : y 0 è un valore approssimato per difetto di n . Calcoliamo ora la media aritmetica x1 di x 0 e y 0 : x1 = x0 + y0 1 n = x 0 + 2 2 x0 Ricordando che la media aritmetica fra due numeri è maggiore o uguale alla loro media geometrica2, x1 risulterà compreso fra n e x 0 , quindi x1 sarà un nuovo valore approssimato per eccesso della n , e sarà un'approssimazione migliore, cioè più prossima alla n , di quanto non fosse x 0 (infatti x 0 > x1 > n ): 2 Infatti, tenendo conto che a, b ≥ 0 , si ha: 1 (a + b ) ≥ ab ⇔ 1 (a + b )2 ≥ ab ⇔ a 2 + b 2 + 2ab ≥ 4ab ⇔ a 2 + b 2 − 2ab ≥ 0 ⇔ (a − b )2 ≥ 0 2 4 che è vera per ogni valore di a e b . Informatica per la Matematica y0 Giorgio Meini © 2000 n x1 Calcoliamo ora y1 = x0 n . Sarà nuovamente x1 ⋅ y1 = n (infatti operiamo nelle stesse x1 condizioni della fase precedente, essendo comunque x1 > n ) e n è di nuovo la media geometrica fra x1 e y1 ; y1 sarà quindi un nuovo valore approssimato per n n difetto della n . Inoltre, essendo x 0 < x1 , si ha > , cioè y1 > y 0 : anche y1 è un x1 x 0 valore approssimato per difetto di n e rappresenta un'approssimazione migliore rispetto a y 0 . Proseguiamo ripetendo i passaggi svolti in precedenza (infatti è proprio la ripetizione, o "iterazione", dei calcoli che caratterizza questo tipo di algoritmi numerici denominati metodi iterativi). Calcoliamo la media aritmetica fra x1 e y1 : x2 = x1 + y1 1 n = x1 + 2 2 x1 essa rappresenta un nuovo valore approssimato per eccesso di n ed è una approssimazione migliore, più prossima a n di quanto non fosse x1 . Calcoliamo poi n y2 = , esso sarà un nuovo valore approssimato per eccesso di n , approssimazione x2 migliore rispetto a y1 . X.0.2.2 Proseguendo in questo modo risulta definito un algoritmo numerico (un metodo iterativo) che, partendo da un numero arbitrario x 0 > n , genera una successione di numeri x1 , x 2 , x 3 ,... definita dalla seguente formula ricorsiva x i +1 = n 1 x i + 2 xi Tutti i valori della successione sono maggiori o uguali a n e ogni valore approssima n meglio del precedente: si tratta di una successione convergente perché decrescente e inferiormente limitata. Generalizzando i passi descritti in precedenza è possibile dimostrare per induzione che lim i →∞ X.0.2.3 xi = n La precedente formula ricorsiva definisce un algoritmo per il calcolo approssimato della radice quadrata che può essere facilmente implementato mediante una funzione Informatica per la Matematica Giorgio Meini © 2000 codificata in linguaggio VBA per l'ambiente Excel3 avente come parametri il numero n e il valore iniziale x 0 e che restituisce come risultato il valore di n : Public Function radice(n As Single, x0 As Single) As Single Dim x As Single x = x0 While ((x * x) <> n) x = 0.5 * (x + n / x) Wend radice = x End Function La caratteristica di ricorrenza della formula è realizzata nel programma che codifica l'algoritmo mediante un ciclo iterativo che calcola il nuovo valore x a partire dal precedente valore della stessa variabile x, partendo dal valore iniziale x 0 passato come parametro; il ciclo ha termine quando il valore approssimato della radice elevato al quadrato (in realtà moltiplicato per sé stesso) è uguale al valore di n. È possibile verificare il corretto funzionamento della funzione radice(…) utilizzandola in una formula di cella in un foglio Excel (a questo scopo è sufficiente memorizzarla in un modulo VBA): La convenzione di fissare il valore iniziale dell'algoritmo (secondo parametro della funzione) al valore di cui si richiede l'approssimazione della radice (primo parametro) nel caso che questo sia maggiore di 1, o di fissarlo a 1 altrimenti, consente di rispettare l'ipotesi di costruzione dell'algoritmo stesso ( x 0 > n ); questa soluzione può essere implementata nello stesso algoritmo realizzando una funzione VBA che ha come unico argomento il valore del quale restituisce la radice quadrata: Public Function radice(n As Single) As Single Dim x As Single If (n >= 1) Then x = n Else x = 1 While ((x * x) <> n) x = 0.5 * (x + n / x) Wend radice = x End Function 3 Il linguaggio di programmazione Visual Basic for Applications dispone della funzione standard Sqr(…) che restituisce il valore approssimato della radice quadrata dell'argomento: in questo contesto il linguaggio viene impiegato come strumento per formalizzare e implementare un algoritmo. Informatica per la Matematica X.0.2.4 Giorgio Meini © 2000 La condizione di terminazione del ciclo della funzione radice(…) è molto incerta; infatti, se gli errori di calcolo e gli errori di rappresentazione numerica impediscono la determinazione di un risultato esatto (almeno relativamente all'aritmetica finita impiegata), il ciclo si ripete indefinitamente senza migliorare la precisione dell'ultimo valore. È ciò che accade se si cerca di approssimare 2 con la formula radice(2;2): l'intero ambiente di esecuzione (Excel) si blocca perché il ciclo della funzione radice(…) non ha termine. Il seguente programma VBA - implementato come procedura attivabile in ambiente Excel mediante un "pulsante di comando" - realizza una condizione di terminazione del ciclo dell'algoritmo più sicura rispetto alla precedente, assicurando al tempo stesso un risultato affetto da un errore minore di E = 0,0000014 (il controllo dell'errore viene effettuato calcolando il valore assoluto5 della differenza dei valori approssimati per difetto e per eccesso e confrontandolo con il massimo errore accettabile rappresentato dalla constante E): Private Sub Radice_Click() Dim i As Integer Dim x, y As Single Dim n As Single Const E As Single = 0.000001 Const C As Integer = 100 n = Cells(1, 1) i = 1 If (n >= 1) Then x = n Else x = 1 y = n / x Cells(1, 2) = y While (Abs(x - y) >= E) And (i < C) x = (x + y) / 2 y = n / x i = i + 1 Cells(i, 1) = x Cells(i, 2) = y Wend End Sub Allo scopo di verificare il funzionamento del codice la procedura utilizza come valore di input il contenuto della cella A1 (Cells(1,1)) e scrive nelle celle delle colonne A e B (rispettivamente di indice 1 e 2: Cells(i,1) e Cells(i,2)) le successioni delle approssimazioni per eccesso e per difetto calcolate per ogni ciclo dell'iterazione (la variabile intera i ha la funzione di contatore del numero di cicli effettuati e la condizione di terminazione del ciclo comprende un controllo di tale contatore che impedisce di superare le 100 iterazioni anche in mancanza di "convergenza" dell'algoritmo): 4 Il valore massimo dell'errore accettabile può ovviamente essere definito diversamente, ma è importante non impostare un valore inferiore alla minima differenza tra due valori rappresentabili nel formato numerico utilizzato dall'hardware per le variabili di tipo Single del VBA. 5 La funzione VBA standard Abs(…) restituisce il valore assoluto dell'argomento. Informatica per la Matematica Giorgio Meini © 2000 Excel consente di rappresentare graficamente le successioni dei valori approssimati per eccesso (xi) e per difetto (yi) prodotte dall'algoritmo: 3 2 Xi Yi 1 0 1 2 3 4 5 i Grafici di convergenza come questo consentono di studiare il comportamento numerico con il quale l'algoritmo costruisce approssimazioni successivamente migliori della radice quadrata del numero n e rendono visibile il fatto che le successioni xi e yi costituiscono due classi di valori con y i < n < xi per ogni i e con la differenza xi − yi che diminuisce progressivamente ad ogni successiva iterazione: è di fatto questa proprietà che consente il controllo della precisione consistente in una valutazione certa del massimo errore assoluto da cui è affetto il risultato numerico fornito. X.0.2.5 L'uso ripetuto della procedura per il calcolo della radice quadrata con vari valori numerici dimostra empiricamente che l'algoritmo non risente - o almeno non catastroficamente come nel precedente esempio relativo all'approssimazione di π degli errori dovuti alla finitezza dell'aritmetica impiegata per i calcoli: si parla in questo caso di stabilità numerica dell'algoritmo e della sua implementazione. La stabilità numerica di un algoritmo dovrebbe essere rigorosamente dimostrata: ci limiteremo ad osservare che la formula ricorsiva che definisce questo algoritmo è priva di operazioni potenzialmente in grado di generare condizioni di underflow/ overflow, o fenomeni di cancellazione/amplificazione. Informatica per la Matematica X.0.2.6 Giorgio Meini © 2000 L'algoritmo implementato effettua un limitato numero di operazioni elementari per ogni ciclo: è senz'altro possibile ipotizzare che il tempo impiegato per effettuare queste operazioni è indipendente dai valori numerici ai quali sono applicate ed è quindi costante per uno specifico ambiente hardware/software di esecuzione. La complessità computazionale dell'algoritmo dipende quindi esclusivamente dal numero di cicli effettuati che dipende a sua volta, e in modo non banale, dal valore fornito come input; in questo caso, come in molti altri analoghi, è possibile, se non determinare esattamente il numero di cicli necessari per costruire un risultato avente una precisione stabilita a priori, almeno calcolare una maggiorazione certa del numero di cicli necessari per la terminazione dell'algoritmo in funzione dell'input fornito. Per semplicità limiteremo la nostra analisi al solo caso n > 1 per il quale abbiamo stabilito x0 = n. Prendendo in considerazione la sola successione xi dei valori approssimati per eccesso di n non è difficile dimostrare che l'errore presente al passo i + 1 ( xi +1 − n ) è minore della metà dell'errore presente al precedente passo i ( xi − n ): xi +1 − n < ( ) 1 xi − n ⇔ 2 n 1 1 1 xi + − n < xi − n⇔ xi 2 2 2 1 1 n 1 1 xi + ⋅ − n < xi − n⇔ 2 2 xi 2 2 n 1 n 1 ⋅ < n⇔ < n xi 2 xi 2 n < xi ⇔ n < xi n Tenendo conto che xi > n per ogni i l'affermazione da dimostrare è vera ed implica che l'errore diminuisce progressivamente più che dimezzandosi ad ogni successiva iterazione dell'algoritmo; dato che x0 = n il numero i di iterazioni necessarie per la terminazione dell'algoritmo è legato al massimo errore consentito E dalla relazione n− n < E dalla quale si ricava che i è il più piccolo intero che soddisfa la relazione i 2 i > lg 2 n− n E La velocità di convergenza dell'algoritmo è quindi legata al più piccolo intero i che soddisfa la precedente relazione; fissato E = 10-6 la seguente tabella riporta il massimo numero di iterazioni necessarie per la terminazione dell'algoritmo in funzione di alcuni valori di n6: 6 In realtà la velocità di convergenza dell'algoritmo preso in considerazione è - come è possibile verificare eseguendolo in ambiente Excel nella versione che traccia i risultati intermedi - notevolmente migliore (il numero di iterazioni necessarie alla terminazione è cioè molto inferiore): non è però facile dimostrare formalmente una maggiorazione inferiore dell'errore commesso ad ogni iterazione. Informatica per la Matematica Giorgio Meini © 2000 n 4 9 16 25 36 49 64 81 iterazioni 21 23 24 25 25 26 26 27 Informatica per la Matematica X.0.3 Giorgio Meini © 2000 Sintesi I metodi numerici sono impiegati - nella forma di algoritmi numerici - per produrre approssimazioni di valori non determinabili, o difficilmente determinabili, ricorrendo a un metodo algebrico; molti metodi numerici consistono in una successione numerica definita per ricorrenza il cui limite rappresenta il valore esatto di cui si intende fornire una approssimazione calcolando un termine per il quale l'errore (la "distanza" dal limite teorico della successione) sia inferiore alla precisione richiesta; la formula ricorsiva che definisce un metodo numerico viene solitamente implementata in forma algoritmica mediante un ciclo le cui successive iterazioni calcolano il valore da approssimare in funzione dell'approssimazione precedente (metodo iterativo, il valore iniziale è normalmente stabilito dall'utente del metodo); la condizione di terminazione del ciclo è basata sul controllo della precisione del risultato parziale ottenuto (errore assoluto e/o relativo), una ulteriore condizione di terminazione basata sul numero massimo di iterazioni può essere aggiunta per la gestione non catastrofica delle situazioni in cui il metodo non converge; l'errore complessivo di un algoritmo numerico è scomponibile in una componente dovuta al ricorso ad un metodo per sua natura approssimato (errore analitico) e in una componente dovuta agli errori di rappresentazione e di calcolo inevitabili in un contesto di aritmetica finita (errore algoritmico); err. analitico err. algoritmico err. complessivo iterazioni se l'implementazione di un algoritmo numerico è immune dalle conseguenze dell'accumulazione e dell'amplificazione degli errori di calcolo e non introduce fenomeni di cancellazione numerica o potenziali condizioni di underflow e overflow si parla di stabilità numerica dell'algoritmo; la complessità computazionale di un algoritmo numerico è direttamente legata al numero di cicli da effettuare: la ricerca di una maggiorazione significativa dell'errore commesso per ogni ciclo di iterazione consente di determinare il numero di cicli necessario ad approssimare, con la precisione richiesta, uno specifico valore (velocità di convergenza). Informatica per la Matematica X.0.4 Giorgio Meini © 2000 Esperimenti 1. Scrivere una funzione VBA che abbia come argomento il numero di iterazioni da effettuare e restituisca una approssimazione del valore π calcolata con il metodo di Tsu Chung-chi. Utilizzare l'ambiente Excel per determinare il numero di iterazioni che fornisce la migliore precisione. 2. # La seguente formulazione ricorsiva rappresenta i termini fi della successione di Fibonacci: f0 = 0 f1 = 1 f = f + f i i −1 i +1 utilizzare Excel per studiare numericamente i rapporti f i +1 e f i tra due termini fi f i +1 successivi della successione al crescere dell'indice i. Ripetere lo studio con Derive utilizzando la rappresentazione razionale. In base ai risultati ottenuti determinare empiricamente le relazioni esistenti tra lim f i +1 e lim f i ? i →∞ f i i →∞ f i +1 3. Implementare in ambiente Excel - utilizzando esclusivamente formule di cella l'algoritmo per il calcolo numerico approssimato della radice quadrata. 4. Utilizzare in ambiente Excel la procedura VBA per il calcolo approssimato della radice quadrata proposta nel testo per studiare (eventualmente costruendo alcuni grafici di convergenza) il comportamento dell'algoritmo al variare del valore iniziale x0. 5. Da un'analisi dei grafici di (non) convergenza prodotti giustificare il comportamento dell'algoritmo per il calcolo della radice quadrata per valori negativi dell'argomento. Informatica per la Matematica Giorgio Meini © 2000 X.1 Risoluzione approssimata di equazioni X.1.0 Equazioni impossibili? Molte equazioni presentano soluzioni che non sono determinabili con metodi algebrici. Per esempio utilizzando il comando Risolvi-Algebricamente in ambiente Derive per risolvere l'equazione trigonometrica cos x = x il sistema non fornisce la soluzione corrispondente allo zero della funzione f ( x) = x − cos x la cui esistenza è confermata dall'analisi del grafico prodotto con Derive stesso. Risolvendo la stessa equazione con il comando Risolvi-Numericamente si ottiene la seguente approssimazione della soluzione che è in accordo con il grafico tracciato e la cui precisione può essere migliorata agendo sul numero di cifre significative utilizzate da Derive: Come è stato possibile per l'ambiente software determinare la soluzione, anche se in forma approssimata, in assenza di una procedura algebrica di risoluzione? Il comando Risolvi-Numericamente di Derive impiega un algoritmo numerico per approssimare la soluzione di una equazione. Informatica per la Matematica Giorgio Meini © 2000 X.1.1 Individuazione e separazione delle radici di una funzione X.1.1.0 Il comando Risolvi-Numericamente di Derive richiede di specificare gli estremi di un intervallo che comprenda al suo interno la soluzione dell'equazione che si intende approssimare (e, possibilmente, solo essa). Tutti i metodi numerici per la risoluzione approssimata di equazioni che prenderemo in esame necessitano di questa informazione iniziale. In alcuni semplici casi è possibile individuare un intervallo contenente la sola soluzione da approssimare "scomponendo" l'equazione in un sistema equivalente facilmente risolvibile con il metodo grafico; l'esempio del paragrafo precedente è equivalente al sistema y = cos x y=x le cui equazioni sono di immediata rappresentazione grafica: Dato che la soluzione dell'equazione iniziale coincide con l'ascissa del punto di intersezione tra le curve che rappresentano graficamente le equazioni del sistema equivalente, è facile determinare come intervallo iniziale per l'applicazione di un metodo numerico di risoluzione l'intervallo 1 ;1 che comprende sicuramente una (e 2 una sola) soluzione. X.1.1.1 In generale le soluzioni dell'equazione f ( x) = 0 corrispondono agli zeri della funzione f(x) il cui grafico può essere facilmente tracciato in ambiente Derive al fine di individuare i singoli intervalli contenenti una e una sola Informatica per la Matematica Giorgio Meini © 2000 radice dell'equazione. Questa fase preliminare - nota come "separazione delle radici" è necessaria per l'impiego di un qualsiasi metodo numerico di risoluzione di un'equazione; inoltre nella Finestra Grafici-2D dell'ambiente Derive è possibile posizionare il cursore a "croce" sul punto in cui il grafico della funzione f(x) interseca l'asse cartesiano orizzontale per leggere l'ascissa approssimata dello zero corrispondente. Esempio Per risolvere l'equazione7 x3 + x + 1 = 0 si traccia con Derive il grafico della funzione f ( x) = x 3 + x + 1 che consente di individuare l'intervallo di separazione [-1;0] comprendente l'unica8 radice dell'equazione. La coordinata orizzontale del cursore a "croce" posizionato sullo zero del grafico di f(x) è -0,68367; un ingrandimento (zoom) del grafico seguito dal riposizionamento della croce-cursore consente di leggere come approssimazione della coordinata dello zero il valore -0,68265 7 In realtà esiste una formula algebrica risolutiva per le equazioni polinomiali di III grado, ma - data la sua complessità - è preferibile l'applicazione di un metodo numerico per la determinazione di una soluzione approssimata. 8 Una equazione polinomiale di III grado può avere fino a 3 radici reali, ma l'analisi del segno delle 2 funzione derivata prima f ' ( x ) = 3 x + 1 conferma la crescenza della funzione per ogni valore reale assunto dalla variabile x e, come conseguenza della continuità di f(x) stessa, l'impossibilità dell'esistenza di altre radici. Informatica per la Matematica Giorgio Meini © 2000 L'applicazione del comando Risolvi-Numericamente di Derive indicando come estremi inferiore e superiore rispettivamente -1 e 0 e impostando il numero di cifre significative da impiegare nel calcolo a 12 fornisce il seguente risultato: La corretta determinazione degli intervalli di separazione delle radici consente inoltre di applicare un metodo numerico per approssimare le diverse soluzioni della stessa equazione. Esempio Per determinare le radici dell'equazione esponenziale 2x + 2 = 2 x sia l'analisi del grafico della funzione f ( x) = 2 x + 2 − 2 x che l'analisi della rappresentazione grafica del sistema equivalente y = 2x + 2 x y=2 Informatica per la Matematica Giorgio Meini © 2000 permettono di individuare gli intervalli [-2;0] e [2;4] come intervalli di separazione delle due radici dell'equazione. In ambiente Derive l'applicazione del comando RisolviNumericamente ai due diversi intervalli produce come risultato i valori approssimati delle due soluzioni ricercate (in realtà, come è possibile verificare, il secondo valore rappresenta esattamente la radice dell'equazione): Quali metodi consentono di ottenere risultati come quelli prodotti dal comando Risolvi-Numericamente di Derive? I prossimi paragrafi costituiscono una rassegna dei principali algoritmi numerici utilizzati per la risoluzione approssimata delle equazioni. X.1.2 Il metodo di bisezione X.1.2.0 Un importante teorema relativo alle funzioni reali di variabile reale (teorema degli zeri) afferma: se una funzione f è continua in un intervallo [a;b] e il segno di f(a) è discorde rispetto al segno di f(b) allora esiste almeno uno zero z della funzione compreso nell'intervallo [a;b]. X.1.2.1 Un metodo elementare per approssimare la radice c dell'equazione f(x) = 0 consiste nel definire un algoritmo numerico che suddivide l'intervallo [a;b] a metà determinando a+b in base al segno assunto dalla funzione nel punto medio c = - in quale dei due 2 Informatica per la Matematica Giorgio Meini © 2000 sottointervalli è compresa la radice z; l'algoritmo procede ricorsivamente suddividendo a metà il nuovo intervallo così individuato per arrestarsi quando l'ampiezza dell'intervallo preso in considerazione, che si riduce progressivamente, è minore del massimo errore tollerabile per l'approssimazione. Esempio L'equazione studiata nel paragrafo precedente x3 + x + 1 = 0 3 ha una sola soluzione compresa nell'intervallo [-1;0]. La funzione f ( x) = x + x + 1 ha segno negativo nel punto a = -1 (f(-1) = -1) e positivo nel punto b = 0 (f(0) = +1). Il punto medio dell'intervallo [-1;0] è c = -0,5 e f(-0,5) = +0,375: le ipotesi del teorema degli zeri (discordanza del segno della funzione agli estremi dell'intervallo) sono applicabili al sottointervallo [-1;-0,5] la cui ampiezza è la metà dell'intervallo originale. Il punto medio dell'intervallo [-1;-0,5] è -0,75 e f(-0,75) = -0,171875: il nuovo intervallo per il quale sono verificate le ipotesi del teorema degli zeri è [-0,75;-0,5]. Il punto medio dell'intervallo [-0,75;-0,5] è -0,625: dato che f(-0,625) = +0,130859375 il successivo intervallo è [-0,75;-0,625]. Il punto medio dell'intervallo è -0,6875 e f(-0,6875) = -0,012451171875: il nuovo intervallo è [-0,6875;-0,625]. Questo intervallo - che comprende la radice dell'equazione da approssimare - ha ampiezza minore di 10-1: uno qualsiasi dei due estremi rappresenta quindi una approssimazione della soluzione che presenta un errore assoluto certamente minore di 0,1. La funzione bisezione(…) applica l'algoritmo numerico descritto a una funzione f(x) codificata nello stesso modulo VBA a partire da un intervallo iniziale [a;b] i cui estremi sono passati come argomenti; nell'implementazione dell'algoritmo è stato aggiunto un controllo per verificare l'eventualità che il punto medio calcolato in una delle iterazioni del ciclo sia esattamente lo zero della funzione: Private Const E As Single = 0.000001 'errore massimo tollerabile Private Function f(x As Single) As Single f = ... End Function Informatica per la Matematica Giorgio Meini © 2000 Public Function bisezione(a As Single, b As Single) As Single Dim c As Single While (Abs(b - a) > E) c = (a + b) / 2 If f(c) = 0 Then bisezione = c Exit Function End If If (f(a) * f(c) < 0) Then b = c Else a = c End If Wend bisezione = a End Function L'errore massimo tollerabile E è stato fissato ad un valore costante predefinito compatibile con la risoluzione dei valori Single del linguaggio VBA, ma è ovviamente possibile passarlo alla funzione bisezione(…) come ulteriore argomento. Esempio Per impiegare la funzione che implementa l'algoritmo di bisezione nella 3 determinazione approssimata dello zero della funzione f ( x) = x + x + 1 è sufficiente codificare l'espressione VBA che ne calcola il valore Private Function f(x As Single) As Single f = x^3 + x + 1 End Function e utilizzare la funzione bisezione(…) in una cella Excel fornendo come argomenti gli estremi dell'intervallo di separazione della soluzione Osservazione In ambiente Derive è possibile definire una funzione ricorsiva bisezione(…) che approssima lo zero di una funzione f(x): Informatica per la Matematica Giorgio Meini © 2000 L'applicazione ricorsiva della funzione bisezione(…) si arresta se è verificata la condizione a − b < e con e massimo errore tollerabile nell'approssimazione dello zero di f(x); in caso contrario l'applicazione della funzione avviene con parametri diversi (sono gli estremi del sottointervallo preso di volta in volta in considerazione) in funzione del segno di f (a) ⋅ f (c) , con c = a + b . 2 L'approssimazione dell'invocazione della funzione bisezione(…) con gli estremi dell'intervallo di separazione dello zero come parametri produce il risultato atteso: Osservazione La condizione di terminazione indicata è l'unica che garantisce il controllo della precisione del risultato fornito. Una condizione alternativa prevede di terminare il ciclo quando f (c ) < E dove E è il massimo errore tollerabile, ma - come illustra il grafico che segue - un valore "piccolo" dell'ordinata della funzione non implica che l'ascissa corrispondente sia prossima a uno zero. In ogni caso il valore della costante E non può essere arbitrariamente piccolo perché gli errori di calcolo e di rappresentazione numerica potrebbero invalidare qualsiasi condizione di terminazione relativa a E. X.1.2.2 La complessità computazionale dell'algoritmo di bisezione dipende dal calcolo della funzione f(x) che viene valutata in relazione ad un nuovo valore per ogni iterazione del ciclo. Non è però difficile stabilire l'esatto numero di iterazioni che garantiscono l'approssimazione dello zero ricercato con un errore minore del valore E a partire da un determinato intervallo di separazione [a;b] tenendo conto che ad ogni iterazione l'ampiezza dell'intervallo preso in considerazione si dimezza rispetto all'intervallo precedente. Dopo i iterazioni si avrà che l'ampiezza dell'intervallo considerato è Informatica per la Matematica Giorgio Meini © 2000 b−a 2i e, dato che la terminazione del ciclo avverrà alla i-esima iterazione solo se b−a 2i <E⇔ b−a b − a < 2 i ⇔ log 2 <i E E il numero di iterazioni necessarie per la terminazione dell'algoritmo è il più piccolo intero i che soddisfa la disuguaglianza b − a i > log 2 E X.1.3 Iterazione funzionale X.1.3.0 Se si scrive l'equazione di cui si intendono determinare le radici nella forma g ( x) = x allora le eventuali soluzioni sono note come punti fissi della funzione g(x) e - in alcuni casi - possono essere approssimate con metodi iterativi basati sulla formula ricorsiva xi +1 = g ( xi ) dove x0 rappresenta un'approssimazione iniziale. Esempio Per applicare il metodo di iterazione funzionale all'equazione cos x = x è possibile impostare le seguenti formule in Excel (il valore 0 nella cella A1 è l'approssimazione iniziale x0) e utilizzare le funzionalità dell'ambiente per "copiarle" nelle righe sottostanti Informatica per la Matematica Giorgio Meini © 2000 ottenendo come risultato lo svolgimento dei calcoli impostati La successione di valori si avvicina progressivamente (alternando approssimazioni per eccesso e per difetto) al valore della radice determinato nel paragrafo introduttivo con Derive (0,739085); quando la differenza tra due valori successivi diviene più piccola dell'errore commesso dall'ambiente Excel nel calcolare il valore della funzione il risultato si comporta come "punto fisso" della funzione e può essere considerato un'approssimazione della radice dell'equazione. Il procedimento di iterazione funzionale può essere interpretato geometricamente nel diagramma cartesiano dove sono rappresentate graficamente la funzione y=g(x) e la retta y=x: Informatica per la Matematica Giorgio Meini © 2000 Le linee verticali rappresentano la valutazione della funzione g(x) in corrispondenza dei singoli valori xi della successione, mentre le linee orizzontali consentono di determinare - mediante la retta y=x - il valore successivo xi+1 della successione; le proiezioni dei vertici della spezzata formata dalle linee di costruzione sull'asse delle ascisse rappresentano i valori della successione prodotti dal metodo. L'istruzione ITERATES(f(x)x,x0,n) costruisce un vettore di n valori risultanti dell'applicazione iterata della funzione f(x) a partire dal valore iniziale x0 per 0, 1, 2, … n volte; l'istruzione ITERATE fornisce esclusivamente l'ultimo valore dell'iterazione. Il metodo di iterazione funzionale può essere facilmente implementato in ambiente Derive ricorrendo all'istruzione ITERATES la cui semplificazione simbolica illustra perfettamente l'idea che informa il metodo; per esempio nel caso che g(x) sia cos(x) si ha: Ricorrendo al comando di approssimazione numerica si ottiene la successione i cui valori eventualmente convergono al punto fisso della funzione iterata: L'istruzione ITERATE restituisce l'ultimo termine della successione costruita iterando l'applicazione della funzione a partire dal valore iniziale: Il teorema seguente assicura, nell'ipotesi di continuità della funzione g(x), che i valori forniti dall'algoritmo, quando convergenti, sono effettivamente approssimazioni della radice dell'equazione g(x) = x. Informatica per la Matematica Giorgio Meini © 2000 Teorema Se g ( x) è continua nell'intervallo [a; b] e la successione dei valori definita dalla formula ricorsiva xi +1 = g ( xi ) è convergente e tale che xi ∈ [a; b] per ogni indice i allora x = lim xi è un punto fisso della funzione g ( x) . i →∞ La dimostrazione è una diretta conseguenza di una delle proprietà dei limiti di funzioni continue: x = lim xi +1 = lim g ( xi ) = g lim xi = g x i →∞ i →∞ i →∞ () Esempio Per determinare le due soluzioni (0 e 1) dell'equazione x 2 = x mediante l'algoritmo di iterazione funzionale è necessario modificare la formula della cella B1 dell'esempio precedente e "copiarla" nelle celle sottostanti della colonna B per ottenere come risultato la successione delle approssimazioni. Contrariamente all'esempio precedente, dove per qualsiasi valore iniziale la successione convergeva al valore della radice dell'equazione, in questo caso nessuna scelta del valore iniziale contenuto nella cella A1 consente di approssimare il valore 1 e solo alcuni valori danno luogo a una successione convergente a 0. Il grafico che segue mostra chiaramente che per qualsiasi valore iniziale positivo minore di 1 la successione generata dall'algoritmo converge al valore 0, mentre per qualsiasi valore iniziale maggiore di 1 essa diverge. Informatica per la Matematica X.1.3.1 Giorgio Meini © 2000 Dimostriamo ora un importante teorema che esprime una condizione sufficiente, anche se non strettamente necessaria, per la convergenza dell'algoritmo di iterazione funzionale. Teorema (di convergenza del metodo di iterazione funzionale) Se x è un punto fisso della funzione g ( x) g ( x) ha derivata continua g ' ( x) nell'intervallo [ x − r ; x + r ] g ' ( x) < 1 nell'intervallo [ x − r ; x + r ] x0 è un punto dell'intervallo [ x − r ; x + r ] xi +1 = g ( xi ) è la formula ricorsiva che definisce l'algoritmo iterativo allora l'algoritmo converge al punto fisso della funzione g ( x) : lim xi = x . i →∞ Si dimostra per induzione la validità della seguente relazione per ogni indice i xi − x ≤ M i r Informatica per la Matematica Giorgio Meini © 2000 dove M > 0 è il valore massimo assunto dal modulo della funzione derivata g ' ( x) nell'intervallo [ x − r ; x + r ] . Essendo M < 1 ciò implica che lim xi − x = 0 e quindi i →∞ la tesi. Per i = 0 la relazione è vera in quanto per ipotesi x0 appartiene all'intorno di raggio r del punto fisso x , cioè all'intervallo [ x − r ; x + r ] . Per i > 0 l'ipotesi induttiva è xi −1 − x ≤ M i −1r e, per il teorema del valor medio di Lagrange, si ha xi − x = g ( xi −1 ) − g ( x) = g ' (ε )( xi −1 − x) con ε appartenente all'intervallo di estremi xi −1 e x e quindi all'intervallo [ x − r ; x + r ] ; perciò g ' (ε ) ≤ M < 1 e di conseguenza xi − x ≤ g ' (ε ) xi −1 − x ≤ M i r . Osservazione Le ipotesi del teorema precedente sono di difficile verifica in un intorno circolare di raggio r del punto fisso x dato che esso non è noto! Per applicare l'algoritmo ad una funzione g(x) è sufficiente assicurare che la funzione derivata g'(x) assuma valori in modulo minori di 1 in un intervallo [a;b] contenente un solo punto fisso x e scegliere come valore iniziale l'estremo più prossimo al punto fisso stesso: in questo modo le ipotesi del teorema sono verificate nel massimo intorno circolare avente x come centro e interamente contenuto nell'intervallo. Per ovviare all'impossibilità di effettuare la scelta non conoscendo il valore di x il valore iniziale può essere associato casualmente a uno dei due estremi dell'intervallo [a;b]: se si verifica che un valore della successione è esterno all'intervallo si ripete l'esecuzione dell'algoritmo scegliendo come valore iniziale l'altro estremo. Il teorema precedente individua una casistica di convergenza del metodo: a) g'(x) > 1 il metodo non converge producendo una successione monotona; Informatica per la Matematica Giorgio Meini © 2000 b) 0 < g'(x) < 1 il metodo converge producendo una successione monotona; c) -1 < g'(x) < 0 il metodo converge producendo una successione non monotona; d) g'(x) < -1 il metodo non converge producendo una successione non monotona. Esempio Per risolvere numericamente l'equazione x3 + 4x − 2 = 0 che presenta una sola radice nell'intervallo [0;1] con il metodo di iterazione funzionale è possibile riscriverla come 2 − x3 x= , 4 oppure come x= 2 − 4x x2 . Nel primo caso 2 − x3 g ( x) = 4 Informatica per la Matematica Giorgio Meini © 2000 Derive consente di rappresentare graficamente la funzione derivata g'(x) e di affermare che sono verificate le ipotesi del teorema di convergenza nell'intervallo [0;1] Applicando in ambiente Derive il metodo con valore iniziale 0 si ottiene una corretta approssimazione della radice ricercata: Nel secondo caso g ( x) = 2 − 4x x2 rappresentando graficamente con Derive la funzione derivata g'(x) si nota che non sono verificate le ipotesi del teorema di convergenza nell'intervallo [0;1] Informatica per la Matematica Giorgio Meini © 2000 Applicando il metodo con valore iniziale 1 la successione dei valori prodotti non converge: X.1.3.3 Nella dimostrazione del teorema di convergenza del metodo di iterazione funzionale si è dimostrata la validità per ogni indice i della relazione xi − x ≤ M xi −1 − x con M valore massimo assunto dal modulo della funzione derivata g'(x) nell'intervallo di lavoro. Nella relazione precedente M compare come valore minimo del rapporto di riduzione dell'errore assoluto in una singola iterazione del metodo: la velocità di convergenza dell'algoritmo dipende quindi dai valori assunti dalla derivata della funzione in prossimità del punto fisso ricercato. Una classica condizione di terminazione per il ciclo dell'algoritmo di iterazione funzionale è la seguente xi − xi −1 < E con E>0 costante compatibile con la precisione dell'ambiente di calcolo. Che relazione esiste tra questa condizione di terminazione e il controllo della precisione della soluzione approssimata costruita dall'algoritmo? Informatica per la Matematica Giorgio Meini © 2000 Nella dimostrazione del teorema di convergenza del metodo di iterazione funzionale si è ottenuto, applicando il teorema del valor medio di Lagrange, il seguente risultato xi − x = g ( xi −1 ) − g ( x) = g ' (ε )( xi −1 − x) valido per ogni valore di i e con ε appartenente all'intervallo di estremi xi −1 e x . Ora, dato che ( xi − xi −1 ) = ( xi − x) − ( xi −1 − x) = g ' (ε )( xi −1 − x) − ( xi −1 − x) = [g ' (ε ) − 1]( xi −1 − x) si ha xi −1 − x = xi − xi −1 E < g ' (ε ) − 1 g ' (ε ) − 1 da cui si deduce che l'errore assoluto associato alla condizione di arresto è maggiorato dalla tolleranza E solo se il valore assunto dalla derivata della funzione g(x) in prossimità del punto fisso è minore di 0, cioè se la funzione g(x) è decrescente (in questo caso il metodo fornisce una successione non monotona i cui valori sono alternativamente approssimazioni per eccesso e per difetto del punto fisso). In caso contrario l'errore può essere tanto più grande quanto più prossimo a 1 (valore massimo compatibile con la convergenza del metodo) è il valore assunto dalla derivata della funzione g(x) nell'intorno del punto fisso. Osservazione Il metodo dell'iterazione funzionale, quando convergente, è estremamente stabile sotto l'aspetto numerico: infatti l'eventuale errore commesso nel calcolo della funzione g(xi) in una delle iterazioni perturba il successivo valore xi+1 che - a condizione che non sia esterno rispetto all'intervallo in cui valgono le ipotesi del teorema di convergenza può essere considerato a tutti gli effetti un nuovo valore iniziale e, in questo senso, il metodo può essere considerato "autocorrettivo". Ovviamente, volendo impiegare la condizione di terminazione descritta, occorre valutare che la minima differenza tra due valori successivi generati dall'algoritmo è vincolata alla precisione con cui l'ambiente di calcolo è in grado di valutare i valori assunti dalla funzione g(x). X.1.4 I metodi iterativi delle tangenti e delle secanti X.1.4.0 Per determinare numericamente l'unica radice compresa nell'intervallo [a; b] dell'equazione f ( x) = 0 con il metodo di iterazione funzionale è necessario trasformarla in una equazione equivalente della forma x = g ( x) Informatica per la Matematica Giorgio Meini © 2000 Un metodo generale valido nell'ipotesi che f(x) sia continua e derivabile con derivata continua nell'intervallo [a;b] consiste nel determinare xi +1 a partire da xi ∈ [a; b] come intersezione con l'asse delle ascisse della retta passante per il punto ( xi ; f ( xi )) e avente coefficiente angolare m( xi ) dipendente dal valore di xi ; l'equazione della retta è y − f ( x i ) = m( x i )( x − x i ) da cui, ponendo y = 0 , si ricava la formula ricorsiva x x +1 = xi − f ( xi ) m( x i ) che definisce il metodo iterativo. f(xi) y=f(x) y=m(xi)x+… z xi+1 xi Tra i metodi definiti da una opportuna scelta della funzione m( x) - con m( x) ≠ 0 nell'intervallo [a; b] - si trovano i due più noti algoritmi numerici per l'approssimazione delle radici dell'equazione f ( x) = 0 : metodo delle "tangenti" delle "secanti" X.1.4.1 m(x) f'(x) f ( x ) − f (c ) x−c Il metodo delle tangenti (noto anche come metodo di Newton) xi +1 = xi − f ( xi ) f ' ( xi ) Informatica per la Matematica Giorgio Meini © 2000 ha una semplice interpretazione geometrica: il valore xi+1 è l'ascissa del punto di intersezione con l'asse orizzontale della retta tangente alla funzione f(x) nel punto (xi;f(xi)). x0 x1 x2 x3 z Esempio La funzione f ( x) = 2 x + 2 − 2 x presenta - come è possibile verificare tracciandone il grafico in ambiente Derive - due zeri separati dagli intervalli [-1;0] e [2;4]. In Derive, ricorrendo al comando di derivazione simbolica, non è difficile impostare la funzione N(x) che implementa il metodo di Newton per la funzione f(x): L'istruzione ITERATES consente, mediante il comando APPROSSIMA, di calcolare i primi valori della successione generata dal metodo in corrispondenza degli estremi dei due intervalli di separazione degli zeri ricercati (si noti, in tutti i casi, la rapidità con cui il metodo converge): Informatica per la Matematica Giorgio Meini © 2000 I valori approssimati degli zeri sono rispettivamente 3 (è in particolare possibile verificare l'esattezza di questa soluzione per sostituzione diretta nell'equazione 2 x + 2 − 2 x = 0 ) e circa -0,69. Interpretando il metodo delle tangenti come caso particolare del metodo di iterazione funzionale si ha g ( x) = x − f ( x) x ⋅ f ' ( x) − f ( x) = f ' ( x) f ' ( x) e g ' ( x) = [ f ' ( x) + x ⋅ f ' ' ( x) − f ' ( x)] ⋅ f ' ( x) − [ x ⋅ f ' ( x) − f ( x)] ⋅ f ' ' ( x) [ f ' ( x)] 2 = f ( x) ⋅ f ' ' ( x) [ f ' ( x)] 2 da cui si desume la difficoltà di verificare le ipotesi del teorema di convergenza del paragrafo X.1.3.1 nell'intervallo [a;b] di separazione di una soluzione dell'equazione f(x)=0. In accordo con l'interpretazione geometrica del metodo è evidente che la convergenza al valore dello zero z è garantita se la successione generata a partire dal valore iniziale x0 è sempre crescente o decrescente (come dimostrano anche alcuni dei casi del precedente esempio questa è una condizione sufficiente, ma non necessaria): intuitivamente ciò avviene se la funzione è continua e il suo grafico ha segno e concavità costanti nell'intervallo [x0;z] (o [z;x0]); dato che la derivata della funzione non può assumere il valore 0 nello stesso intervallo in quanto compare al denominatore nella formula ricorsiva che definisce il metodo anche il segno della funzione derivata (e di conseguenza la crescenza o decrescenza della funzione) deve essere costante nello stesso intervallo. Il seguente teorema assicura la validità delle precedenti osservazioni nel caso che sia opportuno scegliere x0>z e che conseguentemente la successione dei valori generati dal metodo sia decrescente (la dimostrazione è ovviamente analoga nel caso opposto e il risultato ha quindi validità generale). Informatica per la Matematica Giorgio Meini © 2000 Teorema Se z è uno zero della funzione f(x) f(x) ha funzioni derivata prima e seconda continue in un intervallo [z;z+h] e per ogni valore x dell'intervallo [z;z+h] si ha che: f(x) f"(x)>0 f'(x)≠0 allora la successione di valori generata dal metodo di Newton xi +1 = g ( xi ) = xi − f ( xi ) f ' ( xi ) con z < x 0 ≤ z + h è decrescente e convergente a z. Si dimostra per induzione che z < xi +1 < xi osservando che, nelle ipotesi del teorema, se la funzione f(x) è positiva nell'intervallo [z;z+h] allora è necessariamente crescente nello stesso intervallo, viceversa se f(x) è negativa in [z;z+h] allora è necessariamente decrescente nell'intervallo. Di conseguenza il rapporto f ( x) è certamente positivo per ogni valore di x compreso tra z e z+h f ' ( x) e quindi f ( xi ) xi +1 = xi − < xi f ' ( xi ) Per il teorema del valor medio di Lagrange, si ha xi +1 − z = g ( xi ) − g ( z ) = g ' (ε )( xi − z ) dove f (ε ) ⋅ f " (ε ) z < ε < xi e g ' (ε ) = [ f ' (ε )] 2 Dato che per ipotesi induttiva z < ε < xi < z + h si ha che f (ε ) ⋅ f " (ε ) > 0 e quindi che g ' (ε ) > 0 ; essendo sicuramente xi − z > 0 segue che xi +1 − z > 0 da cui la tesi z < xi +1 < xi Informatica per la Matematica Giorgio Meini © 2000 Per rispettare le ipotesi del teorema precedente - che assicurano la convergenza dell'algoritmo di Newton per l'approssimazione dello zero di una funzione continua f(x) a partire da un intervallo di separazione [a;b] in cui la derivata f'(x) non si annulla e la concavità è costante - è sufficiente scegliere come valore iniziale del metodo l'estremo dell'intervallo in cui il segno della funzione f(x) e della derivata seconda f"(x) sono concordi: a) funzione decrescente con concavità rivolta verso l'alto; a=x0 x1 z b b) funzione crescente con concavità rivolta verso il basso; a=x0 x1 z b c) funzione decrescente con concavità rivolta verso il basso; x1 b=x0 a z Informatica per la Matematica Giorgio Meini © 2000 d) funzione crescente con concavità rivolta verso l'alto. z a x1 b=x0 L'implementazione in linguaggio VBA dell'algoritmo di Newton richiede la definizione, oltre che della funzione f(…), della sua funzione derivata fd(…)9; la funzione "pubblica" tangenti(…) restituisce, se invocata in ambiente Excel con il valore iniziale x0 come argomento, l'approssimazione dello zero della funzione ed invoca a sua volta la funzione newton(…) che implementa la formula del metodo. Il ciclo che realizza l'iterazione termina quando la differenza tra due approssimazioni successive è inferiore ad una costante predefinita E anche se questa condizione di terminazione non assicura, in generale, che l'approssimazione calcolata differisca dal valore dello zero di un errore minore di E; inoltre per evitare, nel caso di non convergenza dell'algoritmo, che l'iterazione non abbia termine il ciclo viene ripetuto al massimo 100 volte. Private Const E As Single = 0.000001 Private Function f(x As Single) As Single f = … End Function Private Function fd(x As Single) As Single fd = … End Function Private Function newton(x As Single) As Single newton = x - f(x) / fd(x) End Function 9 La funzione fd(…) invece di definire esplicitamente la funzione derivata calcolata simbolicamente può implementare una formula di derivazione numerica; per esempio è possibile approssimare la derivata in un punto della funzione f(…) con il rapporto incrementale calcolato in corrispondenza di un valore predefinito dell'incremento h: Private Function fd(x As Single) As Single Const h As Single = 0.000001 fd = (f(x+h) - f(x)) / h End Function Informatica per la Matematica Giorgio Meini © 2000 Public Function tangenti(x0 As Single) As Single Dim x As Single Dim i As Integer x = newton(x0) i = 0 While (Abs(newton(x) - x) > E) x = newton(x) i = i + 1 If (i > 100) Then Exit Function End If Wend tangenti = newton(x) End Function Esempio Il grafico della funzione f ( x) = x 3 − x + 1 tracciato in ambiente Derive permette di individuare l'intervallo [-2;-1] come intervallo di separazione dell'unico zero della funzione10. In VBA è necessario definire sia la funzione Private Function f(x As Single) As Single f = x ^ 3 - x + 1 End Function che la relativa derivata Private Function fd(x As Single) As Single fd = 3 * x ^ 2 - 1 End Function 10 L'unicità dello zero è conseguenza della continuità della funzione e della sua crescenza sia per x<-1 che per x>1 confermata dall'analisi del segno della funzione derivata prima. Informatica per la Matematica Giorgio Meini © 2000 Successivamente in ambiente Excel è possibile invocare la funzione tangenti(…) con argomento il valore iniziale -2 (è infatti questo l'estremo dell'intervallo [-2;-1] in cui la funzione f(x) ha segno concorde con la sua derivata seconda f"(x)) per ottenere un'accurata approssimazione del valore dello zero: Osservazione Il file "SOLVE.MHT" dell'ambiente Derive include una funzione ricorsiva NEWTON(…) che approssima lo zero di una funzione f(x) con il metodo delle tangenti: L'approssimazione dell'invocazione della funzione NEWTON(…) produce la successione delle approssimazioni attesa: Osservazione L'algoritmo di Newton può - diversamente, per esempio, dal metodo di bisezione - essere impiegato per approssimare lo zero di una funzione che si presenta senza cambiamento di segno: le ipotesi del teorema di convergenza possono in questo caso essere soddisfatte da entrambi gli estremi dell'intervallo di separazione dello zero. Per esempio la funzione f ( x) = x 2 − 2 x + 1 ha un unico zero x=1 Informatica per la Matematica Giorgio Meini © 2000 a cui il metodo converge sia con x0=0 che con x0=2: Private Function f(x As Single) As Single f = x ^ 2 - 2 * x + 1 End Function Private Function fd(x As Single) As Single fd = 2 * x - 2 End Function X.1.4.2 Il metodo delle secanti xi +1 = xi − f ( xi )( xi − c) f ( x i ) − f (c ) (dove c è uno degli estremi dell'intervallo [a;b] di separazione dello zero) ha una semplice interpretazione geometrica: il valore xi+1 è l'ascissa del punto di intersezione con l'asse orizzontale della retta passante per i punti (c;f(c)) e (xi;f(xi)). f(c) z c x3 x2 x1 x0 Informatica per la Matematica Giorgio Meini © 2000 Risulta vera la congettura intuitiva in base alla quale il metodo converge generando una successione crescente o decrescente - se sono verificate le seguenti ipotesi: la funzione f(x) è continua e le funzioni derivate f'(x) e f"(x) sono continue con segno costante nell'intervallo [a;b] di separazione dello zero; f ( c ) ⋅ f " (c ) > 0 ; f ( x0 ) ⋅ f " ( x0 ) < 0 . In Excel è possibile implementare il metodo delle secanti codificando in linguaggio VBA la funzione f(x), memorizzando nella cella A1 il valore costante c e nella cella A2 il valore iniziale x0 e utilizzando le celle successive della colonna A per generare la successione dei valori calcolati mediante "copia" della formula che definisce il metodo stesso. Esempio La funzione f ( x) = x 3 − x + 1 presenta un unico zero separato dall'intervallo [-2;-1] e può essere implementata in ambiente Excel mediante la seguente funzione VBA: Public Function F(x As Single) As Single f = x ^ 3 - x + 1 End Function La scelta c=-2 e x0=-1 è conseguenza dalla concordanza tra segno della funzione f(x) e della relativa derivata seconda f"(x) nel punto x=-2; la formula che definisce il metodo è inserita nella cella A3 e "copiata" nelle celle sottostanti: Informatica per la Matematica Giorgio Meini © 2000 I primi valori generati dall'applicazione del metodo delle secanti sono rappresentati nel grafico seguente che mostra il carattere di convergenza della successione: -1 -1,1 -1,2 -1,3 -1,4 0 1 2 3 4 5 6 7 8 9 10 Ma la rappresentazione grafica dei valori generati successivamente evidenzia come l'errore algoritmico - dovuto agli inevitabili errori di calcolo e di rappresentazione numerica dell'ambiente Excel - impedisca all'errore analitico di ridursi indefinitamente all'aumentare del numero di iterazioni calcolate: Informatica per la Matematica Giorgio Meini © 2000 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 -1,3247179 -1,32471791 -1,32471792 -1,32471793 -1,32471794 -1,32471795 -1,32471796 -1,32471797 -1,32471798 -1,32471799 -1,324718 Osservazione Nel caso che le ipotesi individuate non siano verificate nell'intervallo [a;b] di separazione dello zero è possibile che la successione di valori generata dal metodo delle secanti non sia convergente perché xi+1 non è compreso tra c e xi. In questo caso è possibile modificare il metodo al fine di ottenere una successione di approssimazioni convergente al valore dello zero variando il valore c nel corso delle iterazioni: xi +1 = xi − f ( xi ) ⋅ ( xi − ci ) f ( x i ) − f (c i ) dove x0 e c0 sono tali che f ( x 0 ) ⋅ f (c 0 ) < 0 e ci +1 = xi ci +1 = ci se f ( xi +1 ) ⋅ f (ci ) > 0 se f ( xi +1 ) ⋅ f (ci ) ≤ 0 Questa tecnica - nota come metodo di "falsa posizione" - converge sotto le sole ipotesi di continuità della funzione f(x) e di discordanza del segno di f(x) stessa agli estremi dell'intervallo [a;b] di separazione dello zero. Anche il metodo di "falsa posizione" può essere interpretato geometricamente: Informatica per la Matematica Giorgio Meini © 2000 x0=c1=c2 x3 X.1.4.3 z x2 x1 c0 Sia l'algoritmo di Newton che il metodo delle secanti presentano lo stesso difetto: in entrambi i casi infatti non è possibile determinare una semplice condizione di terminazione del ciclo iterativo che garantisca il controllo della precisione dell'ultima approssimazione prodotta. Prendendo in esame la casistica di applicazione di entrambi i metodi si scopre facilmente che, rispettando i relativi criteri di convergenza, quando uno dei due produce una successione crescente (approssimazioni per difetto) l'altro produce sempre una successione decrescente (approssimazioni per eccesso): f(c) z c= x0 x1 x2 x3 x2 x1 x0 Questa osservazione suggerisce di impiegare contemporaneamente i due metodi in modo da poter stabilire la condizione di terminazione del ciclo iterativo in funzione della differenza (che dovrà essere minore dell'errore massimo consentito E) tra le ultime approssimazioni per eccesso e per difetto prodotte, garantendo così un rigoroso controllo sulla precisione del risultato. La seguente procedura VBA (attivabile in ambiente Excel mediante un "pulsante di comando") "legge" gli estremi dell'intervallo di separazione della funzione f(x) (implementata come funzione VBA) nelle celle A1 e B1 e "scrive" le sequenze delle approssimazioni per eccesso e per difetto prodotte dall'uso congiunto dei metodi delle tangenti e delle secanti nelle successive celle delle colonne A e B: Private Function f(x As Single) As Single f = … End Function ' f(x) Informatica per la Matematica Giorgio Meini © 2000 Private Function fd1(x As Single) As Single ' f'(x) fd1 = … End Function Private Function fd2(x As Single) As Single ' f"(x) fd2 = … End Function Private Function tangenti(x As Single) As Single tangenti = x - f(x) / fd1(x) End Function Private Function secanti(c As Single, x As Single) As Single secanti = x - (f(x) * (x - c)) / (f(x) - f(c)) End Function Public Sub Zero_Click() Const E As Single = 0.000001 ' massimo errore consentito Dim a As Single ' estremo sinistro intervallo di separazione Dim b As Single ' estremo destro intervallo di separazione Dim c As Single ' costante per metodo secanti Dim xt As Single ' variabile per metodo tangenti Dim xs As Single ' variabile per metodo secanti Dim i As Single ' contatore delle iterazioni a = Cells(1, 1) b = Cells(1, 2) If (f(a) * fd2(a) < 0) Then xs = a c = b xt = b Else xt = a c = a xs = b End If i = 0 While (Abs(xs - xt) > E) xt = tangenti(xt) xs = secanti(c, xs) i = i + 1 Cells(i + 1, 1) = xt Cells(i + 1, 2) = xs If (i > 100) Then Exit Sub End If Wend End Sub Esempio La funzione dell'esempio precedente e le relative funzioni derivate prima e seconda sono implementate in ambiente Excel dalle seguenti funzioni VBA: Private Function f(x As Single) As Single f = x ^ 3 - x + 1 End Function ' f(x) Private Function fd1(x As Single) As Single fd1 = 3 * x ^ 2 - 1 End Function ' f'(x) Informatica per la Matematica Private Function fd2(x As Single) As Single fd2 = 6 * x End Function Giorgio Meini © 2000 ' f"(x) Attivando il pulsante di comando al quale è associata la procedura Zero_Click() si ottengono, nelle celle delle colonne A e B, le iterazioni parziali dell'algoritmo che combina il metodo delle tangenti con il metodo delle secanti (le celle della colonna C rappresentano la differenza, progressivamente minore, tra le celle delle colonne A e B della stessa riga): In questo caso l'algoritmo termina dopo 17 cicli di iterazione con la certezza che l'ultimo valore prodotto (-1,324717…) è affetto da un errore minore di E=10-6 (si noti che, a causa dell'inevitabile errore algoritmico dovuto allo svolgimento di calcoli in aritmetica finita, il valore E del massimo errore consentito non può essere arbitrariamente piccolo). I seguenti grafici delle approssimazioni per difetto e per eccesso generate dall'algoritmo visualizzano la convergenza della procedura impiegata: Informatica per la Matematica Giorgio Meini © 2000 -1 -1,1 -1,2 -1,3 -1,4 -1,5 -1,6 -1,7 -1,8 -1,9 -2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 9 10 11 12 13 14 15 16 17 18 19 20 -1,3 -1,31 -1,32 -1,33 -1,34 -1,35 -1,36 -1,37 -1,38 -1,39 -1,4 1 2 3 4 5 6 7 8 Informatica per la Matematica X.1.5 Giorgio Meini © 2000 Sintesi gli algoritmi numerici sono impiegati per la determinazione delle radici di equazioni non risolvibili - o non facilmente risolvibili - con metodi algebrici; l'applicazione di un qualsiasi metodo numerico per l'approssimazione dello zero di una funzione richiede di conoscere gli estremi di un "intervallo di separazione" che non comprenda altri zeri della funzione stessa; se una funzione continua f(x) soddisfa le ipotesi previste dal "teorema degli zeri" è possibile applicare il metodo di bisezione a + bi ci = i 2 a i +1 = a i a i +1 = ci e bi +1 = ci e bi +1 = bi se f ( a i ) ⋅ f (c i ) < 0 se f ( a i ) ⋅ f (c i ) > 0 che - a partire da un intervallo [a0;b0] di ampiezza 1 - garantisce un errore analitico minore di 2-n in n iterazioni; il metodo di iterazione funzionale xi +1 = g ( xi ) consente di approssimare i punti fissi della funzione g(x) e converge nell'ipotesi che i valori generati appartengano a un intervallo in cui -1<g'(x)<1; il metodo delle tangenti (o "metodo di Newton") xi +1 = xi − f ( xi ) f ' ( xi ) e il metodo delle secanti xi +1 = xi − f ( xi )( xi − c) f ( x i ) − f (c ) sono 2 particolari metodi di iterazione funzionale che generano successioni convergenti al valore dello zero della funzione f(x); i metodi delle tangenti e delle secanti sono spesso "combinati" in un unico algoritmo iterativo la cui condizione di terminazione garantisce il controllo della precisione dell'approssimazione finale. Informatica per la Matematica X.1.6 Giorgio Meini © 2000 Esperimenti 1. Individuare gli intervalli di separazione della radici delle seguenti equazioni: a) ln x + x = 0 b) 1 + x = e x −1 x c) x 3 − 2 x 2 + 3x − 5 = 0 d) 1 − x 2 + cos(2 x) = 0 e) senx + 1 = x 2 f) x 3 = x + 1 g) 4 x 2 − 1 − x 2 = 1 h) x ⋅ ln x = 1 i) e x − x = 2 j) x + senx = 1 k) e x ⋅ log x = 1 l) x 3 − 3x + 1 = 0 2. Calcolare, con un errore minore di 10-1, le radici delle equazioni dell'esercizio 1 applicando il metodo numerico di bisezione e utilizzando la calcolatrice scientifica; contare il numero di iterazioni necessarie in ciascun caso. 3. Calcolare , con un errore minore di 10-6, le radici delle equazioni dell'esercizio 1 utilizzando in ambiente Excel la funzione bisezione(…); calcolare per ciascun caso il numero di iterazioni necessarie. 4. Rispondere, fornendo una valida motivazione, alle seguenti domande indagando in ambiente Excel il funzionamento della funzione VBA bisezione(…) in relazione a diverse funzioni f(x): a) che cosa accade se gli estremi dell'intervallo iniziale sono invertiti (a>b)? b) che cosa accade se l'intervallo specificato non contiene nessuno zero della funzione f(x)? c) e se l'intervallo specificato contiene più zeri della funzione f(x)? 5. Scrivere una funzione VBA iterazione(…) che implementi l'algoritmo di iterazione funzionale avente come unico argomento il valore iniziale e assicurando comunque l'arresto del ciclo in caso di non convergenza del metodo. La funzione g(x) sarà definita nel modulo VBA di Excel che include la codifica di iterazione(…). 6. Applicare, se possibile, il metodo di iterazione funzionale per determinare le radici delle equazioni dell'esercizio 1. Motivare gli eventuali casi di non convergenza del metodo. Informatica per la Matematica Giorgio Meini © 2000 7. # Determinare una funzione g(x) per la quale il metodo di iterazione funzionale converge a un punto fisso anche se nel suo intorno non sono verificate le ipotesi del teorema di convergenza (sia in particolare g ' ( x) > 1 : si dimostra in questo modo che tali ipotesi sono sufficienti, ma non necessarie a garantire la convergenza del metodo). 8. In ambiente Derive applicare il metodo delle tangenti per determinare le radici delle equazioni dell'esercizio 1. Determinare in ogni caso il numero di iterazioni necessarie per ottenere una differenza tra due approssimazioni successive minore di 10-6. 9. Modificare la funzione tangenti(…) in modo che divenga attivabile in ambiente Excel mediante un pulsante di comando e che, utilizzando come valore iniziale il contenuto della cella A1, produca la successione dei valori generati dall'algoritmo nelle celle successive della colonna A. Impiegare la procedura per tracciare i grafici delle successioni di valori generate in vari casi verificando il numero di iterazioni necessarie per soddisfare la condizione di terminazione. 10. Scrivere una funzione VBA che implementi l'algoritmo definito dal metodo delle secanti accettando come argomenti il valore costante c e il valore iniziale x0 (la funzione f(x) della quale si intende approssimare uno zero è definita come funzione VBA). Utilizzarla in ambiente Excel per approssimare, con un errore minore di 106 , le radici delle equazioni dell'esercizio 1; calcolare per ciascun caso il numero di iterazioni necessarie. 11. In ambiente Derive applicare - ricorrendo alle funzionalità dell'istruzione ITERATES - il metodo delle secanti per determinare le radici delle equazioni dell'esercizio 1. Determinare in ogni caso il numero di iterazioni necessarie per ottenere un'approssimazione con un errore minore di 10-6. 12. # Scrivere una funzione o procedura VBA che implementi il metodo di "falsa posizione". 13. Impiegare la procedura VBA Zero_Click() che combina i metodi delle tangenti e delle secanti per approssimare le radici delle equazioni dell'esercizio 1 con un errore minore di 10-9. Analizzare la precisione dei risultati ottenuti e il numero di iterazioni necessarie. 14. # Modificare l'implementazione delle funzioni "di servizio" fd1(…) e fd2(…) della procedura VBA Zero_Click(…) in modo che non occorra determinare e specificare le derivate prima e seconda della funzione f(x): il valore della derivata in un punto dovrà essere approssimato dal valore del rapporto incrementale calcolato impiegando un "opportuno" valore dell'incremento h. Indagare se e, eventualmente, come cambia la precisione dell'algoritmo. 15. # Definire in ambiente Derive una funzione che implementi il metodo combinato tangenti/secanti per l'approssimazione dello zero di una funzione. Informatica per la Matematica Giorgio Meini © 2000 X.2 Risoluzione di sistemi lineari X.2.0 Risoluzione di sistemi lineari con Derive e con Excel X.2.0.0 È possibile determinare i 6 coefficienti a, b, c, d, e e f di una trasformazione affine X = a⋅ x + b⋅ y + c Y = d ⋅ x + e ⋅ y + f conoscendo le coordinate originali di 3 punti P, Q e R e le coordinate dei rispettivi punti trasformati P', Q' e R' risolvendo un sistema lineare di 6 equazioni X P = a ⋅ xP + b ⋅ yP + c Y = d ⋅ x + e ⋅ y + f P P P X Q = a ⋅ xQ + b ⋅ y Q + c YQ = d ⋅ xQ + e ⋅ y Q + f X R = a ⋅ xR + b ⋅ yR + c YR = d ⋅ x R + e ⋅ y R + f X.2.0.1 Il comando Risolvi-Sistema di Derive consente di impostare le singole equazioni e di specificare le variabili "incognite" del sistema lineare (volendo utilizzare i nomi di variabile indicati è necessario ricorrere al comando Dichiara-Stato_algebraInserimento per impostare Nome variabile = Parola e Maiuscole/minuscole = Sensibile); il comando Semplifica fornisce successivamente la soluzione cercata: In questo caso la necessità di ottenere delle "formule" risolutive anziché un risultato numerico giustifica il ricorso alle funzionalità simboliche di Derive, ma spesso ciò che Informatica per la Matematica Giorgio Meini © 2000 interessa è la soluzione numerica di un sistema di equazioni (naturalmente se il numero di equazioni è pari al numero delle variabili incognite Derive risolve numericamente, anziché simbolicamente, il sistema). X.2.0.2 In Excel è possibile risolvere numericamente sistemi di equazioni lineari utilizzando il metodo di Cramer. Dovendo per esempio determinare i coefficienti di una affinità che trasforma il triangolo PQR (P(-2;0), Q(0;2) e R(2;0)) nel triangolo P'Q'R' (P'(2;0), Q'(1;-1) e R'(0,0)) Q P R' R P' Q' il sistema da risolvere, posto in forma canonica, è il seguente − 2a + c = 2 − 2 d + f = 0 2b + c = 1 2e + f = −1 2a + c = 0 2d + f = 0 da cui si ricavano la matrice A dei coefficienti e il vettore b dei termini noti − 2 0 0 A= 0 2 0 0 0 2 0 0 0 1 0 0 −2 1 0 0 0 1 0 0 2 0 0 0 2 0 0 0 1 0 1 0 1 2 0 1 b= − 1 0 0 Excel dispone della funzione MATR.DETERM(…) che calcola il determinante di una matrice quadrata di dimensione qualsiasi. Inserendo gli elementi della matrice A nell'intervallo di celle A1:F6 la funzione MATR.DETERM(A1:F6) - inserita in una cella qualsiasi - restituisce il valore -64 (nel caso che il determinante della matrice dei coefficienti sia 0 il sistema è impossibile o indeterminato). Informatica per la Matematica Giorgio Meini © 2000 Se il sistema risulta risolvibile, utilizzando le funzionalità di selezione e i comandi "copia e incolla" di Excel, non è difficile costruire le 6 matrici derivate da A sostituendo ogni volta la colonna relativa alla specifica variabile incognita con il vettore b dei termini noti. I 6 rapporti tra i determinanti di queste matrici (32, 0, -64, 0, 32 e 0) e il determinante della matrice originale A (-64) costituiscono la soluzione del sistema: 1 1 a = − 2 ; b = 0; c = 1; d = 0; e = − 2 ; f = 0 . Il calcolo del determinante di una matrice quadrata è un'operazione costosa sotto il profilo della complessità computazionale; senza addentrarci nei dettagli del calcolo è possibile condurre un semplice esperimento in ambiente Derive generando matrici quadrate di ordine n aventi elementi casuali di valore compreso tra 0 e 1 con la seguente istruzione: Assegnando ad n valori crescenti e utilizzando l'istruzione DET(…) e il comando Approssima per il calcolo del determinante di una matrice quadrata è possibile registrare i tempi di esecuzione impiegati da Derive e visualizzati nella "barra di stato" del programma; la seguente tabella si riferisce a un PC Pentium-II 350 MHz con 64 Mbyte di memoria RAM: n 10 20 30 40 50 60 70 80 90 tempo (in sec.) 0,1 0,5 4,2 11,1 23,5 44,1 94,4 199.4 363,7 Informatica per la Matematica Giorgio Meini © 2000 Molto approssimativamente si può affermare che il tempo necessario per il calcolo raddoppia ogni volta che la dimensione della matrice aumenta di 10; come è confermato dal seguente grafico (realizzato con Excel) si tratta del tipico comportamento di una funzione esponenziale t=bn: 400 350 t (sec.) 300 250 200 150 100 50 0 0 10 20 30 40 50 60 70 80 90 100 n Non è difficile determinare la base b di questa funzione empirica di complessità computazionale per il calcolo numerico del determinante con Derive: b n+10 = 2b n ⇒ b n+10 b n = 2 ⇒ b10 = 2 ⇒ b = 10 2 ≅ 1,07177 Considerando valida questa approssimazione11 la risoluzione di un sistema di 100 equazioni in 100 variabili (dimensione non insolita nelle applicazioni reali) con il metodo di Cramer richiede la determinazione di 101 determinanti, ciascuno dei quali richiede un tempo di calcolo t = 1,07177100 ≅ 1024s : complessivamente 103424 secondi, cioè quasi 29 ore. Si potrebbe obiettare che si tratta di un limite della capacità di calcolo del PC, ma la difficoltà è intrinseca al metodo di risoluzione: disponendo di un computer 1000 volte più veloce il tempo necessario per risolvere un sistema 100×100 si riduce a meno di 2 minuti, ma il tempo necessario per risolvere un sistema 200×200 di dimensione doppia è ancora t = 201 ⋅ 1,07177 200 ≅ 201 ⋅ 1049 = 210849 s , cioè circa 58 ore e mezza. 1000 Questo caratteristico comportamento della funzione esponenziale rende il metodo di Cramer computazionalmente "intrattabile" al crescere della dimensione del problema da risolvere. 11 In realtà - come è possibile evidenziare sovrapponendo al grafico dei dati empirici la tabulazione dei valori della funzione - si tratta di una stima per eccesso: questo dettaglio non invalida la sostanza delle argomentazioni succesive. Informatica per la Matematica Giorgio Meini © 2000 X.2.1 Il metodo di eliminazione di Gauss X.2.1.0 Le osservazioni del precedente paragrafo individuano la necessità di disporre di metodi efficienti per la risoluzione numerica dei sistemi lineari: il metodo di eliminazione di Gauss consiste nella sistematizzazione in forma di algoritmo del comune metodo di sostituzione. Esempio Per risolvere il sistema 2 x + y − 5z + t = 8 x − 3 y − 6t = 9 x + 4 y − 7 z + 6t = 0 2 y − z + 2t = −5 ricaviamo inizialmente l'incognita x dalla prima equazione x= 8 − y + 5z − t 2 per sostituirla successivamente nelle altre equazioni (nella quarta equazione, essendo 0 il coefficiente della variabile x, la sostituzione non è necessaria) 2 x + y − 5z + t = 8 8 − y + 5z − t − 3 y − 6t = 9 2 8 − y + 5z − t + 4 y − 7 z + 6t = 0 2 2 y − z + 2t = −5 Prendendo in considerazione il fattore moltiplicativo rappresentato dal reciproco del rapporto tra il coefficiente della variabile x della prima equazione e il coefficiente della variabile x di ciascuna delle equazioni è possibile calcolare i nuovi coefficienti delle altre variabili come differenza tra i coefficienti originali e i corrispondenti coefficienti della prima equazione; lo stesso calcolo è valido anche per il termine noto: 2 x + y − 5z + t = 8 8 1 1 5 − 3 − y + z + − 6 − t = 9 − 2 2 2 2 4 − 1 y + − 7 + 5 z + 6 − 1 t = 0 − 8 2 2 2 2 2 y − z + 2t = −5 2 x + y − 5z + t = 8 7 5 13 − y + z − t = 5 2 2 2 7 9 11 y − z + t = −4 2 2 2 2 y − z + 2t = −5 Informatica per la Matematica Giorgio Meini © 2000 Ora è possibile ricavare l'incognita y dalla seconda equazione y= 5− 5 13 z+ t 2 2 7 − 2 per sostituirla nella terza e quarta equazione 2 x + y − 5z + t = 8 7 5 13 − y+ z − t =5 2 2 2 5 13 5− z+ t 7 2 2 − 9 z + 11 t = −4 7 2 2 2 − 2 5 13 5− z+ t 2 2 − z + 2t = −5 2 7 − 2 Procedendo con la tecnica già impiegata in precedenza è possibile calcolare i nuovi coefficienti e i nuovi termini noti della terza e quarta equazione 2x + y − 5z + t = 8 7 5 13 − y+ z − t =5 2 2 2 9 5 11 13 − + z + − t = −4 + 5 2 2 2 2 4 5 4 13 4 − 1 + ⋅ z + 2 − ⋅ t = −5 + ⋅ 5 7 2 7 2 7 2 x + y − 5z + t = 8 7 5 13 − y + z − t = 5 2 2 2 − − = z t 2 1 3 12 15 z− t=− 7 7 7 Si prosegue ricavando l'incognita z dalla terza equazione z= per sostituirla nella quarta 1+ t −2 Informatica per la Matematica Giorgio Meini © 2000 2 x + y − 5z + t = 8 7 5 13 − 2 y + 2 z − 2 t = 5 3 1 +− t2 z −12t = 1 15 ⋅ − t=− 7 − 2 7 7 2 x + y − 5z + t = 8 7 5 13 − y + z − t = 5 2 2 2 − 2z − t = 1 3 12 15 3 − − t = − + 14 7 7 14 Il sistema così ottenuto dopo 4 sostituzioni 2x + y − 5z + t = 8 7 5 13 − y + z − t = 5 2 2 2 − − = z t 2 1 27 27 − t=− 14 14 è "triangolare": l'ultima equazione ha come incognita solo l'ultima variabile (t), la penultima equazione ha come incognite solo le ultime due variabili (t e z), fino alla prima equazione cha ha come incognite tutte le variabili (t, z, y e x). Un sistema triangolare si risolve facilmente applicando la tecnica delle sostituzioni "all'indietro", iniziando dalla determinazione del valore dell'unica incognita che compare nell'ultima equazione 2 x + y − 5z + t = 8 7 5 13 − y + z − t = 5 2 2 2 − 2z − t = 1 27 − t = 14 = 1 27 − 14 per sostituirla nella penultima equazione al fine di ricavare il valore dell'altra variabile presente 2 x + y − 5z + t = 8 7 5 13 − y + z − t = 5 2 2 2 1+1 z= = −1 −2 t =1 Informatica per la Matematica Giorgio Meini © 2000 Procedendo "a ritroso" e sostituendo alle variabili i valori delle incognite già determinate si completa la risoluzione del sistema: 2 x + y − 5z + t = 8 13 5 5+ + 2 2 = −4 y = 7 − 2 z = −1 t =1 8 −1− 5 + 4 =3 x = 2 y = −4 z = −1 t =1 X.2.1.1 Rappresentando un sistema lineare generico di n equazioni in n variabili (x1, x2, …, xn) con la seguente notazione a11 x1 + a12 x 2 + ... + a1 j x j + ... + a1n x n = b1 a x + a x + ... + a x + ... + a x = b 22 2 2j j 2n n 2 21 1 ... a x + a x + ... + a x + ... + a x = b i2 2 ij j in n i i1 1 ... a n1 x1 + a n 2 x 2 + ... + a nj x j + ... + a nn x n = bn che determina la matrice dei coefficienti a11 a 21 ... A = a i1 ... a n1 e il vettore dei termini noti a12 a 22 ... ai 2 ... a n2 ... ... ... ... ... ... a1 j a2 j ... a ij ... a nj ... a1n ... a 2n ... ... ... ain ... ... ... a nn Informatica per la Matematica Giorgio Meini © 2000 b1 b 2 ... b= bi ... bn il metodo di Gauss può essere interpretato come un algoritmo che modifica gli elementi della matrice A e del vettore b. Dato che la fase di triangolarizzazione necessita di n-1 passi (uno per ciascuna sostituzione da effettuare) la notazione impiegata per la descrizione dell'algoritmo etichetta i coefficienti aij e i termini noti bi con un apice (k) che indica il "passo" k al quale ci si riferisce; il sistema originale può quindi essere riscritto nel modo seguente: a (1) x + a (1) x + ... + a (1) x + ... + a (1) x = b (1) j n 12 2 1j 1n 1 11 1 (1) (1) (1) (1) a 21 x1 + a 22 x 2 + ... + a 2 j x j + ... + a 2n x n = b2 (1) ... (1) (1) (1) (1) (1) ai1 x1 + ai 2 x 2 + ... + aij x j + ... + a in x n = bi ... (1) (1) (1) (1) (1) a n1 x1 + a n 2 x 2 + ...a nj x j + ... + a nn x n = bn Per il k-esimo degli n passi della fase di triangolarizzazione si determina inizialmente, per ciascuna delle ultime n-k equazioni, il fattore moltiplicativo mik = aik ( k ) a kk ( k ) i = (k + 1),..., n ; i coefficienti e i termini noti sono successivamente aggiornati secondo le regole a ij ( k +1) a ij ( k ) = (k ) − mik ⋅ a kj ( k ) a ij i≤k i>k b (k ) bi ( k +1) = ( k ) i bi − mik ⋅ bk ( k ) j = k ,..., n i≤k i>k dove l'apice (k) inidica i termini attuali della matrice A e del vettore b, mentre l'apice (k+1) indica i nuovi termini di A e di b da calcolare per il passo successivo. Dopo n passi si ottiene il sistema triangolare Informatica per la Matematica Giorgio Meini © 2000 a ( n) x + a ( n) x + ... + a ( n) x = b ( n) 1 12 2 1n 1 n 11 ( n) ( n) ( n) a 22 x 2 + ... + a 2n x n = b2 ... aii ( n) xi + ... + ain ( n) x n = bi ( n) ... a nn ( n) x n = bn ( n) che si risolve mediante le seguenti sostituzioni "all'indietro" xn = bi ( n) − xi = bn ( n ) a nn ( n) n ∑ aij (n) ⋅ x j j =i +1 a ii ( n) i = (n − 1),...,1 dove la sommatoria sintetizza la somma a i (i +1) ( n) ⋅ xi +1 + a i (i + 2) ( n) ⋅ xi + 2 + ... + ain ( n) ⋅ x n Osservazione Se al k-esimo passo della fase di triangolarizzazione il coefficiente akk è nullo non è possibile calcolare i fattori moltiplicativi mik: in questo caso è necessario scambiare la k-esima equazione con una delle equazioni successive per le quali sia aik ≠ 0 . Se non esiste, tra le successive, una equazione per cui aik ≠ 0 allora il sistema è impossibile o indeterminato. Per migliorare la stabilità numerica dell'algoritmo si applica la tecnica del massimo pivot: al k-esimo passo si determina tra le ultime n-k equazioni quella per cui il valore assoluto del coefficiente aik (il "pivot") risulta massimo e nel caso che questa equazione non sia la k-esima si scambiano tra loro. Se il sistema è risolvibile il ricorso alla tecnica del massimo pivot garantisce che al passo k-esimo - successivamente all'eventuale scambio di equazioni - il coefficiente akk non sia nullo. X.2.1.2 La procedura VBA che segue - associata a un pulsante di comando inserito in un foglio Excel - implementa il metodo di Gauss con la tecnica del massimo pivot ipotizzando che i coefficienti del sistema siano inseriti nelle celle delle prime n righe e n colonne e che i termini noti siano inseriti nelle celle della (n+1)-esima colonna (la dimensione n del sistema è invece specificata come costante nel modulo VBA). La procedura dichiara e impiega come variabili una matrice A di dimensione n×n per i coefficienti, un vettore b di dimensione n per i termini noti e un vettore x di dimensione n per le soluzioni: questa soluzione rende la notazione impiegata nel codice simile alla notazione matematica impiegata nella descrizione dell'algoritmo. Un ciclo iniziale copia i valori dalle celle del foglio nelle variabili A e b e un ciclo finale copia le soluzioni del vettore x nelle celle della (n+1)-esima riga del foglio. Informatica per la Matematica Giorgio Meini © 2000 Nel codice i "passi" successivi delle due fasi dell'algoritmo e il calcolo della sommatoria necessaria per la determinazione delle soluzioni sono implementati mediante cicli For-Next che esplicitano il numero di iterazioni da effettuare; la verifica dell'eventuale nullità del massimo pivot (che implica la non risolubilità del sistema) è per motivi di approssimazione numerica - svolta confrontandone il valore assoluto con una tolleranza T stabilita tenendo conto della precisione dell'ambiente di calcolo. Option Base 1 'il primo indice di matrici e vettori è 1 (e non 0) Const N As Integer = … ' dimensione del sistema Const T As Single = 0.000001 ' tolleranza per nullità massimo pivot Sub Dim Dim Dim Dim Dim Dim Dim Gauss_Click() A(N, N) As Single b(N) As Single x(N) As Single i, j, k As Integer PivotRow AS Integer pivot, m As Single tmp, sum As Single ' ' ' ' ' ' ' matrice dei coefficienti vettore dei termini noti vettore delle soluzioni indici e contatore dei passi indice della riga con massimo pivot pivot e fattore moltiplicativo variabili ausiliare e temporanee ' ciclo di inizializzazione della matrice A e del vettore b For i = 1 To N For j = 1 To N A(i, j) = Cells(i, j) Next j b(i) = Cells(i, N + 1) Next i ' fase di triangolarizzazione For k = 1 To (N-1) ' ricerca del massimo pivot e della riga relativa pivot = Abs(A(k, k)) PivotRow = k For i = (k + 1) To N If Abs(A(i, k)) > pivot Then pivot = Abs(A(i, k)) PivotRow = i End If Next i ' massimo pivot nullo: il sistema è impossibile o indeterminato If pivot < T Then Exit Sub End If ' eventuale scambio di righe (coefficienti e termini noti) If PivotRow <> k Then For j = 1 To N tmp = A(PivotRow, j) A(PivotRow, j) = A(k, j) A(k, j) = tmp Next j tmp = b(PivotRow) b(PivotRow) = b(k) b(k) = tmp End If ' ciclo di aggiornamento della matrice A e del vettore b pivot = A(k, k) For i = (k + 1) To N Informatica per la Matematica Giorgio Meini © 2000 ' calcolo del fattore moltiplicativo m = A(i, k) / pivot ' aggiornamento delle colonne della matrice A For j = k To N A(i, j) = A(i, j) - m * A(k, j) Next j ' aggiornamento degli elementi del vettore b b(i) = b(i) - m * b(k) Next i Next k ' fase delle sostituzioni all'indietro x(N) = b(N) / A(N, N) For i = N - 1 To 1 Step -1 sum = 0 ' ciclo di calcolo della sommatoria For j = (i + 1) To N sum = sum + A(i, j) * x(j) Next j x(i) = (b(i) - sum) / A(i, i) Next i ' visualizzazione del risultato For i = 1 To N Cells(N + 1, i) = x(i) Next i End Sub Esempio Per risolvere il sistema dell'esempio precedente con la procedura VBA illustrata è sufficiente inserire in un foglio Excel i coefficienti nell'intervallo A1..D4 e i termini noti nell'intervallo E1..E4: Il pulsante di comando associato esegue la procedura che visualizza i risultati nella prima riga libera del foglio: Osservazione Il metodo di eliminazione di Gauss non presenta errore analitico in quanto è un metodo algebrico esatto, ma la sua esecuzione in un ambiente di calcolo con aritmetica finita produce inevitabilmente un errore algoritmico. L'adozione della tecnica del Informatica per la Matematica Giorgio Meini © 2000 massimo pivot riduce, ma ovviamente non elimina completamente, l'errore algoritmico del metodo. Nella maggioranza dei casi pratici l'errore commesso è minimo, ma esistono alcuni tipi di sistemi lineari - denominati sistemi malcondizionati - per i quali variazioni minime dei coefficienti e dei termini noti inducono variazioni consistenti nella soluzione: il malcondizionamento è una caratteristica intrinseca del sistema e non è dovuta al particolare metodo di risoluzione adottato. Vediamo un semplice esempio: il sistema x + y =1 99 x + 101y = 100 ha soluzione 1 x = 2 ; 1 y= 2 ma variando di un centesimo (10-2) il coefficiente della variabile x nella prima equazione il risultato cambia drasticamente; infatti il sistema 101 x + y =1 100 99 x + 101y = 100 ha soluzione 100 1 x = 301 ≅ 3 ; y= 200 2 ≅ 301 3 La variazione introdotta simula un errore dell' 1% e provoca un errore nella soluzione pari al 33,3% con una amplificazione di 33 volte dell'errore relativo. È evidente come in presenza di un sistema malcondizionato sia inutile l'applicazione di un qualsiasi metodo di calcolo approssimato: solo una soluzione esatta, per quanto costosa in termini computazionali, garantisce l'immunità da gravi errori nel risultato. Nel caso di un sistema di 2 equazioni in 2 incognite il malcondizionamento ha una semplice interpretazione geometrica: le 2 equazioni originali rappresentano rette (in blu e rosso nel grafico) con coefficienti angolari e intercette molto simili formanti un angolo di incidenza molto piccolo; in questa situazione la minima perturbazione di una delle 2 rette (in verde nel grafico) sposta radicalmente il punto di intersezione. Informatica per la Matematica X.2.1.3 Giorgio Meini © 2000 Dato che il numero di operazioni da effettuarsi per risolvere un sistema lineare con l'algoritmo di eliminazione di Gauss dipende esclusivamente dalla dimensione del sistema stesso non è difficile valutare la complessità computazionale del metodo (per semplicità valuteremo il costo computazionale del metodo in termini di operazioni di moltiplicazione e divisione; questa scelta permette di non prendere in considerazione la tecnica del massimo pivot ai fini della determinazione del costo computazionale). Come è possibile verificare nel codice VBA che implementa l'algoritmo al k-esimo passo della fase di triangolarizzazione si svolgono (n-k) divisioni per la determinazione dei fattori moltiplicativi, (n-k) moltiplicazioni per l'aggiornamento del vettore dei termini noti e (n-k+1)×(n-k) moltiplicazioni per l'aggiornamento della matrice dei coefficienti. Il costo computazionale in termini di operazioni di moltiplicazione e divisione dell'intera fase di triangolarizzazione è:12 n −1 n3 4 ∑ (n − k ) + (n − k ) + (n − k + 1)(n − k ) = 3 + n 2 − 3 n . k =1 Per la fase di sostituzione all'indietro si svolgono n passi per ciascuno dei quali si ha una divisione e, al p-esimo passo, (p-1) moltiplicazioni, complessivamente: n ∑p= p =1 n(n + 1) n 2 n = + 2 2 2 In conclusione il metodo di eliminazione di Gauss viene eseguito svolgendo 12 Non ricordando le formule che consentono di esplicitare la sommatoria definita è possibile calcolarne la somma con Derive semplificando l'istruzione SUM((n-k)+(n-k)+(n-k+1)(n-k),k,1,n-1). Informatica per la Matematica Giorgio Meini © 2000 n3 4 n2 n n3 3 2 5 + n2 − n + + = + n − n 3 3 2 2 3 2 6 operazioni di moltiplicazione o divisione. X.2.2 I metodi iterativi per la risoluzione dei sistemi lineari X.2.2.0 Il metodo di eliminazione di Gauss è un metodo diretto che definisce un algoritmo numerico risolutivo a partire da una tecnica algebrica esatta (la tecnica della "sostituzione"). Come nel caso delle equazioni anche per la risoluzione dei sistemi lineari esistono algoritmi numerici iterativi che producono una successione di vettori eventualmente convergente alla soluzione del sistema: in alcuni casi questi metodi iterativi si dimostrano più efficienti dei metodi diretti sia per l'accuratezza del risultato che per il costo computazionale dell'esecuzione. X.2.2.1 Il più semplice dei metodi iterativi per la risoluzione dei sistemi lineari può essere introdotto con un esempio: 2 x − y = −1 x + 2y = 0 2 1 Il sistema - come si può immediatamente verificare - ha soluzione − ; ; 5 5 ricavando la prima incognita (x) dalla prima equazione e la seconda incognita (y) dalla seconda equazione si ottiene il seguente sistema: −1+ y x = 2 −x y= 2 Scegliendo, anche in modo casuale, una approssimazione iniziale della soluzione - per esempio [x=0; y=0] - è in questo caso possibile "raffinarla" per iterazione costruendo due successioni convergenti alle singole componenti della soluzione del sistema: − 1 + yi x0 = 0 xi +1 = 2 − xi y i +1 = y0 = 0 2 In Excel è possibile utilizzare le celle delle colonne A e B rispettivamente per calcolare le approssimazioni successive delle variabili x e y inserendo nelle celle della prima riga l'approssimazione iniziale e impostando nelle celle della seconda riga le formule ricorsive che definiscono l'iterazione: Informatica per la Matematica Giorgio Meini © 2000 Copiando le formule della seconda riga nelle celle sottostanti delle colonne A e B si calcolano i termini della successione vettoriale che approssima la soluzione del sistema (le celle delle colonne A e B sono state formattate in modalità numerica con visualizzazione impostata a 6 cifre decimali): Osservazione In Derive è possibile impiegare l'istruzione ITERATES per definire una successione ricorsiva di coppie di valori convergente alla soluzione del sistema: Informatica per la Matematica Giorgio Meini © 2000 Successivamente il comando di approssimazione consente di generare i valori della successione di coppie: X.2.2.2 La generalizzazione del metodo iterativo del paragrafo precedente definisce il metodo di Jacobi per l'approssimazione della soluzione di un sistema lineare n×n: n bi − ∑ aij x j ( k ) xi ( k +1) = j =1 j ≠i a ii i = 1,...n La sommatoria indicata nella formula che definisce l'iterazione sintetizza la somma ai1 x1( k ) + ai 2 x 2 ( k ) + ... + ain x n ( k ) da cui è escluso il termine a ii xi ( k ) ; l'apice (k) indica l'indice della successione e le componenti del vettore delle approssimazioni iniziali [x 1 ( 0) x 2 ( 0) ... x n (0) ] sono casuali. La procedura VBA che segue - associata a un pulsante di comando inserito in un foglio Excel - implementa il metodo iterativo di Jacobi ipotizzando che i coefficienti Informatica per la Matematica Giorgio Meini © 2000 del sistema siano inseriti nelle celle delle prime n righe e n colonne, che i termini noti siano inseriti nelle celle della (n+1)-esima colonna e che le approssimazioni iniziali siano inserite nelle celle della (n+1)-esima riga (la dimensione n del sistema è invece specificata come costante nel modulo VBA). Al fine di rendere la notazione impiegata nel codice simile alla notazione matematica impiegata nella descrizione dell'algoritmo la procedura dichiara e impiega come variabili una matrice A di dimensione n×n per i coefficienti, un vettore b di dimensione n per i termini noti e un vettore x di dimensione n per le approssimazioni della soluzione (un vettore t consente la memorizzazione temporanea delle approssimazioni calcolate in attesa della conclusione dell'iterazione corrente). Un ciclo iniziale copia i valori dalle celle del foglio nelle variabili A, b e x; al termine di ogni iterazione un ciclo aggiorna il vettore x e copia le approssimazioni della soluzione nelle celle della (n+k)-esima riga del foglio, con k è l'indice dell'iterazione corrente. Option Base 1 ' il primo indice di matrici e vettori è 1 (non 0) Const N As Integer = … ' dimensione del sistema Sub Jacobi_Click() Const P As Integer = 100 ' numero dei passi di iterazione Dim Dim Dim Dim Dim Dim Dim A(N, b(N) x(N) t(N) i, j k As s As N) As Single As Single As Single As Single As Integer Integer Single ' ' ' ' ' ' ' matrice dei coefficienti vettore dei termini noti vettore delle approssimazioni della sol. vettore mem. temporanea approssimazioni indici contatore dei passi variabile per sommatoria For i = 1 To N For j = 1 To N A(i, j) = Cells(i, j) Next j b(i) = Cells(i, N + 1) x(i) = Cells(N + 1, i) Next i For k = 1 To P ' generazione nuove approssimazioni For i = 1 To N s = 0 ' calcolo della sommatoria For j = 1 To N If (j <> i) Then s = s + A(i, j) * x(j) End If Next j t(i) = (b(i) - s) / A(i, i) Next i For i = 1 To N x(i) = t(i) Cells(N + k + 1, i) = x(i) Next i Next k End Sub Informatica per la Matematica Giorgio Meini © 2000 Esempio Il sistema 1 2 x − y + 2 z = 1 2y − z = 0 x − 2z = 2 1 3 3 ha soluzione x = ; y = − ; z = − . Per calcolare la soluzione con il metodo 2 8 4 iterativo di Jacobi impiegando la procedura Jacobi_Click() è sufficiente inserire i coefficienti e i termini noti nell'intervallo di celle A1..D3 del foglio Excel (se non vengono inserite nell'intervallo di celle A4..D3 le componenti iniziali del vettore delle approssimazioni il codice VBA assume che esse siano nulle): Dopo aver impostato la dimensione del sistema Const N As Integer = 3 ' dimensione del sistema l'esecuzione della procedura Jacobi_Click() attivata con il pulsante di comando produce la successione delle approssimazioni convergente alla soluzione del sistema: Informatica per la Matematica Giorgio Meini © 2000 Esempio Il sistema x + 2 y = 0 2x + y = 1 2 1 ha soluzione x = ; y = − . Impiegando la procedura Jacobi_Click() per 3 3 risolverlo (dopo aver impostato la dimensione del sistema a 2) si ottiene una successione non convergente: Anche i tentativi condotti specificando nell'intervallo di celle A3..B3 valori iniziali dell'approssimazione diversi dal vettore [0; 0] hanno lo stesso esito: in questo caso il metodo iterativo di Jacobi non converge alla soluzione del sistema. X.2.2.3 Il seguente teorema assicura una condizione sufficiente, ma non strettamente necessaria, per la convergenza del metodo di Jacobi; essa risulta di semplice verifica, ma la dimostrazione, non essendo altrettanto semplice, è omessa. Teorema Se la matrice A dei coefficienti di un sistema lineare presenta la caratteristica di "predominanza diagonale in senso stretto", cioè se per ogni indice di riga i si ha che il valore assoluto del termine "diagonale" aii è maggiore della somma dei valori assoluti di tutti gli altri termini della riga: n a ii > ∑ a ij , j =1 j ≠i allora il metodo iterativo di Jacobi converge alla soluzione del sistema. Informatica per la Matematica Giorgio Meini © 2000 Osservazione Le ipotesi del teorema di convergenza del metodo iterativo di Jacobi non comprendono condizioni relative ai valori dei termini noti o ai valori delle componenti iniziali del vettore delle approssimazioni: se convergente il metodo di Jacobi converge per una qualsiasi scelta delle approssimazioni iniziali che possono quindi essere casuali. Come tutti i metodi iterativi il metodo di Jacobi è numericamente stabile: ogni singola approssimazione viene trattata come l'approssimazione iniziale che non influenza la convergenza del metodo; l'eventuale errore di calcolo che influenza una approssimazione intermedia viene "autocorretto" dall'algoritmo e non si accumula nelle iterazioni successive. Esempio Il sistema 2,2a + 5b + c − 0,5d = 1 0,2a − 1,6c + 2,2d = 0 a + 0,2b + 0,5d = 2 a − b + 5c − 1,5d = −2,75 ha matrice dei coefficienti 1 − 0,5 2,2 5 0,2 0 − 1,6 2,2 A= 2 0,2 0 0,5 5 − 1,5 1 −1 che non è a predominanza diagonale in senso stretto, ma il sistema equivalente a + 0,2b + 0,5d = 2 2,2a + 5b + c − 0,5d = 1 a − b + 5c − 1,5d = −2,75 0,2a − 1,6c + 2,2d = 0 ottenuto scambiando la posizione delle equazioni presenta la matrice dei coefficienti con la caratteristica di predominanza diagonale in senso stretto 0 0,5 1 0,2 2,2 5 1 − 0,5 A= 1 −1 5 − 1,5 0,2 0 − 1,6 2,2 che assicura la convergenza del metodo di Jacobi. Ovviamente al fine di ottenere una matrice dei coefficienti a predominanza diagonale in senso stretto è possibile modificare un sistema lineare utilizzando trasformazioni Informatica per la Matematica Giorgio Meini © 2000 più complesse del semplice scambio di posizione delle equazioni: in particolare è possibile sostituire le equazioni con particolari combinazioni lineari delle stesse. X.2.2.4 Se nell'algoritmo iterativo che definisce il metodo di Jacobi (noto anche come metodo delle "sostituzioni simultanee") eliminiamo il ricorso al vettore t per la memorizzazione temporanea delle approssimazioni calcolate in una specifica iterazione aggiornando direttamente il vettore x si ha come conseguenza che il calcolo delle approssimazioni successive alla prima impiega i valori delle approssimazioni precedenti già modificati nel corso dell'iterazione corrente. Questa variante dell'algoritmo conosciuta come metodo di Seidel (o metodo delle "sostituzioni successive") in molti casi accelera la velocità di convergenza: Option Base 1 ' il primo indice di matrici e vettori è 1 (non 0) Const N As Integer = … ' dimensione del sistema Sub Seidel_Click() Const P As Integer = 100 ' numero dei passi di iterazione Dim Dim Dim Dim Dim Dim A(N, b(N) x(N) i, j k As s As N) As Single As Single As Single As Integer Integer Single ' ' ' ' ' ' matrice dei coefficienti vettore dei termini noti vettore delle approssimazioni della sol. indici contatore dei passi variabile per sommatoria For i = 1 To N For j = 1 To N A(i, j) = Cells(i, j) Next j b(i) = Cells(i, N + 1) x(i) = Cells(N + 1, i) Next i For k = 1 To P ' generazione nuove approssimazioni For i = 1 To N s = 0 ' calcolo della sommatoria For j = 1 To N If (j <> i) Then s = s + A(i, j) * x(j) End If Next j x(i) = (b(i) - s) / A(i, i) Cells(N + k + 1, i) = x(i) Next i Next k End Sub Esempio Come è possibile verificare in ambiente Excel la procedura Jacobi_Click() converge alla soluzione del sistema a predominanza diagonale in senso stretto Informatica per la Matematica Giorgio Meini © 2000 a + 0,2b + 0,5d = 2 2,2a + 5b + c − 0,5d = 1 a − b + 5c − 1,5d = −2,75 0,2a − 1,6c + 2,2d = 0 in circa 40 iterazioni: a partire dalla quarantesima iterazione le cifre decimali visualizzate non vengono infatti ulteriormente modificate e è possibile adottare come soluzione il vettore [a = 2,855428; b = -0,89072; c = -1,5056; d = -1,35457] . Applicando allo stesso sistema la procedura Seidel_Click() associata a un pulsante di comando di un foglio Excel lo stesso risultato viene prodotto in meno di 20 iterazioni: Informatica per la Matematica X.2.3 Giorgio Meini © 2000 Sintesi per la risoluzione numerica dei sistemi lineari esistono metodi diretti, derivati da tecniche "esatte" di risoluzione algebrica, e metodi iterativi che generano una successione di approssimazioni convergente alla soluzione; il metodo di eliminazione di Gauss è un metodo diretto derivato dalla tecnica algebrica della sostituzione; è suddiviso in due fasi: "triangolarizzazione" a (k ) mik = ik a kk ( k ) i = (k + 1),..., n aij ( k ) aij ( k +1) = ( k ) − mik ⋅ a kj ( k ) aij i≤k i>k b (k ) bi ( k +1) = ( k ) i bi − mik ⋅ bk ( k ) j = k ,..., n i≤k i>k e "sostituzione all'indietro" xn = bi ( n) − xi = bn ( n ) a nn ( n) n ∑ aij (n) ⋅ x j j =i +1 a ii ( n) i = (n − 1),...,1 il costo computazionale del metodo di eliminazione di Gauss è di n3 3 2 5 + n − n 3 2 6 operazioni di moltiplicazione o divisione; il metodo di Jacobi n bi − ∑ a ij x j ( k ) j =1 xi ( k +1) = j ≠i a ii i = 1,...n è un metodo iterativo che ha come condizione sufficiente di convergenza la predominanza diagonale in senso della matrice A dei coefficienti Informatica per la Matematica Giorgio Meini © 2000 n a ii > ∑ aij i = 1,...n j =1 j ≠i il metodo di Seidel è una variante del metodo iterativo di Jacobi che utilizza le approssimazioni già generate nell'iterazione corrente per il calcolo delle approssimazioni relative alle variabili successive; normalmente la velocità di convergenza del metodo di Seidel è superiore a quella del metodo di Jacobi. Informatica per la Matematica X.2.4 Giorgio Meini © 2000 Esperimenti 1. Risolvere i seguenti sistemi lineari utilizzando in ambiente Excel sia il metodo di Cramer che la procedura VBA Gauss_Click(); valutare la precisione delle soluzioni ottenute risolvendoli in modo esatto in ambiente Derive. 2 x − y + z = −3 a) 3 x + 5 y − 2 z = 1 x − 4 y + 10 z = 0 3a + b − c + 2d = 6 b) − 5a + b + 3c − 4d = −12 2a + c − d = 1 a − 5b + 3c − 3d = 3 a + 3b − 2c − 2e = 0,5 3a + 4b − 5c + d − 3e = 5,4 c) − 2a − 5b + 3c − 2d + 2e = 5 b − 2c + 5d + 3e = 7,5 − 2a − 3b + 2c + 3d + 4e = 3,3 7,9 x + 5,6 y + 5,7 z − 7,2t = 6,68 d) 8,5 x − 4,8 y + 0,8 z + 3,5t = 9,95 4,3x + 4,2 y − 3,2 z + 9,3t = 8,6 3,2 x − 1,4 y − 8,9 z + 3,3t = 1 6 x − y − z = 11,33 e) − x + 6 y − z = 32 − x − y + 6 z = 42 f) 10 x1 − 2 x 2 − 2 x3 = 6 − x1 + 10 x 2 − 2 x3 = 7 − x − x + 10 x = 8 1 2 3 1,02 x1 − 0,05 x 2 − 0,1x3 = 0,795 g) − 0,11x1 + 1,03 x 2 − 0,05 x3 = 0,849 − 0,11x − 0,12 x + 1,04 x = 1,398 1 2 3 2. Modificare la procedura VBA Gauss_Click() in modo che effettui il conteggio delle operazioni di moltiplicazione e divisione effettivamente svolte visualizzando Informatica per la Matematica Giorgio Meini © 2000 il risultato in una cella del foglio Excel. Eseguire la procedura con sistemi di varia dimensione verificando la previsione teorica del costo computazionale. 3. # Modificare l'algoritmo di eliminazione di Gauss in modo che produca in n passi, anziché un sistema triangolare, un sistema "diagonale" dove tutte le equazioni sono del tipo a ii xi = bi . Un sistema in forma diagonale non necessita, per essere risolto, dello svolgimento delle sostituzioni all'indietro: implementare l'algoritmo definito come procedura VBA e verificarne empiricamente la correttezza. Determinare la complessità computazionale di questo algoritmo (in termini di operazioni di moltiplicazione e divisione) denominato "metodo di Gauss-Jordan". 4. Risolvere - quando possibile - i sistemi dell'esercizio 1 impiegando in ambiente Excel la procedura VBA Jacobi_Click(). Confrontare la precisione delle soluzioni calcolate con la soluzione esatta determinata in ambiente Derive e con le soluzioni fornite dalla procedura Gauss_Click() che implementa il metodo diretto di eliminazione. 5. # Modificare il codice della procedura VBA Jacobi_Click() in modo che la condizione di terminazione del ciclo non sia l'esecuzione di un numero prefissato di iterazioni, ma il fatto che la massima differenza in valore assoluto tra le componenti corrispondenti di due successivi vettori di approssimazioni generati dall'algoritmo sia inferiore ad una costante predefinita. 6. Risolvere - quando possibile - i sistemi dell'esercizio 1 impiegando in ambiente Excel la procedura VBA Seidel_Click(). Confrontare il numero di iterazioni necessarie a stabilizzare le approssimazioni della soluzione con quelle richieste dal metodo di Jacobi (procedura Jacobi_Click()). 7. # Utilizzare l'istruzione ITERATES dell'ambiente Derive per risolvere con il metodo di Jacobi i sistemi (e), (f) e (g) dell'esercizio 1. Costruire per ciascuno di essi un grafico che mostri il numero di iterazioni necessarie a stabilizzare le approssimazioni delle soluzioni in funzione di valori crescenti del numero di cifre significative impiegate nel calcolo. Informatica per la Matematica Giorgio Meini © 2000 X.3 Interpolazione X.3.0 Il polinomio di interpolazione Il problema dell'interpolazione consiste nel determinare - noti n+1 punti di coordinate (x0; y0), (x1; y1), …, (xn; yn) - una funzione f(x) che assuma in corrispondenza dei punti base ("nodi") x0, x1, …, xn i valori f(x0)=y0, f(x1)=y1, …, f(xn)=yn. y1 yn y0 x0 x1 xn Trattandosi di un problema ricorrente nel campo della matematica applicata la classe di funzioni alla quale f(x) appartiene deve presentare caratteristiche di semplicità algebrica e di efficiente calcolabilità numerica, per questo motivo sono frequentemente impiegate le funzioni polinomiali di grado n: p( x) = a 0 x n + a1 x n −1 + ... + a n−1 x + a n Il problema è in questo caso ben posto in quanto dal teorema fondamentale dell'algebra segue che due polinomi di grado n che assumono lo stesso valore in n+1 punti distinti coincidono. Dato che p(x0)=y0, p(x1)=y1, …, p(xn)=yn, la determinazione dei coefficienti a0, a1, …, an può essere effettuata risolvendo sistema lineare: ( x n )a + ( x n−1 )a + ... + ( x )a 0 1 0 n −1 + a n = y 0 0n 0 n −1 ( x1 )a 0 + ( x1 )a1 + ... + ( x1 )a n−1 + a n = y1 ... ( x n )a + ( x n−1 )a + ... + ( x )a 0 n 1 n n −1 + a n = y n n La matrice dei coefficienti ha dimensione (n+1)×(n+1) x n 0n x1 ... n xi ... x n n x0 n−1 ... x 0 x1n −1 ... x1 ... ... ... n −1 xi ... xi ... ... ... n −1 xn ... x n 1 1 1 1 1 1 Informatica per la Matematica Giorgio Meini © 2000 e presenta la tipica struttura della "matrice di Vandermonde". È possibile dimostrare che una matrice di Vandermonde è non singolare se i punti x0, x1, …, xn sono tutti diversi tra loro, di conseguenza - avendo il sistema una soluzione unica costituita da n+1 coefficienti che individuano univocamente un polinomio di grado n o minore vale il seguente teorema che assicura l'esistenza e l'unicità della soluzione di un problema di interpolazione polinomiale: Teorema Assegnati i nodi x0, x1, …, xn (xi≠xj se i≠j) e le relative ordinate y0, y1, …, yn esiste ed è unico il polinomio p(x) di grado minore o uguale a n tale che p(xi)=yi per ogni i=0,1, … n. Esempio Assegnati i 4 punti (0;-1), (0,5;2), (2;1) e (-1;0) la soluzione del seguente sistema lineare 4×4 è costituita dai coefficienti a, b, c e d del polinomio di interpolazione ax3+bx2+cx+d: d = −1 (0,5) 3 a + (0,5) 2 b + (0,5)c + d = 2 2 3 a + 2 2 b + 2c + d = 1 (−1) 3 a + (−1) 2 b + (−1)c + d = 0 Risolvendo il sistema in ambiente Derive si ottiene la soluzione che individua il polinomio Il seguente grafico del polinomio p(x) è stato sovrapposto alla rappresentazione grafica dei 4 punti assegnati Informatica per la Matematica Giorgio Meini © 2000 X.3.1 Il polinomio di interpolazione nella forma di Lagrange X.3.1.0 La tradizionale "forma" di un polinomio p( x) = a 0 x n + a1 x n −1 + ... + a n−1 x + a n non è la più efficiente dal punto di vista della computazione del valore p(x) assunto dal polinomio p in corrispondenza di un punto x: calcolando le potenze come moltiplicazioni ripetute il calcolo del valore di un polinomio di grado n richiede infatti n ∑ (i + 1) = i =1 n 2 + 3n moltiplicazioni13 e n addizioni o sottrazioni. 2 La seguente "forma di Hörner" p ( x) = (...(((ao x + a1 ) x + a 2 ) x + ... + a n −1 ) x + a n ) è priva di potenze e consente di calcolare efficientemente il valore p(x) assunto dal polinomio con sole n moltiplicazioni e n addizioni o sottrazioni. Esempio Il polinomio x 4 − 2 x 3 + 3x 2 − 5 può essere posto in forma di Hörner mediante le seguenti trasformazioni algebriche: Informatica per la Matematica Giorgio Meini © 2000 x 4 − 2 x 3 + 3x 2 − 5 ⇔ X.3.1.1 ⇔ x( x 3 − 2 x 2 + 3 x) − 5 ⇔ ⇔ ⇔ x( x( x 2 − 2 x + 3)) − 5 ⇔ x( x( x( x − 2) + 3)) − 5 Esiste una forma particolare del polinomio di interpolazione che ne consente l'immediata definizione a partire dalle coordinate dei punti da interpolare. Definito n x − xi x − x0 x − x1 x − xn = ⋅ ⋅ ... ⋅ x j − x0 x j − x1 x j − xn i = 0 x j − xi L j ( x) = ∏ i≠ j in modo che dal prodotto sia escluso il termine j-esimo per il quale si annullerebbe il denominatore si ha che L j (x j ) = x j − x0 x j − x1 x j − xn ⋅ ⋅ ... ⋅ =1 x j − x0 x j − x1 x j − xn e che i ≠ j → L j ( xi ) = 0 perché l'i-esimo termine del prodotto sia annulla avendo come numeratore xi-xi. Lj(x), essendo il prodotto di n binomi di I grado, è un polinomio di grado minore o uguale a n; il polinomio p ( x) = n ∑ y j ⋅ L j ( xi ) = y 0 L0 ( x) + y1 L1 ( x) + ... + y n Ln ( x) j =0 è detto polinomio di interpolazione di Lagrange dei punti (x0; y0), (x1; y1), …, (xn; yn) ed essendo la somma di n polinomi di grado minore o uguale a n è un polinomio di grado non superiore a n. Il "polinomio di interpolazione di Lagrange" è effettivamente una espressione del polinomio di interpolazione dei punti (x0; y0), (x1; y1), …, (xn; yn) infatti p ( xi ) = n ∑ y j ⋅ L j ( xi ) = y 0 L0 ( xi ) + y1 L1 ( xi ) + ... + yi Li ( xi ) + ... + y n Ln ( xi ) = yi j =0 per ogni nodo xi in quanto Lj(xi)=0 per tutti gli indici j≠i e Lj(xi)=1 per j=i. 13 La sommatoria può eventualmente essere esplicitata in ambiente Derive semplificando l'istruzione SUM(i+1,i,1,n). Informatica per la Matematica Giorgio Meini © 2000 Esempio Il polinomio di interpolazione p(x) dei punti (0;-1), (0,5;2), (2;1) e (-1;0) espresso nella forma di Lagrange è il seguente: x − 0,5 x − 2 x + 1 − 1⋅ ⋅ ⋅ + − 0,5 − 2 + 1 x x − 2 x +1 2⋅ ⋅ ⋅ + 0,5 0,5 − 2 0,5 + 1 x x − 0,5 x + 1 1⋅ ⋅ ⋅ + 2 2 − 0,5 2 + 1 x x − 0,5 x − 2 0⋅ ⋅ ⋅ − 1 − 1 − 0,5 − 1 − 2 Il comando Semplifica-Sviluppa di Derive trasforma l'espressione in che è esattamente il polinomio - espresso in una forma più convenzionale! determinato nell'esempio della sezione precedente. La complessità strutturale della forma di Lagrange del polinomio di interpolazione è compensata dalla possibilità di definizione diretta a partire dalle coordinate dei punti da interpolare. Inoltre - pur non essendo particolarmente efficiente sotto il profilo della complessità computazionale - il polinomio di interpolazione di Lagrange si presta a una semplice implementazione algoritmica caratterizzata da due cicli iterativi innestati (uno interno per il calcolo della "produttoria" e uno esterno per il calcolo della sommatoria); la seguente funzione VBA Lagrange(…) calcola il valore p(z) del polinomio assumendo che le ascisse e le corrispondenti ordinate dei punti da interpolare siano presenti nelle celle delle prime n+1 righe rispettivamente delle colonne A e B di un foglio Excel (il grado n del polinomio è invece specificato come costante nel modulo di definizione della funzione): Option Base 0 Const n As Integer = … ' grado del polinomio di interpolazione Informatica per la Matematica Public Function Lagrange(z Dim x(n), y(n) As Single ' Dim i, j As Integer ' Dim sum, prod As Single ' ' Giorgio Meini © 2000 As Single) As Single ascisse/ordinate dei punti da interpolare indici per produttoria/sommatoria variabili per accumulazione dei valori della sommatoria e della produttoria ' ciclo di memorizzazione delle coordinate dei punti da interpolare For i = 0 To n x(i) = Cells(i + 1, 1) y(i) = Cells(i + 1, 2) Next i sum = 0 ' ciclo di calcolo della sommatoria For j = 0 To n prod = y(j) ' ciclo di calcolo della produttoria For i = 0 To n If i <> j Then prod = prod * ((z - x(i)) / (x(j) - x(i))) End If Next i sum = sum + prod Next j Lagrange = sum End Function Esempio Per rappresentare graficamente in ambiente Excel il polinomio di interpolazione dei 4 punti dell'esempio precedente è sufficiente impostare il grado n=3 Const n As Integer = 3 ' grado del polinomio di interpolazione e inserire nell'intervallo di celle A1..B4 le coordinate dei nodi e dei relativi valori La funzione Lagrange(…) può essere impostata e copiata per produrre le ordinate corrispondenti a una serie di ascisse inserite in precedenza Informatica per la Matematica Giorgio Meini © 2000 6 5 4 3 2 1 0 -2 -1 -1 0 1 2 3 -2 -3 -4 Osservazione In ambiente Derive è possibile definire il polinomio di interpolazione di Lagrange di n punti le cui coordinate sono memorizzate in due vettori x e y impiegando la "naturale" notazione matematica14: Dopo aver assegnando ai vettori x e y le coordinate dei punti da interpolare (in questo caso i punti dell'esempio precedente) e definito il grado del polinomio di interpolazione 14 Nella riga di inserimento della finestra "autore" di Derive la definizione del polinomio di interpolazione di Lagrange è stata digitata impiegando le istruzioni SUM e PRODUCT: L(j,z):=PRODUCT(IF(j≠i,(z-x↓i)/(x↓j-x↓i),1),i,1,n+1) P(z):=SUM(y↓j⋅L(j,z),j,1,n+1) Il ricorso alla variabile z è reso necessario dall'esistenza del vettore x dei nodi; la modifica dei valori iniziali e finali degli indici della sommatoria e della produttoria è motivato dal fatto che il primo elemento di un vettore v in Derive è denotato da v↓1; infine l'istruzione condizionale IF consente di escludere dai termini della produttoria - assegnando il valore neutro 1 - il termine per cui i=j. Informatica per la Matematica Giorgio Meini © 2000 la semplificazione di p(z) produce il polinomio di interpolazione che può essere espanso con il comando Semplifica-sviluppa I singoli valori del polinomio di interpolazione possono essere facilmente calcolati impiegando il comando di semplificazione (o di approssimazione): X.3.1.2 Se le ordinate dei punti da interpolare sono i valori y0, y1, …, yn assunti da una funzione f(x) in corrispondenza dei nodi x0, x1, …, xn l'errore commesso approssimando i valori della funzione con i valori del polinomio di interpolazione p(x) è E ( x) = f ( x) − p ( x) ; ovviamente in corrispondenza dei nodi si ha che E(xi)=0. Considerando l'intervallo [a;b] con a e b rispettivamente valore minimo e massimo dei nodi di interpolazione xi della funzione f(x) il seguente teorema consente di valutare l'errore E(x) per a<x<b. Teorema (errore dell'interpolazione polinomiale) Se f(x) è derivabile con continuità n+1 volte nell'intervallo [a;b] dove a e b sono rispettivamente i valori minimo e massimo dei nodi di interpolazione x0, x1, …, xn allora f ( n +1) (ε ) n f ( n+1) (ε ) E ( x) = ⋅ ∏ ( x − xi ) = ⋅ ( x − x 0 ) ⋅ ( x − x1 ) ⋅ ... ⋅ ( x − x n ) a < ε < b (n + 1)! i =0 (n + 1)! Si definiscono per a<x<b e x≠xi (i=0, 1, …, n) la funzione Informatica per la Matematica Giorgio Meini © 2000 E ( x) g ( x) = n = ∏ ( x − xi ) E ( x) ( x − x 0 ) ⋅ ( x − x1 ) ⋅ ... ⋅ ( x − x n ) i =0 e la funzione di variabile t: n h(t ) = E (t ) − g ( x) ⋅ ∏ (t − xi ) = E (t ) − g ( x) ⋅ (t − x 0 ) ⋅ (t − x1 ) ⋅ ... ⋅ (t − x n ) = i =0 = E (t ) − E ( x) ⋅ (t − x 0 ) ⋅ (t − x1 ) ⋅ ... ⋅ (t − x n ) = ( x − x 0 ) ⋅ ( x − x1 ) ⋅ ... ⋅ ( x − x n ) = [ f (t ) − p(t )] − f ( x) − p ( x) ⋅ (t − x 0 ) ⋅ (t − x1 ) ⋅ ... ⋅ (t − x n ) ( x − x 0 ) ⋅ ( x − x1 ) ⋅ ... ⋅ ( x − x n ) La funzione h(t) si annulla negli n+2 punti x0, x1, …, xn (perché E(xi)=0 e uno dei termini della produttoria è nullo) e x (perché h(x)=E(x)-E(x)); inoltre la funzione h(t) è derivabile n+1 volte perché per ipotesi lo è la funzione f(x). Per il teorema di Rolle la funzione h'(t) si annulla in almeno n+1 punti dell'intervallo [a;b], la funzione h"(t) si annulla in almeno n punti dell'intervallo [a;b] e così via fino alla funzione h(n+1)(t) che si annulla in almeno un punto (ε) dell'intervallo [a;b]15: 0 = h ( n+1) (ε ) = E ( n+1) (ε ) − g ( x) ⋅ (n + 1)! = [ ] = f ( n+1) (ε ) − p ( n +1) (ε ) − g ( x) ⋅ (n + 1)! Dato che il polinomio p(x) di grado n ha derivata (n+1)-esima nulla si ha f ( n+1) (ε ) − g ( x) ⋅ (n + 1)! = 0 da cui g ( x) = f ( n+1) (ε ) (n + 1)! e per a<x<b e x≠xi (i=0, 1, …, n): E ( x) = f ( n+1) (ε ) ⋅ ( x − x 0 ) ⋅ ( x − x1 ) ⋅ ... ⋅ ( x − x n ) (n + 1)! Per x=xi (i=0, 1, …, n) E(xi)=0 e contemporaneamente si annulla uno dei termini della produttoria, di conseguenza la tesi è dimostrata per a<x<b. 15 È possibile dimostrare che la derivata del polinomio di grado n+1 (x-x0)(x-x1)…(x-xn) è (n+1)!, indipendentemente dai valori x0, x1, …, xn. Informatica per la Matematica Giorgio Meini © 2000 Osservazione Dal teorema precedente non è difficile dedurre una maggiorazione dell'errore assoluto commesso valutando nell'intervallo [a;b] il polinomio di interpolazione p(x) calcolato nei nodi x0, x1, …, xn in luogo della funzione f(x): E ( x) ≤ M n +1 ⋅ ( x − x 0 ) ⋅ ( x − x1 ) ⋅ ... ⋅ ( x − x n ) (n + 1)! dove M n+1 = max f ( n+1) ( x) a < x <b Esempio La retta di equazione y = π x passante per i punti (0;0) e ;1 consente di π 2 2 approssimare grossolanamente i valori del seno di angoli compresi tra 0 e π 2 radianti (interpolazione lineare) Il grado del polinomio di interpolazione è n=1 e la derivata seconda della funzione f(x) π = sen(x) è f"(x) = -sen(x) il cui massimo valore assoluto nell'intervallo 0; è 1; 2 perciò E ( x) ≤ Approssimando sen(1) con 1 π 1 − ≅ 0,285 16. 2 2 16 2 π 1 π 1 π ⋅ x x − = x 2 − x . 2 2 2 2 ⋅ 1 ≅ 0,6366 si commette un errore E inferiore a Essendo sin(1)=0,84147… l'errore reale è circa 0,20487. Informatica per la Matematica Giorgio Meini © 2000 Per calcolare una maggiorazione dell'errore commesso con 0 < x < determinare il massimo valore assunto dalla quantità π 2 è sufficiente 1 2 π x − x nell'intervallo 2 2 π 0; 2 ; tracciandone il grafico in ambiente Derive è possibile osservare che assume un massimo relativo all'interno dell'intervallo È possibile determinare l'ascissa del punto di massimo in corrispondenza dello zero π della derivata prima della quantità x 2 − x : 2 In conclusione per 0 < x < π si ha che E ( x) ≤ 2 ovviamente di un errore inaccettabile). 1 π π ⋅ = ≅ 0,3927 (si tratta 2 4 8 Esempio Approssimando la funzione f(x)=ex nell'intervallo [-1;1] con un polinomio di IV grado è possibile scegliere come nodi i punti "equidistanti": 1 1 x 0 = −1, x1 = − , x 2 = 0, x3 = , x 4 = 1 . 2 2 Dato che fV(x)=ex è crescente in [-1;1] si ha M5 = e1 = e; di conseguenza: E ( x) ≤ ( ) 1 1 1 e e ⋅ ( x + 1) x + x x − ( x − 1) = ⋅ x x2 −1 x2 − 4 2 2 120 5! Informatica per la Matematica Giorgio Meini © 2000 Il grafico seguente è stato realizzato con Derive e rappresenta la maggiorazione dell'errore E al variare di x: Nell'intervallo di interpolazione [-1;1] l'errore commesso è minimo, ma cresce rapidamente nel caso di "estrapolazione" di valori esterni all'intervallo. Osservazione Lo zoom verticale del grafico della maggiorazione di E(x) relativo all'esempio precedente mostra il tipico comportamento dell'errore che - nel caso di nodi equidistanti - è minore al centro dell'intervallo di interpolazione e maggiore in prossimità degli estremi: Esempio Per approssimare la funzione "gaussiana" della distribuzione normale di probabilità y= 1 2π x2 e 2 − nell'intervallo [-3;3] è possibile scegliere come nodi i punti equidistanti: x 0 = −3, x1 = −2, x 2 = −1, x3 = 0, x 4 = 1, x5 = 2, x 6 = 3 . Dopo aver impostato il grado del polinomio di interpolazione Const n As Integer = 6 ' grado del polinomio di interpolazione ed inserito nell'intervallo di celle A1..B7 di un foglio Excel i nodi di interpolazione e le relative ordinate Informatica per la Matematica Giorgio Meini © 2000 è possibile impiegare la funzione VBA Lagrange(…) per calcolare il valore assunto dal polinomio di interpolazione in un qualsiasi punto dell'intervallo. La seguente tabulazione del polinomio di interpolazione, della funzione di Gauss e della differenza dei rispettivi valori consente di valutare l'andamento dell'errore commesso all'interno dell'intervallo di interpolazione: Informatica per la Matematica Giorgio Meini © 2000 Il confronto tra i grafici del polinomio di interpolazione e della funzione gaussiana conferma l'osservazione per cui in caso di nodi equidistanti l'errore è maggiore in prossimità dagli estremi dell'intervallo di interpolazione (escludendo gli estremi stessi nei quali l'errore, come in tutti i nodi di interpolazione, è nullo) e minore al centro dell'intervallo: 0,5 0,4 0,3 0,2 0,1 0 -3 -2 -1 0 1 2 3 L'analisi è ulteriormente confermata dall'andamento della funzione di errore E(x) stabilito empiricamente graficando le differenze dei valori f(x) - p(x): 0,01 0 -3 -2 -1 -0,01 0 1 2 3 -0,02 -0,03 -0,04 -0,05 X.3.2 La regressione lineare X.3.2.0 In ambiente Excel è possibile "interpolare" dati statistici o sperimentali rappresentati in un grafico di tipo X-Y ("dispersione") impiegando il comando Aggiungi-linea-ditendenza del menù Grafico. Informatica per la Matematica Giorgio Meini © 2000 Esempio Nel seguente foglio di lavoro Excel nelle celle della colonna A sono riportate le altezze (espresse in cm) di 20 studenti e nella colonna B i relativi pesi (espressi in Kg): Il comando Aggiungi-linea-di-tendenza applicato al grafico X-Y dei dati visualizza la "retta17 di regressione" e, specificandone l'opzione, la relativa equazione cartesiana: 90 peso (Kg) 80 70 60 50 40 150 160 170 altezza (cm) 17 180 190 y = 0,94x - 95,075 R2 = 0,7349 Excel consente di scegliere una "linea di tendenza" tra i seguenti tipi: lineare, logaritmica, polinomiale, potenza, esponenziale e media mobile. Informatica per la Matematica X.3.2.1 Giorgio Meini © 2000 La retta di regressione y = mx + q visualizzata da Excel è un modello lineare per la sintesi statistica delle coppie di dati (x1;y1), (x2;y2), …, (xn;yn) e viene determinata in modo da avere le seguenti proprietà: è vincolata al "baricentro" dei dati rappresentato dal punto di coordinate (x; y ) dove x e y rappresentano rispettivamente la media dei valori x1, x2, …, xn e la media dei valori y1, y2, …, yn: y = mx + q ; rende minima la somma degli scarti quadratici tra i valori y i e le ordinate ~ y i = mxi + q della retta di regressione stessa (è questo il motivo per cui la retta di regressione è spesso denominata retta dei minimi quadrati): n ∑ [ yi − (mxi + q)]2 . min i =1 Ricavando il termine noto dall'equazione che esprime la prima proprietà q = y − mx e sostituendolo nell'espressione della seconda proprietà si ottiene min n n i =1 i =1 ∑ [ yi − (mxi + y − mx )]2 = ∑ [ yi − y − m( xi − x )]2 che sviluppando il quadrato diviene min n n n i =1 i =1 i =1 ∑ ( yi − y ) 2 + m 2 ∑ ( xi − x ) 2 − 2m∑ ( yi − y )( xi − x ) Posti n a = ∑ ( xi − x ) 2 i =1 n b = −2∑ ( y i − y )( xi − x ) i =1 n c = ∑ ( yi − y ) 2 i =1 rispetto al parametro m si ha una parabola con concavità rivolta verso l'alto min am 2 + bm + c Informatica per la Matematica Giorgio Meini © 2000 il cui valore minimo coincide con il vertice: n ∑ ( yi − y )( xi − x ) b i =1 m=− = n 2a ∑ ( xi − x ) 2 i =1 Esempio Per determinare i parametri m e q della retta dei minimi quadrati relativa ai punti (0;1), (1;1), (1;2) e (3;2) si calcolano prima di tutto le medie x= 0 +1+1+ 3 5 = 4 4 y= 1+1+ 2 + 2 3 = . 4 2 e Il coefficiente angolare m è dato da m= 1 − 3 − 2 5 + 1 − 4 − 2 3 1 − 2 5 + 2 − 4 2 5 5 1 − + 1 − 4 4 3 1 − 2 5 + 2 − 4 2 5 + 3 − 4 5 4 2 3 3 − 2 5 4 = 6 19 e il termine noto q si ricava facilmente q = y − mx = 3 6 5 21 − ⋅ = 2 19 4 19 Il seguente grafico realizzato in ambiente Derive visualizza i punti (0;1), (1;1), (1;2) e 6 21 (3;2) e la retta y = x + : 19 19 Informatica per la Matematica Giorgio Meini © 2000 Avendo preventivamente inserito le coordinate x e y degli n punti nelle celle delle prime n righe delle colonne A e B di un foglio Excel la seguente funzione VBA restituisce l'ordinata della retta di regressione in corrispondenza del valore passato come argomento18 (il numero n dei punti è invece una costante definita nel modulo in cui è codificata la funzione): Option Base 1 Const n As Integer = … ' numero dei punti Public Function Regressione(val As Single) As Single Dim x(n), y(n) As Single ' coordinate dei punti Dim xm, ym As Single ' valori medi Dim sxy, sx2 As Single ' variabili-accumulatori per sommatorie Dim i As Integer ' indice Dim m, q As Single ' parametri della retta di regressione ' ciclo di memorizzazione dei dati e di calcolo dei valori medi mx = 0 my = 0 For i = 1 To n x(i) = Cells(i, 1) mx = mx + x(i) y(i) = Cells(i, 2) my = my + y(i) Next i mx = mx / n my = my / n ' ciclo di calcolo delle sommatorie sxy = 0 sx2 = 0 For i = 1 To n sxy = sxy + (x(i) - mx) * (y(i) - my) sx2 = sx2 + (x(i) - mx) ^ 2 Next i ' determinazione dei parametri della retta m = sxy / sx2 q = my - m * mx ' calcolo dell'ordinata corrispondente all'argomento Regressione = m * val + q End Function Esempio Nel caso dei dati altezza/peso dell'esempio precedente la funzione Regressione(…) può essere impiegata - dopo aver correttamente impostato il numero n dei punti nel codice VBA - per stimare con il metodo dei minimi quadrati i pesi corrispondenti alle altezze: 18 L'ambiente di calcolo Excel comprende la funzione predefinita TENDENZA(…) avente la stessa funzionalità. Informatica per la Matematica Giorgio Meini © 2000 90 peso (Kg) 80 70 60 50 40 150 160 170 180 190 altezza (cm) Ma la funzione di "funzione interpolante" della retta di regressione risulta più evidente nel caso in cui l'argomento in base al quale calcolare la stima non appartenga all'insieme dei valori originali: Informatica per la Matematica Giorgio Meini © 2000 Osservazione La quantità n ∑ [(mxi + q) − y ]2 R 2 = i =1 n ∑ [ yi − y ]2 i =1 viene spesso impiegata come indice di "adattamento" della retta di regressione dei minimi quadrati rispetto ai dati originali; R2 è ovviamente positivo ed è uguale a 1 nel caso che i punti (x1;y1), (x2;y2), …, (xn;yn) siano allineati: in questo caso infatti la retta di regressione coincide con la retta passante per gli n punti e yi=mxi+q per i=1, 2, …, n. Essendo possibile dimostrare che questo valore è il massimo che R2 può assumere si ha 0 ≤ R2 ≤1 con R2 che assume valori prossimi a 1 nel caso di buon adattamento della retta di regressione alla distribuzione dei dati e valori prossimi a 0 nel caso di elevata dispersione dei dati rispetto alla retta dei minimi quadrati. Esempio Tra le opzioni del comando Grafico/Aggiungi-linea-di-tendenza dell'ambiente Excel è possibile impostare la visualizzazione del valore R2. I due esempi che seguono mostrano come il diverso grado di adattamento della retta di regressione ai dati si rifletta in diversi valori di R2: 5 5 4 4 3 3 y = 0,54x + 0,28 R2 = 0,3742 2 2 1 y = 0,996x + 0,008 R2 = 0,9996 1 0 0 0 1 2 3 4 5 0 -1 1 2 3 4 5 Informatica per la Matematica X.3.3 Giorgio Meini © 2000 Sintesi Il problema dell'interpolazione polinomiale consiste nel determinare - noti n+1 punti di coordinate (x0;y0), (x1;y1), …, (xn;yn) - il polinomio p(x) di grado non superiore a n che assume in corrispondenza dei "nodi" x0, x1, …, xn i valori p(x0)=y0, p(x1)=y1, …, p(xn)=yn; n n −1 + ... + a n −1 x + a n i coefficienti a0, a1, …, an del polinomio p ( x) = a 0 x + a1 x , che esiste ed è unico se i nodi di interpolazione sono tutti distinti, possono essere determinati risolvendo il sistema lineare ( x n )a + ( x n−1 )a 0 1 0n 0 n −1 ( x1 )a 0 + ( x1 )a1 ( x n )a + ( x n−1 )a n 0 1 n + ... + ( x 0 )a n−1 + a n = y 0 + ... + ( x1 )a n−1 + a n = y1 ... + ... + ( x n )a n −1 + a n = y n il polinomio di interpolazione di Lagrange n x− x i p( x) = ∑ y j ⋅ ∏ i=0 x j − xi j = 0 i≠ j n è impiegato nel caso ricorrente che si debbano calcolare valori p(x) a partire delle coordinate dei punti (x0;y0), (x1;y1), …, (xn;yn); se le ordinate dei punti da interpolare sono i valori y0, y1, …, yn assunti da una funzione f(x) in corrispondenza dei nodi x0, x1, …, xn l'errore commesso approssimando i valori della funzione con i valori del polinomio di interpolazione p(x) è E ( x) = f ( x) − p ( x) e una sua maggiorazione in valore assoluto nell'intervallo [a;b] - con a e b rispettivamente valori minimo e massimo dei nodi di interpolazione - è data da max f ( n +1) ( x) a < x <b (n + 1)! ⋅ n ∏ ( x − xi ) i =1 i parametri della retta di regressione y=mx+q relativa ai punti (x1;y1), (x2;y2), …, (xn;yn) Informatica per la Matematica Giorgio Meini © 2000 n ∑ ( yi − y )( xi − x ) m = i =1 n ∑ ( xi − x ) 2 i =1 e q = y − mx dove 1 n x = ⋅ ∑ xi n i =1 e 1 n y = ⋅ ∑ yi n i =1 sono determinati in modo da minimizzare la somma degli scarti quadratici tra i valori y i e le ordinate ~ y i = mxi + q (metodo dei minimi quadrati); Informatica per la Matematica X.3.4 Giorgio Meini © 2000 Esperimenti 1. Determinare in ambiente Derive i coefficienti del polinomio di interpolazione dei seguenti punti: a) b) c) d) (-1; 6), (1; 0), (2; 3); (-2; 5), (0; 1), (1; 0,5), (2; 5); (0,25; -0,12), (-1,32; 0,68), (0,98; -1,04) (-3; 32), (-1; 6), (2; -3), (3; 2). Rappresentare graficamente i punti e il polinomio di interpolazione individuato. 2. Determinare in ambiente Derive i coefficienti del polinomio di interpolazione delle seguenti funzioni calcolate in corrispondenza dei nodi indicati: a) cos( x) x0 = − 1 x1 = 0 x2 = 1 2 2 b) e x x0 = −1 x1 = 0 x2 = 1 c) ln( x) x0 = 1 x1 = 1 x2 = e x3 = e 2 e d) tg ( x) x0 = − π 4 x1 = − π 3 x2 = 0 x3 = π 3 x4 = π 4 Rappresentare graficamente la funzione e il polinomio di interpolazione nell'intervallo [a; b] con a e b rispettivamente nodo minimo e massimo. 3. Impiegare le funzionalità algebriche dell'ambiente Derive per trasformare i seguenti polinomi in forma di Hörner: a) 2 x 3 − 3x 2 + x − 1 ; 2 b) x 5 − 2 x 4 + 4 x 2 − x + 1 ; c) 0,2 x 4 − 1,4 x 3 − 0,8 x 2 − 2,2 x + 2,8 . 4. # Scrivere una funzione VBA che calcoli secondo lo schema di Hörner il valore di un polinomio di grado n in corrispondenza dell'argomento della funzione nel caso che i coefficienti siano memorizzati nelle prime n+1 celle della colonna A di un foglio di lavoro Excel. 5. Scrivere il polinomio di interpolazione in forma di Lagrange dei punti dell'esercizio 1. 6. # Determinare la complessità computazionale della funzione VBA Lagrange(…) che valuta in un punto il polinomio di interpolazione. 7. Tabulare con un passo di 0,1 e rappresentare graficamente in ambiente Excel le funzioni f(x) dell'esercizio 2 limitatamente agli intervalli indicati; impiegare la funzione VBA Lagrange(…) relativamente ai nodi indicati nell'esercizio 2 per Informatica per la Matematica Giorgio Meini © 2000 tabulare e rappresentare graficamente il polinomio di interpolazione p(x). Stimare graficamente l'errore massimo commesso nel valutare p(x) in luogo di f(x). Studiare graficamente l'andamento dell'errore nell'intervallo di interpolazione in ciascun caso. 8. Calcolare la maggiorazione teorica dell'errore assoluto commesso impiegando il polinomio di interpolazione in luogo delle funzioni dell'esercizio 2 limitatamente agli intervalli indicati. Confrontare i risultati ottenuti con le stime calcolate nell'esercizio precedente. 9. Completare la seguente "tavola dei logaritmi" impiegando l'interpolazione lineare tra due valori noti successivi: x 0,9 0,95 1 1,5 2 2,5 3 Log10x -0,046 0 0,301 0,477 Completare la precedente tabella calcolando i valori assunti dal polinomio di III grado ottenuto interpolando i 4 punti di coordinate note. In entrambi i casi: maggiorare l'errore assoluto commesso e determinare l'errore effettivo calcolando i logaritmi con una calcolatrice scientifica. 10. Scrivere due funzioni VBA che calcolino rispettivamente il coefficiente angolare m e il termine noto q della retta di regressione dei minimi quadrati ipotizzando che le coordinate dei punti siano memorizzate nelle prime n celle delle colonne A e B di un foglio di lavoro Excel. Verificare la corretta implementazione delle funzioni confrontandone in alcuni casi i risultati con le indicazioni opzionali fornite dal comando Grafico/Aggiungi-linea-di-tendenza di Excel. 11. Scrivere una funzione VBA che calcoli l'indice R2 relativo alla retta di regressione dei minimi quadrati nelle ipotesi previste per l'esercizio precedente. 12. In ambiente Excel rappresentare graficamente la seguente "serie temporale" e la relativa retta di regressione determinandone i punti mediante la funzione VBA Regressione(…): Informatica per la Matematica Giorgio Meini © 2000 ANNO 1995 1996 1997 1998 1999 Produzione di frumento della Lombardia (milioni di staie) 1019 988 1306 1173 1299 Impiegare la funzione VBA Regressione(…) per "estrapolare" la produzione lombarda di frumento degli anni 2000 e 2001. Valutare l'attendibilità della stima in base al valore dell'indice R2. 13. # Determinare analiticamente il coefficiente angolare m della retta dei minimi quadrati y=mx nel caso che il vincolo rappresentato dal "baricentro" della distribuzione - il punto ( x ; y ) - sia sostituito dal vincolo rappresentato dall'origine (0;0) del sistema di riferimento. Informatica per la Matematica Giorgio Meini © 2000 X.4 Derivazione e integrazione numerica X.4.0 Derivazione e integrazione simbolica in Derive I comandi Derivata e Integrale del menu Calcola dell'ambiente Derive consentono di determinare con facilità la derivata simbolica e l'integrale indefinito di una funzione, anche in presenza di parametri. Esempio Per determinare la derivata della funzione f ( x) = ( senx + cos x)e − x in ambiente Derive è sufficiente semplificare il risultato fornito dal comando Calcola/Derivata: Il seguente grafico rappresenta in blu la funzione f(x) e in rosso la derivata f'(x): Esempio La funzione esponenziale negativa p( x) = ke − kx x≥0 Informatica per la Matematica Giorgio Meini © 2000 con parametro k positivo è una funzione di densità della probabilità; infatti non è difficile in ambiente Derive dimostrare che +∞ p ( x)dx = 1 impiegando il comando ∫ 0 19 Calcola-Integrale : Per determinare la funzione di ripartizione della probabilità è sufficiente utilizzare il comando Calcola/Integrale specificando l'opzione Indefinito: Perché si tratti di una funzione di ripartizione della probabilità si deve avere P (0) = 0 lim P ( x) = 1 ; e x →+∞ dato che − e −k0 = −1 e lim − e − kx = 0 x →+∞ si avrà P ( x) = 1 − e − kx . Lo stesso risultato si sarebbe ottenuto impostando a 1 la Costante della finestra Calcola/Integrale che Derive imposta automaticamente al valore 0. Derive impiega regole formali di trasformazione per la derivazione simbolica e tecniche "euristiche" per la determinazione delle funzioni primitive; di conseguenza l'ambiente di calcolo è sempre in grado di fornire la derivata di una funzione, ma può fallire nel computare un integrale particolarmente complesso. Inoltre l'operatore funzionale di integrazione indefinita non è chiuso rispetto all'insieme delle classi di funzioni normalmente oggetto di studio scolastico (razionali, trigonometriche, esponenziali, logaritmiche, …): per alcune funzioni integrabili non è quindi possibile determinare analiticamente la funzione primitiva. 19 in ambiente Derive il dominio di una variabile viene definito con il comando Dichiara/Dominiovariabile Informatica per la Matematica Giorgio Meini © 2000 Esempio 1 La funzione di Gauss f ( x) = 2π e − x2 2 ha una primitiva F(x) non esprimibile in termini delle usuali funzioni razionali e trascendenti; Derive introduce nella funzione primitiva la funzione speciale ERF (Error Function): X.4.1 Derivazione numerica X.4.1.0 La semplicità con cui è possibile determinare la derivata f'(x) di una funzione f(x) disponendo di un ambiente di calcolo simbolico come Derive limita la necessità di ricorrere a formule di derivazione numerica al solo contesto della programmazione, o al caso in cui della funzione f(x) si conosca solo una tabulazione dei valori. Avendo ad esempio una funzione VBA fun(…) che restituisce il valore assunto dalla funzione f(x) nel punto fornito come argomento, può essere talvolta utile disporre di una funzione der(…) che determini il valore della funzione derivata f'(x) calcolato in un punto qualsiasi20; in questo caso la derivata della funzione f(x) può essere approssimata con il rapporto incrementale calcolato in corrispondenza di un valore predefinito dell'incremento h21: La derivata f'(x0) nel punto x0 della funzione f(x) è formalmente definita come: lim h →0 f ( x0 + h) − f ( x0 ) h f ' ( x) ≅ 20 f ( x 0 + h) − f ( x 0 ) h questo problema si presenta ad esempio nell'implementazione come funzione VBA della formula ricorsiva di Newton per l'approssimazione degli zeri delle funzioni 21 con questa soluzione la derivata della funzione f(x) nel punto x0 viene approssimata con il coefficiente angolare della retta passante per i punti (x0;f(x0)) e (x0+h;f(x0+h)) Informatica per la Matematica X.4.1.1 Giorgio Meini © 2000 Non è difficile scrivere una funzione VBA der(…) che implementa la formula di derivazione approssimata: Private Function fun(x As Single) As Single fun = … End Function Private Function der(x As Single) As Single Const h As Single = 0.001 der = (fun(x+h) - fun(x)) / h End Function Esempio Per studiare numericamente la derivata f'(x) della funzione f(x)=x2 si definisce la funzione fun(…) in ambiente VBA Private Function fun(x As Single) As Single fun = x^2 End Function e si impostano nella celle della colonna A di un foglio di lavoro Excel i valori dei punti di interesse; si copiano poi nelle celle delle colonne B e C le formule che calcolano i valori della funzione e della derivata numerica e nelle celle delle colonne D ed E le formule che restituiscono i valori della funzione derivata f'(x)=2x e dell'errore commesso: Informatica per la Matematica Giorgio Meini © 2000 Il seguente grafico mostra la buona precisione dei valori forniti dalla formula di derivazione numerica: 10 8 6 4 funzione 2 derivata numerica 0 -4 -3 -2 -1 -2 0 1 2 3 4 funzione derivata -4 -6 -8 Scorrendo i valori della colonna E si nota che il massimo errore commesso è circa 103 ; allo scopo di migliorare ulteriormente la precisione si può impostare il passo h della formula di derivazione approssimata al valore 10-6 in considerazione del fatto che nella definizione della derivata il valore di h viene fatto tendere a 0: Private Function der(x As Single) As Single Const h As Single = 0.000001 der = (fun(x+h) - fun(x)) / h End Function Dopo avere inserito nuovamente le formule della colonna C per rendere effettiva la modifica introdotta si nota che, contrariamente alle aspettative, l'errore commesso cresce visibilmente: Informatica per la Matematica Giorgio Meini © 2000 La riduzione del passo h di derivazione effettuata nell'esempio precedente ha come conseguenza una diminuzione dell'errore analitico della formula di approssimazione numerica, di conseguenza la crescita dell'errore complessivo osservata deve essere imputata all'errore algoritmico causato dall'aritmetica finita dell'ambiente di calcolo Excel. Per studiare l'andamento dell'errore al variare del passo h la funzione di derivazione numerica può essere modificata al fine di passare come secondo parametro il valore di h: Public Function der(x As Single, h As Single) As Single der = (fun(x + h) - fun(x)) / h End Function Ovviamente l'andamento quantitativo dell'errore al variare del passo h dipende sia dalla particolare funzione f(x) che dallo specifico punto x0; l'esempio che segue illustra comunque un comportamento tipico sotto l'aspetto qualitativo. Esempio Nelle celle della colonna A di un foglio di lavoro Excel si scrivono le formule che realizzano una successione di valori di h decrescenti per riga secondo le potenze negative di 10; nelle celle della colonna B si memorizza un unico valore x0 di interesse, mentre nelle celle delle colonne C e D si inseriscono rispettivamente le formule per il calcolo della funzione f(x) e della sua derivata f'(x). Infine nelle celle della colonna E si copiano le formule per l'approssimazione numerica della derivata e per la determinazione del valore assoluto dell'errore commesso. Informatica per la Matematica Giorgio Meini © 2000 Il grafico che segue - dove i valori del passo h sono riportati in scala logaritmica inversa - documenta l'andamento dell'errore complessivo al variare di h: Informatica per la Matematica Giorgio Meini © 2000 0,05 0,04 0,03 0,02 0,01 0 1 0,1 0,01 0,001 0,0001 0,00001 0,000001 L'errore complessivo commesso assume valore minimo in corrispondenza di un passo di derivazione numerica h dell'ordine di 10-4. Nell'esempio precedente la riduzione dell'errore analitico al decrescere dell'ampiezza di h comporta una iniziale diminuzione dell'errore complessivo; questa tendenza si inverte a partire dal valore di h per cui l'errore algoritmico dovuto al calcolo in aritmetica finita della divisione tra due valori numerici prossimi a zero non diviene preponderante, fino a fornire un risultato nullo completamente errato. Il grafico che segue, dove i valori del passo di derivazione numerica h decrescono da sinistra verso destra, riassume qualitativamente questa considerazione: err. analitico err. algoritmico err. complessivo h Per ottimizzare la precisione della funzione der(…) occorre individuare un valore del passo h corrispondente al punto minimo dell'andamento dell'errore complessivo tenendo comunque presente che tale valore dipende dalla funzione f(x) e dal punto di calcolo x0. Informatica per la Matematica Giorgio Meini © 2000 Osservazione L'errore algoritmico delle funzioni VBA può essere ridotto aumentando la precisione di calcolo passando da variabili di tipo Single a variabili di tipo Double: Public Function fun(x As Double) As Double fun = Sin(x) End Function Public Function der(x As Double, h As Double) As Double der = (fun(x + h) - fun(x)) / h End Function Ricalcolando l'esempio precedente impiegando questa nuova implementazione delle funzioni VBA si ottiene un significativo aumento della precisione che consente di fissare il valore del passo h a circa 10-8: 0,05 0,04 0,03 0,02 0,01 0 1 0,1 0,01 0,001 1E-04 1E-05 1E-06 1E-07 1E-08 1E-09 1E-10 1E-11 1E-12 1E-13 1E-14 1E-15 Informatica per la Matematica X.4.1.2 Giorgio Meini © 2000 La formula di derivazione numerica proposta approssima il coefficiente angolare della retta tangente al grafico della funzione f(x) nel punto (x0;f(x0)) con il coefficiente angolare della retta passante per i punti (x0;f(x0)) e (x0+h;f(x0+h)): la derivata f'(x0) viene di fatto determinata derivando nel punto x0 la retta di interpolazione (polinomio di I grado) della funzione f(x) condotta per i nodi x0 e x0+h. x0 x0+h Questa osservazione suggerisce un modo per costruire una formula di derivazione numerica maggiormente precisa: impiegare come valore della derivata f'(x0) la derivata calcolata nel punto x0 della parabola di interpolazione (polinomio di II grado) della funzione f(x) per i nodi x0-h, x0 e x0+h, le cui ordinate corrispondenti sono f(x0-h), f(x0) e f(x0+h). La determinazione del polinomio di interpolazione in forma di Lagrange può essere effettuata in ambiente Derive22: La semplificazione di p(z) restituisce l'espressione del polinomio di interpolazione 22 la dichiarazione della funzione f(t) e l'impostazione dell'opzione di inserimento Parola consentono di impiegare una notazione simile a quella usuale; il ricorso ai nomi di variabile z e t è reso necessario dalle regole sintattiche dell'ambiente Derive Informatica per la Matematica Giorgio Meini © 2000 la cui derivata calcolata nel punto z=x0 con il comando Semplifica/Fattorizza diviene che rappresenta la nuova formula di derivazione numerica approssimata: f ' ( x0 ) ≅ f ( x 0 + h) − f ( x 0 − h) 2h È possibile interpretare geometricamente questa formula: esprime analiticamente il valore del coefficiente angolare della retta passante per i punti (x0-h;f(x0-h)) e (x0+h;f(x0+h)). f(x) x0-h x0 x0+h Esempio Dopo aver ridefinito le funzioni fun(…)23 e der(…) Public Function fun(x As Double) As Double fun = Log(x) End Function Public Function der(x As Double, h As Double) As Double der = (fun(x + h) - fun(x - h)) / (2 * h) End Function è possibile impiegare l'ambiente di calcolo Excel per indagare l'andamento dell'errore commesso impiegando la formula di derivazione numerica con passo h=10-6 in luogo 23 nel linguaggio VBA la funzione Log(…) restituisce il logaritmo naturale dell'argomento Informatica per la Matematica Giorgio Meini © 2000 della funzione derivata24: I valori della derivata approssimati con la formula di derivazione numerica (colonna D) corrispondono ai valori della funzione derivata calcolati esplicitamente (colonna C): 2 1 ln(x) 1/x derivata numerica 0 0 1 2 3 4 la derivata della funzione f ( x) = ln( x) è f ' ( x) = 5 -1 24 1 x Informatica per la Matematica Lo sviluppo in serie di Taylor della funzione f(x) nel punto x0 è formalmente definito come: Osservazione Le formule di derivazione approssimata possono essere ricavate dallo sviluppo in serie di Taylor della funzione f(x) nel punto x025: ( x − x0 ) 2 f ( x) = f ( x 0 ) + ( x − x 0 ) ⋅ f ' ( x 0 ) + ⋅ f " ( x 0 ) + ... 2 f ( x0 ) + ∞ 1 ∑ n!( x − x ) 0 n ⋅ f ( n ) ( x0 ) Giorgio Meini © 2000 Arrestando lo sviluppo di f(x+h) al secondo termine si ha n =1 dove f ( n ) ( x0 ) è la derivata n-esima della funzione f(x) calcolata nel punto x0 f ( x + h) = f ( x 0 ) + ( x + h − x 0 ) ⋅ f ' ( x 0 ) + ... da cui si ricava f ' ( x0 ) = f ( x + h) − f ( x 0 ) x + h − x0 che per x=x0 diviene la formula di derivazione approssimata del "I ordine": f ' ( x0 ) ≅ f ( x 0 + h) − f ( x 0 ) h Arrestando gli sviluppi di f(x+h) e di f(x-h) al terzo termine si ha ( x + h − x0 ) 2 f ( x + h) = f ( x 0 ) + ( x + h − x 0 ) ⋅ f ' ( x 0 ) + ⋅ f " ( x 0 ) + ... 2 e f ( x − h) = f ( x 0 ) + ( x − h − x 0 ) ⋅ f ' ( x 0 ) + ( x − h − x0 ) 2 ⋅ f " ( x 0 ) + ... 2 da cui ponendo x=x0 e sottraendo membro a membro si ricava f ( x 0 + h) − f ( x 0 − h ) = 2 h ⋅ f ' ( x 0 ) che,esplicitando f'(x0) diviene la formula di derivazione approssimata del "II ordine": f ' ( x0 ) ≅ 25 f ( x 0 + h) − f ( x 0 − h) 2h lo sviluppo in serie di Taylor della funzione f(x) nel punto x0 consente di determinare una maggiorazione dell'errore analitico commesso approssimando la funzione derivata f'(x) con il valore fornito delle formule di derivazione numerica Informatica per la Matematica Giorgio Meini © 2000 X.4.2 Integrazione numerica X.4.2.0 L'integrabilità di una funzione continua f(x) è garantita per ogni intervallo [a;b]; inoltre il teorema fondamentale consente di determinare il valore dell'integrale come differenza dei valori assunti da una primitiva di f(x) negli estremi dell'intervallo di integrazione: b ∫ f ( x)dx = F (b) − F (a) a dove F ( x) = ∫ f ( x)dx . L'individuazione di una funzione primitiva F(x) può rivelarsi operazione complessa anche con il ricorso ad ambienti di calcolo simbolico come Derive e, in alcuni casi, risultare impossibile in quanto l'operatore funzionale di integrazione indefinita non è chiuso rispetto alle usuali classi di funzioni razionali e trascendenti oggetto di studio. Gli algoritmi di integrazione numerica consentono di approssimare il valore dell'integrale evitando la determinazione dell'espressione analitica della primitiva. Esempio 2 −x È possibile integrare numericamente la funzione di Gauss g ( x) = 1 2 in e 2π ambiente Derive approssimando l'istruzione INT(g(x),x,a,b) che rappresenta l'integrale b ∫ g ( x)dx : a X.4.2.1 Come già osservato nel caso delle formule di derivazione approssimata una soluzione numerica è spesso una discretizzazione della corrispondente soluzione analitica ottenuta sostituendo il "passaggio al limite" che caratterizza il calcolo infinitesimale (differenziale ed integrale) con l'attribuzione di uno specifico valore al "passo" di derivazione o integrazione. La più semplice formula di integrazione numerica per una funzione continua nell'intervallo [a;b] deriva direttamente dalla definizione di integrale data da Riemann, nel seguito semplificata prendendo in considerazione una partizione di [a;b] in N sottointervalli contigui tutti della stessa ampiezza h: Informatica per la Matematica Giorgio Meini © 2000 b ∫ f ( x)dx = lim s N →∞ a N = lim S N N →∞ dove N −1 s N = ∑ f ( xi ) ⋅ h N S N = ∑ f ( xi ) ⋅ h e i =0 i =1 con h= b−a N xi = a + i ⋅ h e per cui si ha x 0 = a e x N = b . Al fine di evitare il limite per N→∞ (h→0) è possibile definire a priori un valore conveniente di N (e, indirettamente, del passo di integrazione h) ed approssimare l'integrale definito con il valore di sN (o, eventualmente, di SN); nella figura che segue, per la quale N=8, sN è la somma delle aree dei rettangoli aventi base h e altezza f(xi): f(x) a=x0 x1 x2 x3 x4 x5 x6 x7 b=x8 La formula di integrazione numerica "dei rettangoli" b ∫ N f ( x)dx ≅ h ⋅ ∑ f ( x i ) a i =0 con xi = a + i ⋅ h e h= b−a N è facilmente implementabile come funzione VBA: Public Function fun(x As Single) As Single fun = … End Function Public Function rettangoli(a, b As Single, N As Integer) As Single Dim h, s, x As Single Dim i As Integer Informatica per la Matematica h = (b - a) / N s = 0 x = a ' ciclo For i = s = s + x = x + Next i Giorgio Meini © 2000 ' passo di integrazione ' variabile per sommatoria ' argomento per calcolo valori f(x) di calcolo della sommatoria 0 To (N - 1) fun(x) h rettangoli = s * h End Function Esempio π 2 Si intende studiare l'approssimazione dell'integrale ∫ sen( x)dx calcolata con la 0 formula dei rettangoli al variare del numero di suddivisioni N. Dopo avere inserito l'espressione della funzione f(x) nel codice VBA Public Function fun(x As Single) As Single fun = Sin(x) End Function si impostano le seguenti formule nelle prime celle delle colonne A e B di un foglio di lavoro Excel Dato che il valore esatto dell'integrale è 1 l'approssimazione calcolata per N=512 è affetta da un errore assoluto minore di 10-2. Informatica per la Matematica Giorgio Meini © 2000 Osservazione Nell'esempio precedente l'errore diminuisce al crescere del numero N di suddivisioni, cioè al decrescere del valore del passo di integrazione h. Questo è ovviamente vero per l'errore analitico commesso impiegando una formula di integrazione approssimata, ma - come è prevedibile - non è vero per l'errore algoritmico in quanto l'aritmetica finita dell'ambiente di calcolo Excel non è in grado di operare correttamente con valori di h troppo piccoli. Estendendo la tabella Excel costruita nell'esempio precedente si ha un errore di calcolo già per h = π 2 215 ≅ 0,000048 : L'approssimazione calcolata per N=8192 è affetta da un errore assoluto minore di 0,0001 ed è ulteriormente migliorabile impiegando funzioni VBA con variabili di tipo Double anziché Single (questo accorgimento permette infatti di utilizzare valori più piccoli del passo di integrazione h e quindi valori più grandi del numero N di suddivisioni dell'intervallo [a;b]). Il seguente teorema consente di determinare una maggiorazione dell'errore commesso impiegando la formula di integrazione dei rettangoli. Teorema L'errore commesso impiegando la formula di integrazione numerica dei rettangoli per approssimare il valore dell'integrale derivabile in [a;b] è maggiorato dalla quantità b−a Mh 2 dove h= b−a N ∫ b a f ( x)dx con f(x) continua e Informatica per la Matematica Giorgio Meini © 2000 e M è il valore massimo assunto dal modulo della funzione derivata f'(x) nell'intervallo di integrazione. Per la dimostrazione si prende in considerazione il generico sottointervallo [xi;xi+1] dove h ⋅ f ( xi ) = ( xi +1 − x i ) ⋅ f ( xi ) = ∫ xi + 1 xi f ( x i )dx e l'errore assoluto commesso è ei = ∫ xi + 1 xi f ( x)dx − ∫ xi + 1 xi f ( x i )dx = ∫ ( f ( x) − f ( x ))dx ≤ ∫ xi +1 i xi xi + 1 xi f ( x) − f ( x o ) dx perché il modulo dell'integrale di una funzione è minore o uguale all'integrale del modulo della funzione stessa. Sia M un numero positivo tale che per ogni valore x compreso nell'intervallo [a;b] si ha f ' ( x) ≤ M allora per il teorema del valor medio di Lagrange risulta per xi<x<xi+1 f ( x) − f ( x i ) = f ' (ε )( x − x i ) → f ( x) − f ( x i ) = f ' (ε ) ⋅ x − x i con xi < ε < x Segue che f ( x) − f ( xi ) ≤ M ⋅ ( x − xi ) e, dato che xi+1-xi=h, si ha: ei ≤ ∫ xi +1 xi f ( x) − f ( xi ) dx ≤ ∫ xi +1 xi M ( x − xi )dx = Mh 2 2 Essendo N i sottointervalli in cui è suddiviso l'intervallo di integrazione l'errore complessivo non sarà maggiore di N volte l'errore commesso nel singolo sottointervallo [xi;xi+1] e ciò dimostra la tesi: E≤N⋅ o, in alternativa Mh 2 NhMh b − a Mh = = 2 2 2 Informatica per la Matematica Giorgio Meini © 2000 M ( bN− a ) M (b − a) 2 (b − a ) Mh 2 =N⋅ =N = M E≤N⋅ 2N 2 2 2N 2 2 2 Esempio 1 Si intende approssimare il valore dell'integrale ∫x 2 dx impiegando la formula 0 approssimata dei rettangoli e commettendo un errore minore di 10-3. La derivata della funzione f(x)=x2 è f'(x)=2x che nell'intervallo [0;1] assume valore assoluto massimo M=2. L'errore E commesso deve essere inferiore a 10-3 E≤ (b − a )2 2N M= 1 1 ⋅ 2 = ≤ 10 −3 N 2N per cui N ≥ 10 3 Utilizzando in ambiente Excel la funzione VBA rettangoli(0;1;1001) dopo aver definito la funzione f(x)=x2 si ottiene l'approssimazione 0,332829654 che differisce dal 1 risultato esatto di un errore inferiore a 0,0002. 3 X.4.2.2 La formula di integrazione numerica dei rettangoli opera sostituendo alla funzione f(x) una sua interpolazione polinomiale di grado 0 (una funzione costante) in ciascuno dei sottointervalli [xi;xi+1] in cui viene suddiviso l'intervallo di integrazione [a;b]. È possibile ottenere risultati migliori (aumentando la precisione a parità del numero N di sottointervalli, o diminuendo il numero N di suddivisioni necessarie per ottenere una precisione data) sostituendo la funzione f(x) con una sua interpolazione lineare (un polinomio di I grado) in ogni singolo sottointervallo [xi;xi+1]. La figura illustra l'idea per N=4: Informatica per la Matematica Giorgio Meini © 2000 f(x) a=x0 x1 x2 x3 b=x4 L'area del trapezio di altezza h=xi+1-xi vale f ( x i ) + f ( x i +1 ) ⋅h 2 per cui la formula di integrazione numerica "dei trapezi" è26 b ∫ a N −1 h N h ( ) f ( x)dx ≅ ⋅ ∑ f ( x i ) + f ( x i +1 ) = ⋅ f (a ) + 2∑ f ( x i ) + f (b) 2 i =0 2 i =1 con xi = a + i ⋅ h e h= b−a N La formula di integrazione approssimata dei trapezi è di immediata implementazione come funzione VBA: Public Function fun(x As Single) As Single fun = … End Function Public Function trapezi(a, b As Single, N As Integer) As Single Dim h, s, x As Single Dim i As Integer h = (b - a) / N s = fun(a) + fun(b) x = a + h 26 ' passo di integrazione ' variabile per sommatoria ' argomento per calcolo valori f(x) la trasformazione applicata alla sommatoria è giustificata dal fatto che tutti i valori f(xi) sono sommati 2 volte - in due iterazioni successive - esclusi il primo (f(x0)) e l'ultimo (f(xN)) Informatica per la Matematica ' ciclo For i = s = s + x = x + Next i Giorgio Meini © 2000 di calcolo della sommatoria 1 To (N - 1) 2 * fun(x) h trapezi = s * ( h / 2) End Function Esempio e Si intende studiare l'approssimazione dell'integrale ∫ ln( x)dx calcolata con la formula 1 dei trapezi al variare del numero di suddivisioni N, confrontando i risultati con quelli forniti dalla formula dei rettangoli. Dopo avere inserito l'espressione della funzione f(x) nel codice VBA Public Function fun(x As Single) As Single fun = Log(x) End Function si impostano le seguenti formule nelle prime celle delle colonne A e B di un foglio di lavoro Excel Informatica per la Matematica Giorgio Meini © 2000 Tenendo presente che l'integrale esatto ha valore 1 si nota che la formula dei trapezi, pur non immune dalla presenza di errori algoritmici "catastrofici" per elevati valori del numero N di suddivisioni, fornisce una approssimazione affetta da un errore minore di 10-3 con N=16 (per ottenere la stessa precisione con la formula dei rettangoli sono invece necessarie 1024 suddivisioni). È possibile dimostrare che utilizzando la formula di integrazione approssimata dei trapezi in luogo del valore esatto dell'integrale si commette un errore E maggiorato dalla quantità E≤ (b − a) 3 b−a ⋅ Mh 2 = ⋅M 12 12 N 2 dove M è un numero positivo tale che per ogni valore x compreso nell'intervallo di integrazione [a;b] si ha f ' ( x) ≤ M Esempio In un esempio precedente abbiamo calcolato che per approssimare il valore 1 dell'integrale ∫x 2 dx impiegando la formula dei rettangoli e commettendo un errore 0 minore di 10-3 sono necessarie 1001 suddivisioni dell'intervallo di integrazione. Quante suddivisioni sono necessarie per ottenere la stessa precisione utilizzando la formula dei trapezi? La derivata della funzione f(x)=x2 è f'(x)=2x che nell'intervallo [0;1] assume valore assoluto massimo M=2. L'errore E commesso deve essere inferiore a 10-3 3 ( b − a) E≤ M= 12 N 2 1 1 ⋅2= ≤ 10 −3 2 2 12 N 6N Informatica per la Matematica Giorgio Meini © 2000 per cui N2 ≥ 10 3 6 → N≥ 1000 ≅ 12,9 6 Utilizzando in ambiente Excel la funzione VBA trapezi(0;1;13) dopo aver definito la funzione f(x)=x2 si ottiene l'approssimazione 0,334319532 che differisce dal risultato 1 esatto di un errore inferiore a 0,001. 3 X.4.2.3 La formula di integrazione numerica dei trapezi opera sostituendo alla funzione f(x) una sua interpolazione polinomiale di I grado (interpolazione lineare) in ogni singolo sottointervallo [xi;xi+1] di suddivisione dell'intervallo di integrazione. Per ottenere risultati migliori in termini di precisione e di prestazioni computazionali (numero di iterazioni) è possibile sostituire la funzione f(x) con una sua interpolazione parabolica (interpolazione polinomiale di II grado) in ogni singolo sottointervallo [xi;xi+1]. Per determinare univocamente un polinomio di II grado occorrono 3 nodi di interpolazione: a questo scopo oltre agli estremi del sottointervallo xi e xi+1 si prende in x + x i +1 considerazione il punto medio i . 2 f(xi) xi f( xi + xi + 1 2 xi + x i + 1 2 ) f(xi+1) xi+1 Per individuare la parabola di interpolazione della funzione f(x) nei nodi xi, xi+1 e x i + x i +1 si ricorre in ambiente Derive alle istruzioni che definiscono il polinomio di 2 interpolazione in forma di Lagrange e, al solo fine di semplificare la notazione, si effettuano le sostituzioni di variabile α=xi e β=xi+1: Informatica per la Matematica Giorgio Meini © 2000 Il polinomio di interpolazione p(z)27 deve essere integrato nell'intervallo [α;β] in luogo della funzione f(x): Applicando il comando Semplifica/Fattorizza si dell'integrale di f(x) limitatamente all'intervallo [α;β] ottiene l'approssimazione che, riscritta con la notazione usuale, diviene: x i +1 − x i 6 h x + x i +1 x + x i +1 ⋅ f ( xi ) + 4 f i + f ( x i +1 ) = ⋅ f ( x i ) + 4 f i + f ( x i +1 ) 2 2 6 Sommando gli integrali corrispondenti agli N sottointervalli di suddivisione dell'intervallo di integrazione si ottiene h N −1 x + x i +1 ⋅ ∑ f ( xi ) + 4 f i + f ( xi +1 ) = 6 i =0 2 = 27 N −1 N −1 h x + xi +1 ⋅ f ( x 0 ) + 2∑ f ( x i ) + 4∑ f i + f ( x n ) 6 2 i =1 i =0 l'uso di una diversa variabile è reso necessario dalle limitazioni sintattiche del software Derive Informatica per la Matematica Giorgio Meini © 2000 per cui la formula di integrazione numerica "di Cavalieri-Simpson" è ∫ b a f ( x)dx ≅ N −1 N −1 h x + x i +1 ⋅ f ( a ) + 2∑ f ( x i ) + 4 ∑ f i + f (b) 6 2 i =1 i =0 b−a . N L'implementazione come funzione VBA della formula di Cavalieri-Simpson mantiene la struttura già vista per le formule dei rettangoli e dei trapezi28: con h = Public Function Cavalieri_Simpson(a As Single, b As Single, N As Integer) As Single Dim h, s, x As Single Dim i As Integer h = (b - a) / N s = fun(a) + fun(b) + 4 * fun(a + (h / 2)) x = a + h For i = 1 To (N - 1) s = s + 2 * fun(x) + 4 * fun(x + (h / 2)) x = x + h Next i Cavalieri_Simpson = s * ( h / 6) End Function Esempio e Dovendo approssimare l'integrale 1 ∫ x dx con la formula di Cavalieri-Simpson si 1 inserisce l'espressione della funzione f(x) nel codice VBA Public Function fun(x As Single) As Single fun = 1 / x End Function e si richiama la funzione Cavalieri_Simpson(…) inserendola in una qualsiasi cella di un foglio di Excel specificando gli estremi di integrazione e il numero N di suddivisioni: 28 nel codice VBA la quantità x i + x i +1 h è stata calcolata come x i + 2 2 Informatica per la Matematica Giorgio Meini © 2000 L'estrema precisione di questa formula di integrazione numerica è dimostrata dal fatto che già con 2 suddivisioni si ha un risultato affetto da un errore inferiore a 10-3, che diviene inferiore a 10-6 con sole 16 suddivisioni (il valore esatto dell'integrale è 1). Informatica per la Matematica X.4.3 Giorgio Meini © 2000 Sintesi La derivata di una funzione f(x) nel punto x0 può essere approssimata con la formula di derivazione numerica del I ordine f ' ( x0 ) ≅ f ( x 0 + h) − f ( x 0 ) h o con la formula di derivazione numerica del II ordine f ' ( x0 ) ≅ f ( x 0 + h) − f ( x 0 − h ) 2h fissando il "passo" di derivazione h a un valore compatibile con la precisione dell'aritmetica finita dell'ambiente che esegue il calcolo; l'integrale definito di una funzione continua f(x) calcolato sull'intervallo [a;b] può essere approssimato numericamente suddividendo l'intervallo di integrazione in N b−a sottointervalli di ampiezza h = ; definendo xi = a + ih è possibile impiegare la N formula dei rettangoli b ∫ a N f ( x)dx ≅ h ⋅ ∑ f ( x i ) i =0 , la formula dei trapezi (interpolazione lineare) b ∫ a f ( x)dx ≅ N −1 h ⋅ f ( a ) + 2 ∑ f ( x i ) + f (b ) , 2 i =1 o la formula di Cavalieri-Simpson (interpolazione parabolica) ∫ b a f ( x)dx ≅ N −1 N −1 h x + x i +1 ⋅ f ( a ) + 2∑ f ( x i ) + 4∑ f i + f (b) ; 6 2 i =1 i =0 se M è il massimo valore assunto dal modulo della funzione derivata f'(x) nell'intervallo di integrazione [a;b] l'errore della formula dei rettangoli è maggiorato dalla quantità (b − a ) M , b−a Mh = 2 2N 2 mentre l'errore della formula dei trapezi è maggiorato dalla quantità (b − a) 3 b−a M. Mh 2 = 12 12 N 2 Informatica per la Matematica X.4.4 Giorgio Meini © 2000 Esperimenti 1. Approssimare la derivata delle seguenti funzioni nei punti indicati utilizzando entrambe le formule di derivazione numerica con passo di derivazione h=10-3: a) f ( x) = x , b) f ( x) = cos( x) , c) f ( x) = ln( x) , d) f ( x) = 1 , x e) f ( x) = x 2 , f) f ( x) = e x , x0 = 1 ; x0 = 0 ; x0 = 1 ; 1 x0 = ; 2 x0 = 2 ; x 0 = −1 . Stimare l'errore commesso determinando il valore esatto delle derivate in ambiente Derive. 2. Data la funzione f(x)=arctg(x) determinare empiricamente in ambiente Excel un valore del passo di derivazione h che minimizza l'errore commesso al variare dell'argomento x utilizzando la funzione VBA der(…) con variabili di tipo Double (suggerimento: costruire in un foglio di lavoro Excel una tabella a doppia entrata con diversi valori di x sulle righe e diversi valori di h sulle colonne). 3. Determinare una formula approssimata per la derivata seconda della funzione f(x) calcolata in uno specifico punto x0 derivando due volte la parabola di interpolazione individuata per costruire la formula di derivazione numerica del II ordine. Implementare la formula individuata come funzione VBA: confrontare in ambiente Excel la precisione della formula per la derivata seconda con l'applicazione ripetuta della formula per l'approssimazione della derivata prima. 4. Implementare le formule di derivazione numerica approssimata come funzioni in ambiente Derive verificando che non si ha errore algoritmico. 5. # Modificare le funzioni VBA che applicano i metodi "delle tangenti" e "delle secanti" per l'approssimazione dello zero di una funzione f(x) in modo che individuino automaticamente il valore iniziale dell'iterazione tra gli estremi dell'intervallo di separazione dello zero ricorrendo a funzioni di determinazione numerica dei valori assunti dalle derivate prima f'(x) e seconda f"(x). 6. Approssimare i seguenti integrali definiti utilizzando le tre formule di integrazione numerica con passo di integrazione minore di h=10-3: a) 1 −x ∫ e dx ; 0 2 Informatica per la Matematica Giorgio Meini © 2000 b) c) 1 ∫ −1 1 1 − x 2 dx ; 1 ∫1+ x 2 dx ; 0 d) π ∫π arctg ( x)dx ; − π e) 2 ∫ sen( x 2 )dx . π −2 Stimare l'errore commesso in ciascun caso determinando il valore esatto dell'integrale in ambiente Derive. 7. Determinare teoricamente il numero minimo N di suddivisioni necessarie per approssimare ciascuno degli integrali dell'esercizio precedente con un errore inferiore a 10-3 ricorrendo alle formule dei rettangoli e dei trapezi. Impiegando in ambiente Excel le funzioni VBA rettangoli(…), trapezi(…) e Cavalieri_Simpson(…) confrontare il numero di suddivisioni effettivamente necessarie per avere una precisione superiore a 10-3. 8. Determinare la complessità computazionale - intesa come numero di valutazioni della funzione integranda f(x) fissato il numero N di suddivisioni delle tre formule di integrazione numerica. 9. # Scrivere una funzione VBA prim(…) che approssima il valore assunto dalla primitiva F(x) - scelta in modo tale che F(0)=0 - di una funzione f(x) in corrispondenza dell'argomento. 10. Programmare in ambiente Derive le formule di integrazione approssimata: verificare che non si ha errore algoritmico.