10.07.2015 Views

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Annamaria Mazzia<strong>Appunti</strong> <strong>di</strong> <strong>Calcolo</strong> <strong>Numerico</strong>Dipartimento <strong>di</strong> Meto<strong>di</strong> e Modelli Matematici per le Scienze ApplicateUniversità <strong>degli</strong> Stu<strong>di</strong> <strong>di</strong> PadovaCreative Commons Attribuzione- Non commerciale -Non opere derivate 2.5 Italia Licensea.a. 2010/2011


Annamaria Mazzia: <strong>Appunti</strong> <strong>di</strong> <strong>Calcolo</strong> <strong>Numerico</strong>,Dipartimento <strong>di</strong> Meto<strong>di</strong> e Modelli Matematici per le Scienze ApplicateUniversità <strong>degli</strong> Stu<strong>di</strong> <strong>di</strong> PadovaVERSIONE A.A. 2010/2011 .SITO DELLE DISPENSE:http://<strong>di</strong>spense.dmsa.unipd.it/E-MAIL:mazzia@dmsa.unipd.itQuesto lavoro è stato rilasciato sotto la licenza CREATIVE COMMONS ATTRIBUZIONE- NON COMMERCIALE -NON OPERE DERIVATE 2.5 ITALIA LICENSE,Per leggere una copia della licenza visita il sito web (http://creativecommons.org/licenses/by-nc-nd/2.5/it/)Foto <strong>di</strong> copertina: Pietre...Per ricordare l’etimologia della parola CALCOLO: dal latino Calculus – pietruzza, lapillo – a sua volta <strong>di</strong>minuitivo<strong>di</strong> Calx, nel senso originario <strong>di</strong> ghiaia, sasso, perchè gli antichi, per fare i loro conti, utilizzavanopietruzze al posto <strong>di</strong> cifre aritmetiche. (definizione tratta dal Vocabolario Etimologico della Lingua Italiana <strong>di</strong>O. Pianigiani http://www.etimo.it)


INDICE4.10 Controllo sugli scarti e grafici <strong>di</strong> convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534.11 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 Interpolazione 615.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625.3 Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635.3.1 Funzioni base monomiali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635.3.2 Polinomi <strong>di</strong> Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655.3.3 Formula dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665.3.4 Differenze <strong>di</strong>vise e formula <strong>di</strong> Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675.4 Considerazioni sull’interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.4.1 Fenomeno <strong>di</strong> Runge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.4.2 Malcon<strong>di</strong>zionamento nell’interpolazione con funzioni base monomiali . . . . . . . . . 725.5 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736 Approssimazione 776.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776.2 Retta <strong>di</strong> regressione lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786.3 Approssimazione polinomiale ai minimi quadrati . . . . . . . . . . . . . . . . . . . . . . . . . . . 806.4 Approssimazioni <strong>di</strong> tipo esponenziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816.5 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827 Meto<strong>di</strong> <strong>di</strong>retti per la soluzione <strong>di</strong> sistemi lineari 857.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857.2 Elementi <strong>di</strong> Algebra Lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867.3 Metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.3.1 Sostituzione all’in<strong>di</strong>etro e in avanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.3.2 Eliminazione <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917.4 Strategie <strong>di</strong> pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937.5 Fattorizzazione triangolare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947.5.1 Fattorizzazione LDU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957.5.2 Fattorizzazione <strong>di</strong> Gauss senza pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977.5.3 Fattorizzazione <strong>di</strong> Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997.6 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008 Meto<strong>di</strong> Iterativi per la soluzione <strong>di</strong> sistemi lineari 1038.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1038.2 Meto<strong>di</strong> iterativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048.3 Norme <strong>di</strong> vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048.4 Norme <strong>di</strong> matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068.5 Autovalori e autovettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068.6 Meto<strong>di</strong> classici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088.6.1 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088.6.2 Controllo della convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1108.6.3 I meto<strong>di</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118.6.4 Convergenza dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamento . . . . . . . . . . . . . . . 1158.7 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1179 Integrazione numerica 1219.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1219.2 Formula dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1229.3 Formule <strong>di</strong> Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123iv


1. STRUTTURA DELL’ELABORATOREFigura 1.1: Stralci <strong>di</strong> volantini pubblicitari per l’acquisto <strong>di</strong> un computer.Definizione 1.1.1Computer = elaboratore elettronico <strong>di</strong>gitaleDispositivo elettronico che elabora le informazioni, immesse sotto forma <strong>di</strong> datinumerici, secondo una sequenza <strong>di</strong> istruzioni preor<strong>di</strong>nate (programma).G Elaboratore: macchina capace <strong>di</strong> immagazzinare ed elaborare dati in basead una serie <strong>di</strong> istruzioni (programmi) memorizzate sul computerG elettronico: utilizza componenti elettroniche per elaborare le informazioniG <strong>di</strong>gitale: elabora e memorizza segnali <strong>di</strong>gitali basati su cifre binarie: 0 e 1HardwareSoftwareIn generale, un computer esegue operazioni logiche e aritmetiche e ha una memoria per conservare i dati.Un programma contiene le informazioni relative alle operazioni da eseguire.Si definisce hardware la struttura fisica del computer cioè i i suoi componenti elettronici e i <strong>di</strong>spositivifisici che lo compongono.Si chiama, invece, software l’insieme delle istruzioni (i programmi) che consentono all’hardware <strong>di</strong>svolgere i propri compiti (per esempio, il sistema operativo – Windows, Linux, etc – è un tipo <strong>di</strong> software;programmi applicativi come Word, Excel, LaTex sono dei software).Attraverso un computer, elaboriamo dati (numeri, suoni, video, fotografie) in modo da ottenere informazioni(lettere, tabelle, risultati <strong>di</strong> proce<strong>di</strong>menti numerici. . . ). Alcune <strong>di</strong> queste informazioni possono<strong>di</strong>ventare dati da elaborare <strong>di</strong> nuovo al computer.1.2 La preistoria del computer: Babbage e LovelaceCharlesBabbageLa seconda metà del <strong>di</strong>ciannovesimo secolo fu un tempo <strong>di</strong> grande fermento in numerosi campi, dall’ingegneriaai trasporti, dalla comunicazione all’architettura... Furono scoperti nuovi materiali, la forza animalefu sostituita dalla forza motrice, le navi a vapore iniziarono a competere con quelle a vela, la rete ferroviariasi espanse sempre più, il telegrafo elettrico rivoluzionò le comunicazioni... In questo contesto, ingegneri, architetti,matematici, astronomi, marinai, banchieri, agenti assicurativi... – chiunque avesse a che fare con ilcalcolo – si basava su tavole <strong>di</strong> calcolo per eseguire i calcoli meno banali. Tuttavia, si sa, gli uomini possonosbagliare e il timore che su quelle tavole ci fossero <strong>degli</strong> errori era giustificato: un errore non trovato poteva<strong>di</strong>ventare un <strong>di</strong>sastro nelle numerose applicazioni in cui le tavole <strong>di</strong> calcolo venivano usate!Già nel 1812 Charles Babbage 1 era consapevole dell’inaccuratezza dei calcoli fatti dall’uomo. Nel suolavoro, Babbage doveva verificare l’esattezza <strong>di</strong> tavole <strong>di</strong> calcolo che sarebbero state usate da banchieri comeda marinai. Le navi avrebbero identificato la loro posizione in mare me<strong>di</strong>ante quelle tavole! Eliminare ilrischio dell’errore umano <strong>di</strong>venne per lui un desiderio sempre più grande. Egli stesso scrisse che, mentre1 Charles Babbage (1791-1871), inventore e matematico inglese, è senza dubbio il primo ad avere avuto il concetto del modernocalcolatore.2


1.3. Gli alboriera seduto nella stanza della Società Analitica, a Cambridge, lavorando, mezzo addormentato, su una tavoladei logaritmi, arrivò un altro membro della società che gli chiese cosa stesse sognando. E lui rispose : – Stopensando che tutte queste tavole – riferendosi alle tavole dei logaritmi – potrebbero essere calcolate da unamacchina!Nel 1821, Babbage e il suo amico e astronomo John Herschel stanno controllando delle tabelle calcolatea mano. Errore dopo errore, Babbage esclama : – Volesse Dio che questi calcoli venissero eseguiti da unamacchina a vapore!Il suo desiderio <strong>di</strong> creare una macchina per eseguire calcoli si concretizzò in due progetti, quello dellaMacchina alle Differenze e quello della Macchina Analitica 2 . La Macchina alle Differenze doveva calcolarein modo automatico funzioni polinomiali ma non venne mai completata per il suo costo eccessivamenteelevato. La Macchina Analitica, invece, doveva essere una macchina <strong>di</strong> calcolo programmabile, e si può considerarecome la prima idea del moderno computer. Anche questo progetto, tuttavia, rimase incompiuto.Solo nel 2002 è stato possibile costruire una macchina che rispondesse al progetto <strong>di</strong> Babbage.Nel 1833, Babbage incontrò Ada Lovelace 3 , figlia del famoso poeta Lord Byron. Lovelace, appena <strong>di</strong>ciassettenne,aveva parecchie conoscenze matematiche, inusuali per l’epoca, e si entusiasmò talmente tanto peril progetto <strong>di</strong> Babbage, da intuire altre potenzialità della macchina stessa, come la capacità dei numeri <strong>di</strong>poter rappresentare altre entità quali le lettere dell’alfabeto o le note musicali, e che dalla manipolazione deinumeri la macchina avrebbe esteso la propria potenza oltre il mondo della matematica. Sempre la Lovelaceintuì che la soluzione dei problemi matematici si sarebbe effettuata attraverso delle procedure <strong>di</strong> calcolo(quelli che noi chiamiamo programmi).Alla luce <strong>degli</strong> sviluppi che si sono avuti nel ventesimo secolo, la visione <strong>di</strong> Babbage e della Lovelaceappare profetica.Ada Lovelace1.3 Gli alboriIl 1800 si chiude con una grande invenzione: nel 1896, Guglielmo Marconi inventa la ra<strong>di</strong>o. Il 1900 si aprecon altre importanti invenzioni: il triodo, il registratore magnetico, la televisione, fino ad arrivare intorno allametà del 1900 con il transistor (nel 1947) e il circuito integrato (nel 1958). La nuova tecnologia elettromeccanicaed elettronica si rivelò decisiva per lo sviluppo dei computer, grazie allo stu<strong>di</strong>o sistematico della teoria deicircuiti elettrici. Il più noto tra gli stu<strong>di</strong>osi <strong>di</strong> questa teoria fu l’americano Claude Shannon 4 . Il suo contributofondamentale fu quello <strong>di</strong> elaborare un metodo sistematico per progettare reti logiche capaci <strong>di</strong> eseguire leoperazioni logico-aritmetiche desiderate: detto più semplicemente, egli mostrò come trasformare una assegnataoperazione matematica in un circuito elettrico costruito con interruttori e relè <strong>di</strong> commutazione (quelliusati nelle telecomunicazioni). Nel 1948, il suo articolo A Mathematical Theory of Communication pubblicatosulla rivista The Bell System Technical Journal getta le basi teoriche dell’informatica. Per prima voltaviene usato il termine bit come abbreviazione <strong>di</strong> binary <strong>di</strong>git, termine suggeritogli dal chimico e statistico J.W. Tukey.Il lavoro <strong>di</strong> Shannon <strong>di</strong>ede l’avvio allo stu<strong>di</strong>o delle tecniche in<strong>di</strong>spensabili per progettare in modosistematico tutti i circuiti logici <strong>di</strong> base necessari per realizzare i circuiti <strong>di</strong> calcolo dei futuri computer.Da un punto <strong>di</strong> vista propriamente ”pratico“ invece, la nascita e lo sviluppo dei calcolatori elettroniciinizia nel 1938: il tedesco Konrad Zuse 5 costruisce Z1, una macchina costruita e pensata in maniera completamentemeccanica, tutta da migliorare, ma che può essere considerata come il primo calcolatore. Zusepassa subito al progetto Z2, dove l’aritmetica meccanica è sostituita da relè elettromeccanici. L’inizio dellaseconda guerra mon<strong>di</strong>ale interrompe bruscamente il lavoro <strong>di</strong> Zuse, che viene chiamato alle armi, ma riesce2 Osserviamo che l’invenzione del telaio meccanico a schede, in cui il tipo <strong>di</strong> tessuto veniva scelto (o programmato) in base a delleschede inserite nella macchina, è un precursore del progetto <strong>di</strong> Babbage.3 Augusta Ada Lovelace (1815-1852) fu la figlia del famoso poeta Lord Byron. I genitori si separono subito dopo la sua nascita ela bambina crebbe insieme alla madre (Lord Byron partì dall’Inghilterra senza farvi più ritorno e morì in Grecia quando Ada aveva ottoanni). Poichè la madre era appassionata <strong>di</strong> matematica e non voleva che la figlia seguisse la strada del padre, incoraggiò la figlia in questa<strong>di</strong>rezione, impartendole un’istruzione legata alla matematica e alla musica. Nel 1835 sposò William King, <strong>di</strong> <strong>di</strong>eci anni più anziano. Nel1838 il marito ricevette il titolo nobiliare <strong>di</strong> Conte <strong>di</strong> Lovelace. Ebbero tre figli. La Lovelace morì <strong>di</strong> cancro a soli 37 anni.4 Claude Shannon (1916-2002) fu fisico e matematico del MIT.5 Konrad Zuse, ingegnere civile (1910-1995).3


1. STRUTTURA DELL’ELABORATOREvonNeumanna persuadere l’Istituto <strong>di</strong> Ricerca Aero<strong>di</strong>namica del Terzo Reich a continuare i suoi stu<strong>di</strong>. Completa quin<strong>di</strong> lacostruzione dello Z2 e inizia a lavorare sullo Z3, che è il primo computer che Zuse costruisce per essere usatoe non per verificare le proprie idee. Lo Z3 ha non solo l’unità aritmetica ma anche la memoria realizzata conrelè elettromeccanici, ben 2600. Z3 fu la prima macchina <strong>di</strong> calcolo programmabile e venne usata dall’industriaaerea per risolvere sistemi <strong>di</strong> equazioni e altri sistemi matematici ricavati da problemi <strong>di</strong> vibrazione<strong>degli</strong> apparecchi aerei messi sotto stress.Quando Zuse propose <strong>di</strong> passare all’uso <strong>di</strong> un computer basato su valvole elettroniche, la proposta furespinta perchè i tedeschi si consideravano così vicini alla vittoria della guerra che ulteriori sforzi nella ricercanon apparivano necessari.Il lavoro <strong>di</strong> Zuse, comunque, andò avanti con la costruzione dello Z4, <strong>di</strong> S1 e S2. E, soprattutto, fucompletamente in<strong>di</strong>pendente dai lavori <strong>di</strong> John Eckert e John Mauchly negli Stati Uniti e <strong>di</strong> A. Turing inInghilterra.In Inghilterrra, Turing 6 si occupò <strong>di</strong> problematiche riguardanti un macchina <strong>di</strong> calcolo <strong>di</strong>gitale astratta,con una memoria senza limiti, mentre negli USA Eckert e Mauchly 7 costruirono l’ENIAC (Electronic Integratorand Computer). L’ENIAC fu costruito, con progetto <strong>di</strong> Eckert, in piena seconda guerra mon<strong>di</strong>ale, apartire dal 1943, presso il Ballistic Research Laboratory e fu completato nel febbraio del 1946. La macchinaera pensata per compiere operazioni <strong>di</strong> carattere generale, ma fu costruita con lo scopo preciso <strong>di</strong> compilaretabelle per le traiettorie <strong>di</strong> bombe. L’ENIAC conteneva circa 18 . 000 valvole termoioniche e misurava circa 2metri e mezzo <strong>di</strong> altezza per 24 metri <strong>di</strong> lunghezza! La macchina era più <strong>di</strong> mille volte veloce <strong>di</strong> tutti i predecessorielettromeccanici costruiti fino a quel momento e poteva eseguire 5000 ad<strong>di</strong>zioni al secondo. Le sueoperazioni erano controllate da un programma che veniva inserito dall’esterno me<strong>di</strong>ante nastri perforati.Intanto, nel 1944 aveva iniziato a collaborare nella costruzione dell’ENIAC, John von Neumann 8 . Egli siaccorse che l’architettura della macchina andava rivista e che la programmazione del computer me<strong>di</strong>ante unnumero enorme <strong>di</strong> cavi e interruttori rendeva lenta e poco flessibile la programmazione stessa. Sostenne,quin<strong>di</strong>, che il programma non dovesse essere rigidamente pre<strong>di</strong>sposto nell’hardware tramite interruttori ecavi e neanche letto me<strong>di</strong>ante nastri perforati, ma risiedesse in una memoria su cui poter scrivere e accederevelocemente insieme ai dati da elaborare. Von Neumann per primo descrisse l’architettura dei calcolatori intermini logico-funzionale, secondo uno schema astratto non legato ai <strong>di</strong>spositivi fisici utilizzati per le varieoperazioni. E il suo schema, sostanzialmente invariato, è l’architettura adottata dai calcolatori dei nostrigiorni!Prima <strong>di</strong> von Neumann, il calcolatore veniva controllato me<strong>di</strong>ante programmi non mo<strong>di</strong>ficabili, registratisu nastro perforato o cablati in una configurazione <strong>di</strong> cavetti e interruttori. Con von Neumann si presentaun’architettura <strong>di</strong> riferimento precisa.Il primo calcolatore costruito seguendo l’architettura <strong>di</strong> von Neumann entrò in funzione nel 1948all’Università <strong>di</strong> Manchester e venne chiamato Manchester Mark I.Inizia, in tal modo, una nuova fase per i calcolatori: i programmi che controllano le operazioni da svolgererisiedono nella memoria del calcolatore insieme ai dati e possono essere mo<strong>di</strong>ficati <strong>di</strong>namicamente nel corsodell’elaborazione.Dal 1948 fino ai nostri giorni, lo sviluppo dei calcolatori elettronici ha avuto ritmi esponenziali: l’invenzionedel circuito integrato alla fine <strong>degli</strong> anni cinquanta permise non solo <strong>di</strong> ridurre via via lo spazio fisicooccupato dai computer ma anche <strong>di</strong> ottenere computer sempre più potenti tanto che, in due suoi lavori, del1965 e del 1975, Gordon Moore 9 stabilì che il numero dei transistor inseribili su un chip raddoppia appros-6 Alan Turing (1912-1954), matematico inglese, si interessò <strong>di</strong> logica matematica e <strong>di</strong> teoria della probabilità. Introdusse il concetto<strong>di</strong> una macchina astratta, detta macchina <strong>di</strong> Turing e pose questioni riguardanti l’intelligenza artificiale7 John Presper Eckert (1919-1995) e John William Mauchly (1907-1980) lavorarono a quello che si può considerare il vero primocalcolatore elettronico.8 John von Neumann (1903-1957) ungherese, stu<strong>di</strong>ò prima a Berlino, poi a Zurigo e infine a Budapest, dove ricevette il dottorato inmatematica. Nel 1930 si trasferì alla Università <strong>di</strong> Princeton dove insegnò matematica. Il suo nome è legato a stu<strong>di</strong> in <strong>di</strong>versi settori:teoria dei giochi, matematica applicata, logica... Occupa un ruolo fondamentale nello sviluppo dei calcolatori elettronici. Ricevettenumerosi premi e riconoscimenti in tutto il mondo.9 Gordon Moore è nato nel 1929 in California. Di lui basti ricordare che ha stabilito la legge <strong>di</strong> Moore, è co-fondatore della IntelCorporation e nel 2008 ha ricevuto la medaglia d’onore dell’IEEE per il suo pioneristico contributo nei processi dei circuiti integrati,e per la leadership nello sviluppo della memoria del MOS (semiconduttore metal-ossido), del microprocessore e dell’industria deisemiconduttori.4


1.4. Architettura del Computersimativamente ogni 24 mesi (legge <strong>di</strong> Moore). Nel 1971 tre ingegneri della Intel tra cui l’italiano FedericoFaggin 10 inventarono il microprocessore, vale a <strong>di</strong>re un’intera CPU in un singolo circuito integrato: su unapiastrina <strong>di</strong> 4×3 millimetri riuscirono a inserire 2250 transistor, che formavano il cuore <strong>di</strong> un intero computer:questo microprocessore fu chiamato Intel 4004 ed era capace <strong>di</strong> eseguire 60 . 000 operazioni al secondo.Se pensiamo che il processore Intel Pentium 4 introdotto nel 2000 ha 42 . 000 . 000 processori e l’Intel Itanium2 (con 9MB <strong>di</strong> cache) introdotto nel 2004 ha 592 . 000 . 000 transistors, ci accorgiamo <strong>di</strong> come la legge <strong>di</strong>Moore, dal 1968 ad oggi, sia stata rispettata.1.4 Architettura del ComputerL’architettura del Computer si può riassumere in tre unità:G il processore, che fornisce la capacità <strong>di</strong> elaborazione delle informazioni;G la memoria (centrale e <strong>di</strong> massa)G i <strong>di</strong>spositivi <strong>di</strong> input/output, che comunicano attraverso un canale detto BUS, costituito da un insieme<strong>di</strong> linee elettriche <strong>di</strong>gitali.Il processore è composto da blocchi con funzionalità <strong>di</strong>verse:G CPU (Central Processing Unit), unità centrale <strong>di</strong> elaborazioneG cacheG varie interfacceSe il processore è integrato su un unico chip prende il nome <strong>di</strong> microprocessore. Sia la CPU sia gran partedei <strong>di</strong>spositivi che servono per l’attività della CPU sono realizzati con la tecnologia dei circuiti integrati,che possono essere <strong>di</strong>sposti in una singola scheda detta scheda madre. Questa scheda può essere dunqueconsiderata la parte più importante del computer.La CPU esegue tutte le operazioni <strong>di</strong> elaborazione numerica e <strong>di</strong> controllo e rappresenta la parte centraledel computer.A sua volta si sud<strong>di</strong>vide inG unità logico-aritmetica (ALU), che svolge tutti i calcoli logici ed aritmetici;G unità floating-point (FPU) (Floating Point Unit), che consente <strong>di</strong> eseguire le operazioni su numeri reali;G unità <strong>di</strong> controllo (CU), che sovrintende all’elaborazione dei dati e alle operazioni <strong>di</strong> input e output;G registri, cioè memoria locale per memorizzare dati e lo stato <strong>di</strong> avanzamento delle istruzioni. Abbiamo,ad esempio, il registro <strong>di</strong> Program Counter, <strong>di</strong> Program Status Word, il registro Istruzioni, In<strong>di</strong>rizziMemoria. . .Ogni elaboratore contiene un circuito <strong>di</strong> temporizzazione (clock) che genera un riferimento temporalecomune per tutti gli elementi del sistema.Un ciclo-macchina è il tempo richiesto per svolgere un’operazione elementare (ed è un multiplo del periododel clock). La velocità <strong>di</strong> elaborazione <strong>di</strong> un processore <strong>di</strong>pende dalla frequenza del clock. I processori10 Federico Faggin è nato nel 1940 a Vicenza e si è laureato in fisica all’Università <strong>di</strong> Padova. Nel 1968 si è trasferito prima a Palo Altopresso la Fairchild Semiconductor e poi nel 1970 nella Intel. Oggi è presidente e CEO (Chief Executive Officer) della Foveon.5


1. STRUTTURA DELL’ELABORATORERAMattuali hanno valori <strong>di</strong> frequenza del clock che variano tra gli 8 MHz e i 3500 MHz (1 MHz = 1 milione <strong>di</strong>istruzioni al secondo).La memoria serve per conservare le istruzioni da eseguire e per scrivere/leggere i dati elaborati. Sisud<strong>di</strong>vide in memoria principale e memoria secondaria.La memoria principale (o <strong>di</strong> lavoro) è la memoria in grado <strong>di</strong> conservare <strong>di</strong>namicamente dati eprogrammi che il processore sta utilizzando. A sua volta la memoria principale può essere <strong>di</strong> due tipi:G memoria <strong>di</strong> sola lettura (read-only memory): ROM. Viene scritta una volta per tutte dal produttore delsistema e contiene programmi e informazioni specifiche per il sistema; è utilizzata per memorizzareparametri <strong>di</strong> configurazione del sistema, utili all’avvio del computer;G memoria per scrittura-lettura (random access memory): RAM. Serve alla CPU per lavorare con iprogrammi inseriti dall’utente.Poichè la RAM conserva i dati solo fino a quando il computer rimane acceso (infatti è detta memoria<strong>di</strong> tipo volatile, perchè se ne perde il contenuto quando la macchina viene spenta), per conservare dati eprogrammi per tempi lunghi e a sistema spento, si utilizza la memoria <strong>di</strong> massa (o secondaria) – <strong>di</strong>schicome l’Hard Disk, CDROM, DVD, pendrive USB. . . .La RAM può essere pensata come una sequenza <strong>di</strong> celle (locazioni), ognuna identificata da un in<strong>di</strong>rizzo ecapace <strong>di</strong> contenere informazioni binarie.L’unità minima in<strong>di</strong>rizzabile della memoria è detta parola (word) e può variare da macchina a macchina.In genere una parola vale un byte, cioè 8 bit.Bit è l’unità elementare <strong>di</strong> informazione.Per esempio: 0/1, sì/no.1 byte = 8 bit1 Kilobyte (KB) = 2 10 byte = 1024 byte (circa 10 3 )1 Megabyte (MB) = 2 20 byte (circa 10 6 )1 Gigabyte (GB) ≈ 10 9 byte (un miliardo <strong>di</strong> byte)1 Terabyte (TB) ≈ 10 12 byte (mille miliar<strong>di</strong> <strong>di</strong> byte)1 Petabyte (PB) ≈ 10 15 byte (un milione <strong>di</strong> miliar<strong>di</strong> <strong>di</strong> byte)Il computer scambia informazioni con il “mondo esterno” per mezzo delle periferiche <strong>di</strong> input/output(monitor, mouse, stampante, web-cam,...).Input è l’inserimento <strong>di</strong> dati nel computer per l’elaborazione. Output è il trasferimento <strong>di</strong> dati dalcomputer a <strong>di</strong>spositivi che permettono all’utente <strong>di</strong> vedere/ascoltare i risultati dell’elaborazione.1.5 Software e Sistema OperativoUn software è una sequenza <strong>di</strong> istruzioni per eseguire le varie elaborazioni sui dati.Ci sono <strong>di</strong>versecategorie <strong>di</strong> software: software per il sistema operativo, software <strong>di</strong> base, software <strong>di</strong> tipo applicativo.Il sistema operativo è costituito dall’insieme dei programmi essenziali per far funzionare la macchina.Esso utilizza piccoli programmi già presenti nel calcolatore per accedere ai singoli <strong>di</strong>spositivi fisici. Questiprogrammi prendono il nome <strong>di</strong> Device Driver e sono memorizzati nel BIOS (Basic Input Output System).Il BIOS si trova nella ROM del Computer.Il sistema operativo, da una parte, permette <strong>di</strong> rendere fruibile all’utente le molteplici risorse del computer(gestione della memoria, della stampante, della tastiera,...); dall’altra rende il computer uno strumentoamichevole e utile per affrontare le molteplici attività che gli si richiedono.I compiti affidati al sistema operativo sono molteplici:G agire da interme<strong>di</strong>ario tra l’utente e l’harware del computerG controllare e coor<strong>di</strong>nare l’utilizzo dell’hardware tra i programmi applicativiG fornire gli strumenti per l’uso corretto delle risorse <strong>di</strong> tipo hardware e software del sistemaG nascondere i dettagli legati alla gestione delle risorse del sistema.6


1.5. Software e Sistema OperativoCenni storiciI primi sistemi operativi iniziarono a vedersi intorno alla metà <strong>degli</strong> anni cinquanta quando si cominciòa in<strong>di</strong>viduare una serie <strong>di</strong> programmi standard <strong>di</strong> comune utilizzo in<strong>di</strong>pendenti dall’applicazione specificarichiesta al computer.L’evoluzione dei sistemi operativi ha influenzato anche lo sviluppo dell’hardware in quanto per supportarecerte funzioni del sistema operativo sono necessari meccanismi hardware ad hoc (basti pensare allagestione della memoria o delle interruzioni).I primi computer come lo Z3 <strong>di</strong> Zuse o l’ENIAC non avevano sistema operativo. Per inserire un programma(scritto in linguaggio macchina) bisognava azionare un gruppo <strong>di</strong> interruttori o mo<strong>di</strong>ficare collegamentitramite opportuni cavi e spinotti. Ci ren<strong>di</strong>amo conto, quin<strong>di</strong>, <strong>di</strong> quanto fosse <strong>di</strong>fficile usare il computer perrisolvere problemi me<strong>di</strong>ante l’esecuzione <strong>di</strong> un programma perchè oltre alla competenza specifica del problemada risolvere, si richiedeva una grande conoscenza tecnica della macchina su cui si doveva lavorare. Ilprogramma doveva contenere non solo le istruzioni per la risoluzione del problema (per esempio un sistema<strong>di</strong> equazioni) ma anche le istruzioni per gestire le unità <strong>di</strong> input e output e delle altre periferiche collegate alcomputer. Infine, poteva essere eseguito un solo programma alla volta.Considerando gli elevatissimi costi per la realizzazione e la gestione dei primi computer, il calcolo auto-7


1. STRUTTURA DELL’ELABORATORESul softwareMemoriacachematico era una risorsa preziosa a <strong>di</strong>sposizione <strong>di</strong> pochi utenti. Tutto ciò portò ad un ripensamento del modo<strong>di</strong> utilizzare i computer e nacquero le prime idee <strong>di</strong> sistema operativo.Per prima cosa si pensò <strong>di</strong> creare delle librerie con le istruzioni necessarie per eseguire le operazionipiù comuni legate alla gestione delle periferiche del computer (ingresso e uscita dei dati, accesso allamemoria,...).Ulteriori progressi si ebbero quando il sistema operativo iniziò a sfruttare anche il <strong>di</strong>sco fisso ed ebbeinizio la cosiddetta multiprogrammazione, in base alla quale nella memoria centrale venivano tenuti attivicontemporaneamente alcuni processi e i loro dati pronti per essere eseguiti. Ad ogni momento, uno solo <strong>di</strong>questi processi veniva eseguito, tuttavia, quando il processo in esecuzione richiedeva un’istruzione <strong>di</strong> ingressoo <strong>di</strong> uscita, esso veniva sospeso attivando le unità periferiche necessarie per l’esecuzione dell’istruzionedata. Questa tecnica richiedeva una elevata capacità della memoria centrale e solo pochi sistemi potevanofunzionare in modo adeguato.Uno dei primi sistemi che iniziò ad utilizzare la multiprogrammazione fu il sistema OS/360 realizzato peri computer IBM 360. Questo sistema operativo fu importante per due motivi:G si cercò <strong>di</strong> realizzare un sistema operativo uniforme e compatibile per macchine IBM molto <strong>di</strong>verse traloro per quando riguarda l’hardware sottostante: fino a quel momento ogni macchina aveva il propriosistema operativo, che cambiava da macchina a macchina!G lo sviluppo <strong>di</strong> questo sistema operativo fu molto delicato e complesso e aprì lo stu<strong>di</strong>o delleproblematiche relative all’ingegneria del software.Nonostante questi progressi, la multiprogrammazione non permetteva molta interattività tra utente ecomputer: <strong>di</strong> fatto l’utente consegnava i dati e il programma da eseguire (un pacco <strong>di</strong> schede perforate) all’operatoredel computer e accedeva ai risultati dopo qualche ora se non ad<strong>di</strong>rittura dopo giorni e giorni, risultatiche riceveva in forma cartacea ad esecuzione avvenuta (non c’era ancora il monitor per la visualizzazionesu video dei risultati).Per risolvere questo tipo <strong>di</strong> problemi, l’uso delle schede fu sostituito da appositi terminali sempre collegatial computer e furono cambiate le modalità <strong>di</strong> gestione dell’unità centrale mo<strong>di</strong>ficando i sistemi operativiesistenti. Si arrivò all’interazione con il computer non più me<strong>di</strong>ante schede perforate bensì tramite tastierastampanteo tramite tastiera-monitor.Alla fine del 1950 si introdusse il concetto <strong>di</strong> time-sharing che permetteva l’esecuzione <strong>di</strong> più processiin modo da poter sod<strong>di</strong>sfare le esigenze <strong>di</strong> più utenti contemporaneamente. Con il time-sharing si assegna,infatti, un piccolo intervallo <strong>di</strong> tempo a ciascun processo dando l’impressione che ciascun processo vadaavanti parallelamente agli altri.Gli sviluppi del sistema operativo ottenuti da allora fino ad oggi si possono così riassumere: il sistemaoperativo fornisce funzioni <strong>di</strong> base per la gestione delle risorse, quali:G uso del processore (multitasking: l’uso della CPU è permesso ad un programma alla volta per breviintervalli <strong>di</strong> tempo, quin<strong>di</strong> l’utente può eseguire più programmi contemporaneamente)G uso della memoria centrale (memoria virtuale)G riconoscimento e gestione <strong>degli</strong> utenti (multiutenza)G gestione delle periferiche (drivers)G file systemG interfaccia grafico.Il software <strong>di</strong> base (o general purpose) può avere funzioni varie: e<strong>di</strong>tor <strong>di</strong> testo, elaborazione <strong>di</strong> testi, foglielettronici, posta elettronica, internet.Il software applicativo è costituito da programmi che hanno obiettivi specifici come intrattenimento,controllo <strong>di</strong> sistemi, progettazione (CAD), risoluzione <strong>di</strong> problemi matematici.Per migliorare le prestazioni <strong>di</strong> un computer si inserisce una memoria interme<strong>di</strong>a tra CPU e RAM, dettacache. Si trova all’interno del processore. È più veloce della RAM ma anche più costosa.1.5.1 Per capire meglio il sistema operativoImmaginiamo un ristorante con un capo-cuoco, il suo aiutante, una cucina, i camerieri e i clienti. I clientiscelgono un piatto dal menu, un cameriere prende l’or<strong>di</strong>ne e lo porta al capo-cuoco. Il capo-cuoco ricevel’or<strong>di</strong>ne e assegna al suo aiutante il compito <strong>di</strong> preparare il piatto. L’aiutante si de<strong>di</strong>cherà alla preparazione8


1.6. Il file systemdel piatto, compito che potrà richiedere più attività. Il capo-cuoco, intanto, supervisiona la preparazione deipiatti e gestisce le risorse (limitate) dei posti nel ristorante.G il capo-cuoco rappresenta il sistema operativo,G i clienti sono gli utenti,G le ricette associate ai piatti corrispondono ai programmi,G gli ingre<strong>di</strong>enti sono l’input del programma,G il piatto è l’output del programma,G il menu e il cameriere sono l’interfaccia verso il sistema operativo,G l’aiutante corrisponde al processore (CPU) (Se abbiamo più processori, ci sono più aiutanti),G la cucina corrisponde al computer,G pentole, fornelli etc, sono le parti che compongono il computer.L’aiuto cuoco, quin<strong>di</strong>, rappresenta la CPU mentre il tavolo da lavoro, su cui appoggia gli ingre<strong>di</strong>enti e laricetta per preparare il piatto, rappresenta la memoria centrale. Prima <strong>di</strong> iniziare a lavorare, il cuoco devesvolgere alcune mansioni (sempre le stesse ogni volta: pulire il tavolo, controllare lo stato <strong>di</strong> pentole, tegami,coltelli. . . , ricevere le or<strong>di</strong>nazioni). Supponiamo che queste mansioni siano incise su un pezzo del tavolo dalavoro: corrispondono alla memoria ROM (quella che non può essere alterata). La RAM invece è la parte deltavolo che può essere alterata a piacimento (spostare pentole, tegami, ingre<strong>di</strong>enti).Quando il ristorante chiude, il tavolo deve essere pulito e sgombro altrimenti si rovina tutto quello che virimane, ad eccezione <strong>di</strong> ciò che vi è stato inciso. Perciò il cuoco conserva in <strong>di</strong>spense e frigoriferi i vari ingre<strong>di</strong>entirimasti e gli utensili da lavoro: le <strong>di</strong>spense e i frigoriferi rappresentano i <strong>di</strong>schi (Hard Disk, CDROM,pen drive USB . . . ) per immagazzinare i dati.1.6 Il file systemIl sistema operativo gestisce le informazioni su <strong>di</strong>spositivi <strong>di</strong> memoria secondaria (<strong>di</strong>schi).La gestione delle informazioni avviene me<strong>di</strong>ante file 11 . Un file costituisce un insieme <strong>di</strong> informazionidella stessa natura e logicamente correlate. In genere un file contiene un programma (programma sorgenteo programma eseguibile), oppure una sequenza <strong>di</strong> dati.L’informazione è rappresentata da files, organizzati in maniera gerarchica (pensiamo ad una struttura adalbero) in <strong>di</strong>rectories (cartelle). Una <strong>di</strong>rectory è un file che svolge il ruolo <strong>di</strong> ”raccoglitore“.I files possono contenere dati (abbiamo i cosiddetti files <strong>di</strong> testo) oppure programmi (i files <strong>di</strong>applicazioni).Un file è caratterizzato da:G posizione (path, o percorso): sequenza delle <strong>di</strong>rectories che portano al file<strong>di</strong>r1 / <strong>di</strong>r2 /.../.../G nome: in<strong>di</strong>vidua univocamente il file all’interno della cartella (o <strong>di</strong>rectory)G estensione: la parte del nome del file che segue l’ultimo punto . (dati.txt prova.f matrice.datwelcome.html foto.jpeg )G <strong>di</strong>mensione: quantità <strong>di</strong> informazione contenuta nel fileG altre informazioni (data <strong>di</strong> creazione, data <strong>di</strong> ultima mo<strong>di</strong>fica, permessi <strong>di</strong> scrittura, lettura. . . )L’intera gestione dei file è a carico <strong>di</strong> un componente del sistema operativo detto file system.1.7 Un po’ <strong>di</strong> storia sui sistemi operativiTra i numerosi sistemi operativi, il sistema Unix è quello che ha maggiormente influenzato questo settoredell’informatica. Il sistem Unix venne sviluppato sul finire <strong>degli</strong> anni sessanta nei laboratori della AT &T. La filosofia <strong>di</strong> base era <strong>di</strong> realizzare un sistema semplice rispetto agli altri in uso e adatto per la ricerca elo sviluppo. La prima versione fu scritta in linguaggio Assembly e <strong>di</strong>pendeva dal tipo <strong>di</strong> macchina su cui si11 File in inglese significa archivio. Il termine compare nei primi anni cinquanta e inizialmente si riferisce a un pacco <strong>di</strong> schedecontenente informazioni omogenee. È il sistema operativo a realizzare il concetto astratto <strong>di</strong> file nella gestione dei <strong>di</strong>spositivi <strong>di</strong> memoria<strong>di</strong> massa.9


1. STRUTTURA DELL’ELABORATOREdoveva applicare. Successivamente venne scritto in larga parte in un linguaggio <strong>di</strong> alto livello, il C, progettatoappositamente per il sistema Unix. In tal modo il sistema operativo <strong>di</strong>ventava facilmente portabile su macchine<strong>di</strong> tipo <strong>di</strong>verso senza <strong>di</strong>pendere eccessivamente dalle caratteristiche dell’hardware su cui veniva fattofunzionare. Diversamente dalle abitu<strong>di</strong>ni del tempo, l’azienda AT & T <strong>di</strong>stribuì Unix nelle università e rese<strong>di</strong>sponibili i co<strong>di</strong>ci sorgenti utilizzati per realizzarlo. Questo portò ad una sua ulteriore innovazione grazie atutti i ricercatori delle università che iniziarono a sperimentarlo.Quando furono messi in commercio i primi microcomputer (a partire dal 1975), fu necessario svilupparesistemi operativi appositamente progettati per sfruttare le poche risorse <strong>di</strong>sponibili essendo le risorse <strong>di</strong>calcolo <strong>di</strong> tali macchine molto limitate. Inoltre, queste macchine erano pensate più per gli appassionati cheper il personale tecnico esperto e quin<strong>di</strong> era importante creare un sistema operativo che fosse d’uso relativamentesemplice. In questo campo si <strong>di</strong>stinsero Bill Gates e Paul Allen, che iniziarono la loro attività scrivendoil linguaggio <strong>di</strong> programmazione Basic per il micromputer Altair. Nel 1975 crearono una <strong>di</strong>tta... la Microsoft.Un altro microcomputer, popolare nei primi anni ottanta, fu l’Apple sviluppato da Steve Wozniak e SteveJobs. Per questa macchina svilupparono un sistema più semplice ed efficiente <strong>di</strong> quello usato per l’Altair, chesi ispirava vagamente al sistema Unix.I sistemi operativi per i microcomputer dovevano essere più semplici <strong>di</strong> quelli impiegati per i gran<strong>di</strong> computer,in quanto la macchina veniva utilizzata da un solo utente e le periferiche collegate erano poche e semplici.Il problema maggiore ero quello <strong>di</strong> gestire i file su floppy <strong>di</strong>sk (gli antenati dei CD-ROM e dei DVD, inuso fino ad una decina <strong>di</strong> anni fa) o su nastri magnetici e mettere a <strong>di</strong>sposizione dell’utente un linguaggio<strong>di</strong> programmazione semplice, come il Basic. Tuttavia, il confine tra linguaggio <strong>di</strong> programmazione e sistemaoperativo non era ancora ben definito e, una volta avviato, il sistema era pronto per ricevere sia coman<strong>di</strong> delsistema operativo, sia istruzioni in linguaggio Basic.I microcomputer iniziarono ad avere un grosso successo tanto che all’inizio <strong>degli</strong> anni ottanta, l’IBM pensò<strong>di</strong> entrare in questo settore (prima si era solo occupata <strong>di</strong> gran<strong>di</strong> computer e <strong>di</strong> software), introducendoil personal computer, IBM PC, realizzando in tal modo una macchina che servisse non solo per gli appassionatie per giocare (uno dei fattori che aveva determinato il successo dei microcomputer) ma anche comestrumento <strong>di</strong> stu<strong>di</strong>o, per i professionisti e per la gestione <strong>di</strong> piccole aziende.L’IBM incaricò Bill Gates <strong>di</strong> realizzare un sistema operativo per il nuovo personal computer. Il successodell’IBM PC portò al successo anche <strong>di</strong> Bill Gates: i profitti della Microsoft iniziarono a crescere in modoesponenziale. Il sistema realizzato dalla Microsoft prese il nome <strong>di</strong> MS-Dos e <strong>di</strong>venne il sistema operativopiù <strong>di</strong>ffuso al mondo grazie alla standar<strong>di</strong>zzazione dei personal computer lanciato dall’IBM.Il sistema MS-Dos non era <strong>di</strong> facile da usare perchè l’utente interagiva con il computer solo attraversocoman<strong>di</strong> testuali la cui sintassi non era così semplice da ricordare (qualche anno più tar<strong>di</strong> fu lanciata sulmercato una versione più amichevole).Nel 1984, invece, dalla Apple fu prodotto il personal computer Macintosh che adottava un tipo <strong>di</strong> interfacciagrafico progettato per interagire in modo semplice e intuitivo con l’utente. Il Macintosh utilizzava uninterfaccia grafico chiamato GUI (Graphic User Interface) composto da icone, finestre, menù... Gli oggettidell’ambiente operativo erano rappresentati con simboli grafici <strong>di</strong> facile intuizione senza dover comprenderea fondo tutti i tecnicismi informatici. L’interfaccia GUI non era un’invezione della Apple perchè era statagià sperimentata nel corso <strong>degli</strong> anni settanta dalla Xerox, che però non aveva intuito le potenzialità <strong>di</strong> questolavoro, lasciandone invece la fortuna e il successo alla Apple che, insieme ad esso, introdusse il mouse.Ovviamente, queste novità furono molto apprezzate e la Microsoft, per colmare questa lacuna, lanciò unaltro sistema operativo basato su interfaccia grafica: nel 1985 nacque il primo Windows 1.0 che trovò pochiconsensi perchè troppo lento e instabile. Nel 1986, con la comparsa <strong>di</strong> nuovi microprocessori, il sistemaWindows cominciò a funzionare in modo adeguato tanto che le versioni <strong>di</strong> Windows 3.1 e <strong>di</strong> Windows 95portarono al sopravvento del sistema operativo Windows rispetto al Macintosh.Accanto a questi sistemi operativi, e forse anche per ridurre lo strapotere della Microsoft, si deve vederela strada percorsa da un informatico <strong>di</strong> Helsinki (data <strong>di</strong> nascita 1969), Linus Bene<strong>di</strong>ct Torvalds, che haintrodotto il sistema Linux.Durante gli stu<strong>di</strong> universitari, Torvalds si era interessato <strong>di</strong> sistemi operativi e aveva stu<strong>di</strong>ato una versionesemplificata <strong>di</strong> Unix, chiamata Minix. Questo sistema poteva funzionare su personal computer e veniva<strong>di</strong>stributo con i programmi sorgenti <strong>di</strong>sponibili. Torvalds migliorò il sistema Minix, in modo da poterlo utilizzarecome alternativa a Windows, nella logica <strong>di</strong> non realizzare profitti (cioè non <strong>di</strong>ventare milionario) ma10


1.8. Lavorare in ambiente Linux<strong>di</strong> realizzare un sistema utilizzabile gratuitamente da tutti e migliorabile con il contributo <strong>di</strong> tutti (la filosofiadell’open source). Nel 1991 fu completata la prima versione del sistema, che fu chiamata Linux e venne messaa <strong>di</strong>sposizione <strong>di</strong> tutti. Torvalds si riservò il compito <strong>di</strong> coor<strong>di</strong>nare i <strong>di</strong>versi miglioramenti via via introdottidagli altri sviluppatori.Tra le tante <strong>di</strong>stribuzioni attualmente in uso ricor<strong>di</strong>amo: Debian, Ubuntu, Fedora, Gentoo, Slackware. . .Linux si è <strong>di</strong>mostrato e si <strong>di</strong>mostra tuttora un valido sistema operativo, affidabile, sicuro e <strong>di</strong> buoneprestazioni, in grado <strong>di</strong> gestire situazioni multiutente e multitasking.Ed è il sistema operativo <strong>di</strong> riferimento del corso <strong>di</strong> <strong>Calcolo</strong> <strong>Numerico</strong>.1.8 Lavorare in ambiente LinuxUna volta entrati nel sistema (tramite login e password), si apre l’ambiente grafico e <strong>di</strong> qui possiamolavorare (per esempio, aprire una finestra <strong>di</strong> e<strong>di</strong>tor, lavorare in Office, navigare in Internet ....).Per aprire nuove <strong>di</strong>rectories (cartelle), per spostare files, per eseguire programmi FORTRAN, ... è benelavorare tramite una finestra <strong>di</strong> terminale o shell.La finestra <strong>di</strong> terminale (shell) mostra il prompt dei coman<strong>di</strong>.Un esempio <strong>di</strong> prompt è la login dell’utente (ad esempio studente) + chiocciola + nome della macchinasu cui si sta lavorando (ad esempio george) + attuale <strong>di</strong>rectory <strong>di</strong> lavoro (se non compare nessun nome, èperchè ci troviamo nella home <strong>di</strong>rectory, la <strong>di</strong>rectory principale dell’utente) + un simbolo (% o $, a secondadella macchina):studente@george:~ $Ve<strong>di</strong>amo ora alcuni coman<strong>di</strong> essenziali (coman<strong>di</strong> da scrivere dopo il prompt, in una finestra <strong>di</strong> terminale– dopo<strong>di</strong>chè si clicca il tasto <strong>di</strong> Invio):G ls mostra l’elenco dei files e delle <strong>di</strong>rectories contenuti nella <strong>di</strong>rectory attuale ( ls sta per list):Esempio:studente@george:~ $ lsUn volta cliccato Invio, compare l’elenco delle <strong>di</strong>rectories presenti nello spazio <strong>di</strong> lavoro <strong>di</strong>sponibile perl’utente studente sulla macchina george, ad esempio (i numeri a sinistra delle <strong>di</strong>rectories o files sonoin<strong>di</strong>catori dello spazio che occupano in memoria):5 appunti/ 4 mail/2 calcolonumerico/ 4 movies/3 fortran/ 1 varie/3 foto/ 57 prova.pdfG Per cambiare <strong>di</strong>rectory, si deve <strong>di</strong>gitare cd nome-<strong>di</strong>rectory(cd sta per change <strong>di</strong>rectory). Esempio: per entrare nella <strong>di</strong>rectory foto, scriviamostudente@george:~ $ cd fotoUna volta cliccato il tasto <strong>di</strong> Invio, si è entrati nella <strong>di</strong>rectory foto:studente@george:~/foto $Il comando cd .. fa tornare nella <strong>di</strong>rectory precedente.Per creare una nuova <strong>di</strong>rectory: mk<strong>di</strong>r nome<strong>di</strong>rectory (mk<strong>di</strong>r sta per make <strong>di</strong>rectory).Per copiare un file dentro una <strong>di</strong>rectory: cp nomefile nome<strong>di</strong>rectory (cp sta per copy).Per trasferire un file in una <strong>di</strong>rectory mv nomefile nome<strong>di</strong>rectory (mv sta per move).Per rinominare un file (o una <strong>di</strong>rectory): mv nomevecchio nomenuovo .Per cancellare un file si usa il comando rm nomefile.G Per cancellare una <strong>di</strong>rectory, dobbiamo prima cancellare tutti i files della <strong>di</strong>rectory e poi usare ilcomando rm<strong>di</strong>r nome<strong>di</strong>rectory.11


1. STRUTTURA DELL’ELABORATOREG Per sapere in quale <strong>di</strong>rectory ci troviamo, si usa il comando pwd. Esempio: siamo nella <strong>di</strong>rectory foto,che è una sotto<strong>di</strong>rectory della home <strong>di</strong> studente. Con il comando pwd si ha:studente@george:~/foto $ pwdstudente@george:~/foto $ /home/studente/fotoEsempio 1.8.1 Abbiamo due <strong>di</strong>rectory chiamate uno e due e il file prova.f nella <strong>di</strong>rectory uno.Vogliamo copiare il file dalla <strong>di</strong>rectory uno alla <strong>di</strong>rectory due.Se ci troviamo nella home, cioè nell’ambiente <strong>di</strong> partenza, dobbiamo scriverecp uno/prova.f duestudente@george:~ $ cp uno/prova.f dueSe ora passiamo nella <strong>di</strong>rectory due e facciamo ls, vedremo il file prova.fstudente@george:~ $ cd duestudente@george:~/due $ lstotal 11 prova.fSe siamo nella <strong>di</strong>rectory uno, dobbiamo scriverecp prova.f ../due per ottenere lo stesso risultato.Se siamo nella <strong>di</strong>rectory due, dobbiamo scriverecp ../uno/prova.f . Il punto finale serve per copiare il file prova.f nella <strong>di</strong>rectory in cui citroviamo.Con cp abbiamo due file identici, quello nella <strong>di</strong>rectory uno e quello copiato nella <strong>di</strong>rectory due.Possiamo anche scrivere cp prova.f prova2.f: in questo modo creiamo il file prova2.f nellastessa <strong>di</strong>rectory in cui si trova prova.f.Se vogliamo trasferire il file dalla <strong>di</strong>rectory uno alla <strong>di</strong>rectory due (in questo modo avremo solo un filealla fine del proce<strong>di</strong>mento), dobbiamo usare il comando mv.RiassumendoG ls : lista dei files e delle <strong>di</strong>rectoryG cd : per cambiare <strong>di</strong>rectoryG mk<strong>di</strong>r: per creare una nuova <strong>di</strong>rectoryG cp: per copiare filesG mv: per trasferire o rinominare filesG rm: per cancellare filesG rm<strong>di</strong>r: per cancellare <strong>di</strong>rectories1.9 E<strong>di</strong>tor <strong>di</strong> testoSe vogliamo scrivere su un file un documento <strong>di</strong> testo, abbiamo bisogno <strong>di</strong> un e<strong>di</strong>tor <strong>di</strong> testo. Sotto Linuxne troviamo <strong>di</strong>versi: vi, emacs, ke<strong>di</strong>t, ge<strong>di</strong>t, ne<strong>di</strong>t.... I più semplici da utilizzare sono ge<strong>di</strong>t e ne<strong>di</strong>t.Sotto Linux esiste anche il pacchetto Office (del tutto simile all’equivalente Microsoft) per scriveredocumenti in word, creare tabelle, etc. . . . Anche il programma Gnumeric è molto utile per creare tabelle.Per visualizzare grafici, invece, c’è il pacchetto Gnuplot.12


C A P I T O L O2RICHIAMI DI ANALISILa teoria attrae la pratica come ilmagnete attrae il ferro.Carl Friedrich Gauss2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2 Identità trigonometriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.3 Regole su funzione esponenziale e logaritmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.4 Derivate e integrali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.5 Teoremi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1 IntroduzioneQuando si descrivono teoremi, si danno definizioni o, semplicemente, si <strong>di</strong>scute <strong>di</strong> matematica, èabbastanza usuale prendere in prestito lettere dell’alfabeto greco.È importante, quin<strong>di</strong>, saperle riconoscere e chiamarle in maniera corretta:A α Alfa N ν NuB β Beta Ξ ξ XiΓ γ Gamma O o Omicron∆ δ Delta Π π PiE ɛ Epsilon P ρ RhoZ ζ Zeta Σ σ SigmaH η Eta T τ TauΘ θ Theta Υ υ UpsilonI ι Iota Φ φ FiK κ Kappa X χ ChiΛ λ Lambda Ψ ψ PsiM µ Mu Ω ω Omega13


2. RICHIAMI DI ANALISI2.2 Identità trigonometricheNel seguito introduciamo alcune formule trigonometriche, con la notazione:G sin(x) ≡ seno(x), cos(x) ≡ coseno(x),G tan(x) ≡ tangente(x) = sin(x)cos(x) , sec(x) ≡ secante(x) = 1cos(x) ,cos(−θ) = cos(θ)cos( π 2− θ) = sin(θ)sin(cos( π 2+ θ) = −sin(θ)sin(cos(π − θ) = −cos(θ)cos(π + θ) = −cos(θ)cos(θ + φ) = cos(θ)cos(φ) − sin(θ)sin(φ)sin(2θ) = 2sin(θ)cos(θ)sin 2 (θ) + cos 2 (θ) = 1sin(−θ) = −sin(θ)π2− θ) = cos(θ)π2+ θ) = cos(θ)sin(π − θ) = sin(θ)sin(π + θ) = −sin(θ)sin(θ + φ) = sin(θ)cos(φ) + cos(θ)sin(φ)cos(2θ) = cos 2 (θ) − sin 2 (θ)tan 2 (θ) + 1 = sec 2 (θ)2.3 Regole su funzione esponenziale e logaritmicaAssumiano a,b ∈ R, con a > 0 e b > 0. Si ha:1 x = 1a x+y = a x a ya x y = (a x ) ya log a (x) = x a 0 = 1a x−y = a x /a ya x b x = (ab) xlog a (x y) = log a (x) + log a (y)log a (x/y) = log a (x) − log a (y)log a (x y ) = y log a (x)log a (a x ) = xlog b (x) = log a (x)log a (b)b x = a x log a (b)2.4 Derivate e integraliSiano f e g due funzioni <strong>di</strong>pendenti dalla variabile reale x mentre c ∈ R sia una costante. In<strong>di</strong>chiamo laderivata <strong>di</strong> f con il simbolo d fd x o me<strong>di</strong>ante f ′ . Si ha:d (k f )= k f ′d xregola della costanted (f + g )= d fd x d x + d gd xregola della sommad (f /g )= f ′ g − f g ′d x g 2regola del quoziented (f g )= f g ′ + f ′ gd xregola del prodottod f rd x = r f r −1 f ′ regola della potenzaTra le regole <strong>di</strong> integrazione, invece, ricor<strong>di</strong>amo quella <strong>di</strong> integrazione per parti:∫∫f g ′ dx = f g − f ′ g dx14


2.5. Teoremi utiliDiamo ora una tabella delle derivate e <strong>degli</strong> integrali delle funzioni più note (per gli integrali lasciamofuori la costante <strong>di</strong> integrazione), e con la simbologia arcsin(x) ≡ arcoseno(x), arccos(x) ≡ arcocoseno(x),cot(x) ≡ cotangente (x), arctan(x) ≡ arcotangente(x), ar ccot(x) ≡, arcocotangente(x).ff f ′ f f ′1ln(x)e xe xxsin(x) cos(x) cos(x) −sin(x)1tan(x)cos 2 (x) (= 1sec2 (x)) cot(x) −sin 2 (x)1111tan(x)−cot(x)cos(x)cos(x)sin(x)sin(x)11arcsin(x) arccos(x) − 1 − x21 − x21arctan(x)1 + x 2 ar ccot(x) − 11 + x 2x r x r +1∫f d x f∫f d xr + 1 (r ≠ 1) x−1 ln|x|e x e x ln|x| x ln|x| − xsin(x) −cos(x) cos(x) sin(x)tan(x)1ln| |cos(x)cot(x) ln|sin(x)|1cos(x)1ln|cos(x) + tan(x)| 1sin(x)1ln|sin(x) + cot(x)|1cos 2 (x)tan(x)1sin 2 (x)−cot(x)tan(x)cos(x)1cos(x)cot(x)sin(x)− 1sin(x)arcsin(x) x arcsin(x) + 1 − x 2 arccos(x) x arccos(x) − 1 − x 2arctan(x) x arctan(x) − 1 2 ln(1 + x2 ) ar ccot(x) xar ccot(x) − 1 2 ln(1 + x2 )11 − x22.5 Teoremi utiliarcsin(x)11 + x 2 arctan(x)Richiamiamo, nel seguito, teoremi che trovano applicazione nel <strong>Calcolo</strong> <strong>Numerico</strong>.Utilizzeremo, inoltre, le seguenti notazioni per funzioni <strong>di</strong> una sola variabile definite in un insieme X ⊂ R.L’insieme delle funzioni continue in X verrà denotato con il simbolo C (X ). L’insieme delle funzioni continuein X , che hanno le prime n derivate pure esse continue, sarà in<strong>di</strong>cato con C n (X ).Notazioniusate per lefunzionicontinue15


2. RICHIAMI DI ANALISITeorema 2.5.1 (Teorema <strong>di</strong> Rolle) a Siaf ∈ C ([a,b]) e <strong>di</strong>fferenziabile in ]a,b[.Se f (a) = f (b) = 0, allora esiste un punto ξ ∈]a,b[tale che f ′ (ξ) = 0a Michel Rolle (1652- 1719) fu un matematico francese. Èconosciuto per il teorema che porta il suo nome. Si deve a luila notazione della ra<strong>di</strong>ce n-sima per mezzo del simbolo n x.Teorema 2.5.2 (Teorema del Valor Me<strong>di</strong>o)Se f ∈ C ([a,b]) ed è <strong>di</strong>fferenziabile in ]a,b[,allora esiste un punto ξ ∈]a,b[ tale chef ′ f (b) − f (a)(ξ) =b − aTeorema 2.5.3 (Teorema del Valor Me<strong>di</strong>o del <strong>Calcolo</strong> Integrale) Se f ∈ C ([a,b]) e g è integrabile in [a,b] eg (x) non cambia segno in [a,b], allora esiste un punto ξ ∈]a,b[ tale che∫ baf (x)g (x) d x = f (ξ)∫ bag (x) d xPer g ≡ 1, questo teorema ci dà il valore me<strong>di</strong>o della funzione f sull’intervallo [a,b], dato da f (ξ) =1 ∫ bab − af (x) d xTeorema 2.5.4 (Teorema <strong>di</strong> Rolle generalizzato) Sia f ∈ C ([a,b]) n volte <strong>di</strong>fferenziabile in ]a,b[. Se f si annullain n +1 punti <strong>di</strong>stinti x 0 , x 1 ,..., x n in ]a,b[, allora esiste un punto ξ ∈]a,b[ in cui la derivata n-sima dellaf si annulla: f (n) (ξ) = 0.Teorema 2.5.5 (Teorema del Valore Interme<strong>di</strong>o)Sia f ∈ C ([a,b]) e sia K un valore compreso tra f (a)e f (b). Allora esiste almeno un punto ξ ∈]a,b[ taleche f (ξ) = K .Quin<strong>di</strong> per funzioni continue, un valore compreso tra i due estremi dell’insieme <strong>di</strong> definizione, è un valoreassunto dalla funzione stessa (in uno o più punti).Come conseguenza <strong>di</strong> questo teorema, se f (a)f (b) < 0 (la funzione assume segno opposto agli estremidell’intervallo [a,b]) allora esiste almeno un punto ξ tale che f (ξ) = 0, cioè esiste almeno una ra<strong>di</strong>cedell’equazione f (x) = 0 nell’intervallo [a,b].16


2.5. Teoremi utiliTeorema 2.5.6 (Formula <strong>di</strong> Taylor) 1Sia f ∈ C 2 ([a,b]) e sia x 0 un punto dell’intervallo [a,b]. Allora, per qualunque x ∈ [a,b] si può scrivere:f (x) = f (x 0 ) + f ′ (x 0 )(x − x 0 ) + (x − x 0) 2f ′′ (ξ x )2dove ξ x è un opportuno punto <strong>di</strong> [a,b] che si trova sul segmento in<strong>di</strong>viduato da x 0 e x.La formula appena scritta si <strong>di</strong>ce formula <strong>di</strong> Taylor <strong>di</strong> centro x 0 nel punto x.La formula <strong>di</strong> Taylor appena scritta si può generalizzare se la funzione f è derivabile n +1 volte. Si ha cosìla formula polinomiale <strong>di</strong> Taylor <strong>di</strong> centro x 0 :dovef (x) = f (x 0 ) + f ′ (x 0 )(x − x 0 ) + f ′′ (x 0 )2!(x − x 0 ) 2 + ... + f (n) (x 0 )(x − x 0 ) n + R nn!R n (x) = f (n+1) (ξ x )(x − x 0 ) n+1(n + 1)!con ξ x un opportuno punto <strong>di</strong> [a,b] che si trova sul segmento in<strong>di</strong>viduato da x 0 e x.1 Brook Taylor (1685 - 1731) fu un matematico inglese che sviluppò quello che oggi è chiamato calcolo delle <strong>di</strong>fferenze finite.L’importanza del suo lavoro e, soprattutto, della formula conosciuta oggi con il suo nome, venne riconosciuta solo nel 1772 da Lagrange.17


C A P I T O L O3RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORETutti noi ogni giorno usiamo lamatematica: per prevedere il tempo,per <strong>di</strong>re l’ora, per contare il denaro.Usiamo la matematica anche peranalizzare i crimini, comprenderegli schemi, prevedere icomportamenti. Usando i numeri,possiamo svelare i più gran<strong>di</strong>misteri della vita!NUMB3RS3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.2 Aritmetica <strong>di</strong> macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.3 Conversione <strong>di</strong> base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.4 Rappresentazione IEEE dei numeri <strong>di</strong> macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.5 Precisione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.6 Propagazione <strong>degli</strong> errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.7 Instabilità e malcon<strong>di</strong>zionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.7.1 Instabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.7.2 Malcon<strong>di</strong>zionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.1 IntroduzioneMolte volte, si pensa che i risultati numerici ottenuti da un calcolatore elettronico, specie se sono ottenuticome output <strong>di</strong> un sofisticato software, non contengano errori e, se ne abbiano, siano da ritenersitrascurabili. In realtà, quando si esegue un programma al calcolatore, bisogna prima <strong>di</strong> tutto aver verificatoche sia stato scritto correttamente (il programma deve, cioè, tradurre correttamente il problema matematicoche si vuole risolvere). Inoltre, bisogna tener conto che i risultati numerici sono sempre affetti daun certo tipo <strong>di</strong> errore (che può <strong>di</strong>pendere, per esempio, dall’arrotondamento – π è un numero con infinitecifre decimali ma il calcolatore lo può vedere solo come un numero con finite cifre decimali, introducendocosí un errore nei risultati – o dal troncamento – molte formule non possono essere usate così19


3.2. Aritmetica <strong>di</strong> macchinaFigura 3.2: L’esplosione <strong>di</strong> Ariane 5Il 23 settembre 1999 si perdono le tracce del veicolo spaziale Mars Climate Orbiter. Gli obiettivi <strong>di</strong> questamissione della NASA erano sia <strong>di</strong> monitoraggio dei cambiamenti climatici sia <strong>di</strong> supporto per la missioneMars Polar Lander. I costi della Climate Orbiter e della Polar Lander erano <strong>di</strong> un totale <strong>di</strong> oltre 320 milioni <strong>di</strong>dollari.Si era ipotizzato <strong>di</strong> entrare nell’atmosfera <strong>di</strong> Marte ad una altezza <strong>di</strong> circa 150 km mentre il veicolo spazialeentrò ad una altezza <strong>di</strong> circa 60 km. Per un errore <strong>di</strong> conversione delle unità <strong>di</strong> misura, il velivolo entrònell’atmosfera con una traiettoria inferiore rispetto a quella pianificata. La velocità del mezzo era moltoelevata e portò alla <strong>di</strong>struzione non solo del veicolo spaziale ma anche della stessa Polar Lander.Diversi furono i motivi che portarono al fallimento <strong>di</strong> questa missione. Il principale è dovuto al fallimentodell’operazione <strong>di</strong> riconoscere e correggere un errore nel trasferimento <strong>di</strong> informazioni tra il team che lavoravasul veicolo spaziale, che si trovava in Colorado e il team della missione <strong>di</strong> navigazione, che lavoravain California. Un team usava le unità inglesi (inches, feet, pounds) mentre l’altro usava le unità metriche.L’errore fu, appunto, nella conversione delle unità <strong>di</strong> misura tra unità inglesi e unità metriche!Figura 3.3: La Mars Climate Orbiter3.2 Aritmetica <strong>di</strong> macchinaUn qualunque numero reale può essere rappresentato accuratamente da una sequenza <strong>di</strong> infinite cifredecimali.Ad esempio:13 = 0.3333333... = ( 010 0 + 310 1 + 310 2 + 310 3 + 310 4 ... )× 10 0 21


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE( 3π = 3.14159265358979... =10 0 + 110 1 + 410 2 + 110 3 + 5 )10 4 ... × 10 0Osserviamo che abbiamo scritto 1/3 e π in base 10, usando, quin<strong>di</strong>, le cifre 0,1,2,...,9 per poterlirappresentare.In genere, un numero reale x può essere rappresentato in base N comex = x m N m + x m−1 N m−1 + ... + x 1 N + x 0 + x −1 N −1 + x −2 N −2 + ... x −n N −n} {{ }parte intera} {{ }parte frazionariaEsempiodove m e n sono interi naturali e x k , k = m,m − 1,...,−n sono interi naturali compresi tra 0 e N − 1.In base 10, il numero 726.625, scritto in forma estesa è dato dalla forma:7 × 10 2 + 2 × 10 1 + 6 + 6 × 10 −1 + 2 × 10 −2 + 5 × 10 −3Tuttavia, i calcolatori hanno una memoria finita per poter rappresentare i numeri. Ciò significa che solouna sequenza finita <strong>di</strong> cifre possono essere usate. Inoltre, i calcolatori lavorano in base binaria, quin<strong>di</strong> ogninumero può essere rappresentato me<strong>di</strong>ante una sequenza <strong>di</strong> 0 e 1.Avendo in mente questi due fattori, possiamo ora capire la rappresentazione dei numeri al calcolatore,per cui ad ogni numero reale x è associato il numero <strong>di</strong> macchina denotato come f l(x), in rappresentazionefloating point – virgola mobile.3.3 Conversione <strong>di</strong> baseNel seguito, non affronteremo gli aspetti teorici del passaggio da una base ad un altra per rappresentarelo stesso numero, ma vedremo l’implementazione pratica per convertire un numero dalla base 10 alla base 2e viceversa.Il passaggio <strong>di</strong> un numero dalla rappresentazione in base 2 alla rappresentazione in base 10 è semplice, inquanto si tratta <strong>di</strong> scrivere il numero come combinazione delle opportune potenze <strong>di</strong> 2. Ve<strong>di</strong>amo un esempio.Esempio 3.3.1 Sia 10001000.010 il numero scritto in base 2.Se lo scriviamo me<strong>di</strong>ante le potenze <strong>di</strong> 2 si ha:10001000.010 = 1 · 2 7 + 0 · 2 6 + 0 · 2 5 + 0 · 2 4 + 1 · 2 3 + 0 · 2 2 + 0 · 2 1 + 0 · 2 0 +} {{ }parte intera0 · 2 −1 + 1 · 2 −2 + 0 · 2 −2= 2 7 + 2 3 + 2 −2 = 128 + 8 + 0.25 = 136.25Questo è quin<strong>di</strong> lo stesso numero ma rappresentato in base 10.} {{ }parte frazionariaIl passaggio <strong>di</strong> un numero dalla rappresentazione in base 10 a quella in base 2 si effettua, invece, in duepassi.GSi prende la parte intera del numero e la si <strong>di</strong>vide per 2: se il resto della <strong>di</strong>visione è zero, allora la corrispondentecifra binaria sarà 0; se il resto è <strong>di</strong>verso da zero, la corrispondente cifra binaria sarà 1. Si ripete22


3.4. Rappresentazione IEEE dei numeri <strong>di</strong> macchinala procedura sul risultato avuto dalla <strong>di</strong>visione, fino a quando si arriva a 1. In tal modo, calcoliamo le cifrebinarie a partire da x 0 (il primo resto ottenuto) e andando avanti con in<strong>di</strong>ce crescente.GSi prende la parte frazionaria del numero e la si moltiplica per 2. Se il risultato dell’operazione ha laparte intera <strong>di</strong>versa da zero, allora la corrispondente cifra binaria vale 1, altrimenti vale 0. Si ripete la procedurasulla parte frazionaria del risultato appena ottenuto e si continua fino a quando si arriva allo zero (o sesi vede che c’è una perio<strong>di</strong>cità nei risultati). Le cifre binarie vengono costruite da x −1 con in<strong>di</strong>ce decrescente.Esempio 3.3.2 Vogliamo convertire il numero 725.625 dalla base 10 nella base 2.Per la parte intera si ha:Per la parte decimale si ha :: 2 = quoziente resto.625 × 2 = 1.250 x725 362 1 x −1 = 10.250 × 2 = 0.50 x362 181 0 x −2 = 01.5 × 2 = 1.0 x181 90 1 x −3 = 12.0 × 2 = 0.090 45 0 x 31 0 1 x 945 22 1 x 422 11 0 x 511 5 1 x 65 2 1 x 72 1 0 x 8In base 2 il numero <strong>di</strong>venta 1011010101.101.Osserviamo che un numero può avere una rappresentazione finita in base 10 e infinita in base 2. Ve<strong>di</strong>amoin dettaglio un esempio:Esempio 3.3.3 Scriviamo il numero 11 , che è 1.1 in base 10, nella base 2.10Per la parte intera:Per la parte decimale:: 2 = quoziente resto.1 × 2 = 0.2 x1 0 1 x −1 = 00.2 × 2 = 0.4 x −2 = 0.4 × 2 = 0.8 x −3 = 0.8 × 2 = 1.6 x −3 = 1.6 × 2 = 1.2 x −4 = 1.2 × 2 = 0.4 x −5 = 0.4 × 2 = 0.8 x −6 = 0.8 × 2 = 1.6 x −7 = 1.6 × 2 = 1.2 x −8 = 1.2 × 2 = 0.4 x −9 = 0Osserviamo che nella parte decimale si ripetono all’infinito le cifre 0011. Il numero in base 2 si scrive quin<strong>di</strong>come: 1.00011} {{ } 0011 } {{ } ...3.4 Rappresentazione IEEE dei numeri <strong>di</strong> macchinaLo sviluppo dei calcolatori ha promosso e sviluppato l’uso del sistema binario, in cui ciascun numero èrappresentato da una successione <strong>di</strong> cifre binarie (0 e 1). Ma come avviene la rappresentazione <strong>di</strong> un nume-23


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATOREro nel calcolatore? Come rappresentare un numero a infinite cifre in maniera accurata utilizzando solo unnumero finito <strong>di</strong> cifre?Lo standard IEEE (Institute of Electrical and Electronics Engineers), oggi utilizzato dalla maggior parte deicalcolatori, è dato dalla rappresentazione in virgola mobile (floating point). Esiste anche un tipo <strong>di</strong> rappresentazionein virgola fissa (fixed point), ma in genere è preferita quella in floating point, e noi ci soffermeremosolo su questa.Ripren<strong>di</strong>amo l’esempio proposto in Sezione 3.2, dove abbiamo scritto 1 in base 10 come3(103 = 0.3333333... = 10 0 + 310 1 + 310 2 + 310 3 + 3 )10 4 ... × 10 0Questo è un esempio <strong>di</strong> numero scritto in virgola mobile: un qualunque numero x, in base 10, si puòscrivere sotto la forma x = f 10 e dove f rappresenta la mantissa del numero e e è l’esponente (intero) dellabase con cui stiamo rappresentando il numero stesso, che dà informazioni sulla parte intera del numero.Ci sono <strong>di</strong>verse rappresentazioni in virgola mobile, tutte equivalenti tra loro. Per esempio 12.5 = 1.25 ×10 1 = 0.125 × 10 2 = 0.000125 × 10 5 . Si parla <strong>di</strong> virgola mobile normalizzata quando la mantissa è del tipo1.qual cosa.La rappresentazione in virgola mobile normalizzata in base 2 è quella utilizzata nello standard IEEE: inumeri si possono scrivere nella forma x = f 2 e . Al calcolatore, tuttavia, non possiamo rappresentare numericon una mantissa a infinite cifre, perciò f = ±1.f −1 f −2 ... f −n e e = ±e Ne−1 e Ne−2 ...e 0 ., dove f −1 , f −2 ,..., f −n ,e e Ne−1 ,e Ne−2 ,...,e 0 sono le cifre che caratterizzano rispettivamente la mantissa e l’esponente del numeroin virgola mobile normalizzata in base 2, e quin<strong>di</strong> possono valere 1 o 0. Abbiamo n cifre per la mantissa (inrealtà sono n + 1 ma poichè la rappresentazione è normalizzata f 0 = 1) e Ne per l’esponente. Nel sistemabinario, le cifre vengono chiamate bits ( binary <strong>di</strong>gits): quin<strong>di</strong> n bits sono riservati per la mantissa, Ne perl’esponente.Un numero in floating point nella rappresentazione IEEE viene scritto comex = ±(1 + f −1 2 −1 + f −2 2 −2 + ... + f −n 2 −n ) × 2 edoveG 1+ f −1 2 −1 + f −2 2 −2 +...+ f −n 2 −n è la mantissa, normalizzata, cui sono riservatiun numero n <strong>di</strong> bits,G e è la potenza della base 2 cui sono riservati un numero Ne <strong>di</strong> bits ed èlimitato a variare in un determinato intervallo [L,U ].Il primo 1 della mantissa (che corrisponde a f 0 ) non viene messo in memoria ma c’è. La rappresentazionein virgola mobile può essere schematizzata nel modo seguente (s, e ed f rappresentano i bits riservatirispettivamente per il segno della mantissa, le cifre per l’esponente e quelle per la mantissa):s e e e e e ··· ··· e f f f f f ··· ··· f}{{}segno} {{ }cifre dell’esponente} {{ }cifre della mantissaAbbiamo 1 bit riservato al segno (si ha 0 per il segno + e 1 per il segno −), un numero Ne <strong>di</strong> bits perl’esponente 2 e , e un numero n <strong>di</strong> bits per la mantissa.La scelta del numero <strong>di</strong> bits da riservare all’esponente e alla mantissa si basa su un compromesso tra la<strong>di</strong>mensione dell’esponente (e quin<strong>di</strong> il più piccolo e il più grande numero rappresentabile) e la <strong>di</strong>mensionedella mantissa (e quin<strong>di</strong> la precisione del numero rappresantibile, più o meno cifre decimali).Nel sistema IEEE, la rappresentazione in singola precisione è a 32 bits mentre quella in doppia precisioneè a 64 bits. La sud<strong>di</strong>visione dei bits tra esponente e mantissa viene ripartita nel modo seguente:24


3.4. Rappresentazione IEEE dei numeri <strong>di</strong> macchinas Ne n # totale bitsSingola precisione 1 8 23 32Doppia precisione 1 11 52 64Gli esponenti possono essere sia positivi sia negativi ma si preferisce memorizzarli come interi positivi(senza segno). Abbiamo dunque bisogno <strong>di</strong> una tecnica che permetta <strong>di</strong> rappresentare esponenti negativicome interi positivi. La tecnica utilizzata nello standard IEEE è chiamata <strong>di</strong> biasing (<strong>di</strong>storsione): un numeropositivo (detto bias) viene aggiunto all’esponente (sia esso positivo o negativo) in modo che il risultato finalesia sempre positivo. Ed è questo valore che viene memorizzato per rappresentare l’esponente. L’esponenteviene quin<strong>di</strong> rappresentato in forma biased (parziale, influenzata da un altro numero): se e è l’esponenteeffettivo, noi memorizziamo il valore b + e dove b è il bias dato b = 0111...1} {{ }, vale a <strong>di</strong>re b = 1 + 2 + 2 2 + ... +Ne bits2 Ne−2 + 0 · 2 Ne−1 = 1 − 2Ne−1= 2 Ne−1 − 1 (si veda la nota alla pagina seguente per capire perchè si ha questo1 − 2valore per b).Per trovare il limite superiore e inferiore entro cui può variare e, dobbiamo tener conto del fatto che, nellarappresentazione IEEE, due patterns <strong>di</strong> bits sono riservati per rappresentare numeri speciali quali lo zero,infinito e il Not-a-Number, precisamente 0000...0 e 1111...1.Quin<strong>di</strong>, b + e non può essere uguale nè a 0000...0, nè a 1111...1. Ciò significa che il massimo esponenteche si può rappresentare è dato sottraendo a 1111...1 il valore 1 in base 2, cioè da 1111...1 − 0000...01 =1111...10.Si ha b + e ≤ 1111...10, o equivalentemente, 0111...1 + e ≤ 1111...10, da cui ricaviamoe ≤ 1111...10 − 0111...1 = 0111...1 = b.Il limite superiore U è proprio uguale a b.Per il limite inferiore abbiamo: 0000...0 < b + e cioè, equivalentemente,−b < e ⇔ −b + 0000...01 ≤ e.Quin<strong>di</strong> il limite inferiore è L = −(b − 1).In singola precisone, b = 0111...1} {{ }: in base 10 b = 127 10 , da cui l’intervallo [L,U ] = [−126,127].8 bitsIn doppia precisione, invece, b = 1023 10 da cui [L,U ] = [−1022,1023].Per quanto riguarda la mantissa, sono ad essa riservati n bits. Considerando anche l’1 dellanormalizzazione, la precisione è <strong>di</strong> n + 1 bits.Il più grande numero che si può rappresentare è, quin<strong>di</strong> 1n∑1.111...1} {{ }×2 U = ( 2 −k ) × 2 U = 1 − 2−(n+1)k=01 − 2 −1 2 U = (2 − 2 −n )2 U ≈ 2 U+1n bitsIl più piccolo numero positivo rappresentabile è dato, invece, da:1.000...0} {{ }×2 L = 2 Ln bitsSe si vuole rappresentare un numero al <strong>di</strong> fuori <strong>di</strong> questo intervallo si ha overflow o underflow.In singola e doppia precisione abbiamo, per il più grande e il più piccolo numero positivo rappresentabile,i seguenti valori:1 È il risultato <strong>di</strong> una somma del tipo S = 1 + a + a 2 + ... + a n e vale il risultato S = 1 − a(n+1) , con a = 1 1 − a2 = 2−1 . Osserviamo, inoltre,che, dati n valori w 1 , w 2 ,..., w n usiamo la seguente simbologia per in<strong>di</strong>care la loro somma:.n∑w i = w 1 + w 2 + w 3 + ... w ni=125


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORESingola precisione Doppia precisioneMassimo ≈ 3.4 × 10 38 ≈ 10 308Minimo ≈ 1.2 × 10 −38 ≈ 2.2 × 10 −308Esempio 3.4.1 Vogliamo scrivere il numero 5.75 10 in formato IEEE in singola precisione.Effettuiamo prima la conversione in base 2:Per la parte intera:Per la parte decimale:5 2 1 x 0.75 × 2 = 1.50 x −1 = 12 1 0 x 1.5 × 2 = 1.0 x −2 = 11 0 1 x 2 .0 × 2 = 0.0Quin<strong>di</strong> 5.75 10 = 101.11 2 = 1.0111 × 2 2 .Memorizziamo ora il numero in singola precisione:Per l’esponente, essendo p = 2, si ha:(b + p) 10 = (127 + 2) 10 = 129 10 = 10000001 2Per la mantissa, m = 23 e si deve trascurare l’1 della normalizzazione, quin<strong>di</strong> memorizzeremo le cifre 0111e poi avremo tutti 0.0 1 1 1 0 0 0 ... 0 0 0 0 0 0 0 0 0 0Il segno è positivo, quin<strong>di</strong> s = 0Perciò la memorizzazione, considerati i bits per il segno, l’esponente e la mantissa è:0 1 0 0 0 0 0 0 1 0 1 1 1 0 ... 0 0 0 0 0}{{}s} {{ }esponente} {{ }manti ssaConsideriamo, ora, la rappresentazione dei numeri speciali.Per convenzione si pone uguale a 0 la rappresentazione che vede tutti zero sia nel segno, sia nell’esponenteche nella mantissa (non <strong>di</strong>mentichiamo che il valore 1 della normalizzazione non è messo in memoriama c’è e quin<strong>di</strong> non potremmo mai avere il valore 0, perciò lo si pone per convenzione).Per i valori ±∞ si considerano tutti 1 nello spazio de<strong>di</strong>cato all’esponente, tutti 0 nello spazio de<strong>di</strong>cato allamantissa e 0 o 1 per il segno, a seconda che sia + o −∞.0 / 1 1 1 1 ... 1 1 0 0 0 ... 0 0}{{}s} {{ }esponente} {{ }mantissaI valori ±∞ si hanno se si fa una <strong>di</strong>visione per zero o si fa un calcolo che comporta overflow.Si ha invece il Not-a-Number (NaN) come risultato <strong>di</strong> operazioni non definite, come 0/0 o log0.A seconda della macchina si ha:NaNS, che produce un segnale <strong>di</strong> errore0 1 1 1 ... 1 1 0 1 1 ... 1 1}{{}s} {{ }esponente} {{ }mantissaNaNQ, con il quale il calcolo continua comunque...0 1 1 1 ... 1 1 1 0 0 ... 0 0}{{}s} {{ }esponente} {{ }mantissa26


3.5. Precisione numerica3.5 Precisione numericaUn numero può avere una rappresentazione finita o infinita. Basti pensare al valore <strong>di</strong> π o a 2 in base 10.Abbiamo anche visto che un numero può avere rappresentazione finita in una base ma infinita in un’altra.Quando rappresentiamo un numero al calcolatore è possibile memorizzare solo un certo numero <strong>di</strong> cifre:in che modo lo esprimiamo?Per lasciare maggiore generalità al <strong>di</strong>scorso, consideriamo una base N .Sia x = ±( ∑ ∞k=0 x −k N −k )N p il numero esatto (può avere infinite cifre decimali e lo rappresentiamo comesomma <strong>di</strong> infiniti termini).In floating-point esso sarà espresso come x ∗ = ±( ∑ t−1k=0 x∗ −k N −k )N p∗ , esso, cioè, sarà arrotondato (nonpossiamo avere infinite cifre decimali e, <strong>di</strong>fatti, la somma considera solo t termini).Ci sono due mo<strong>di</strong> per arrotondare un numeroG troncamento: x ∗ = tr onc(x), dove p ∗ = p e x ∗ −k = x −k per k = 0,..., t − 1. Le altre cifre, x −t , x −t−1 ,...sono ignorate.G arrotondamento simmetrico: x ∗ = ar r (x) = tr onc(x + 1 2 N −t+1 N p ), aggiungiamo un’unità a x −t+1 sex −t ≥ N /2.L’errore assoluto |x − x ∗ | che si commette approssimando il numero x con x ∗ sarà 2⎧⎨N N p nel troncamento|x − x ∗ | ≤ 1⎩2 N 1−t N p nell’arrotondamentoPer l’errore relativo |x − x∗ |, invece, si ha:|x|⎧|x − x ∗ |⎨N 1−t nel troncamento≤ 1|x| ⎩2 N 1−t nell’arrotondamentoIl valore 1 2 N 1−t è il numero conosciuto come precisione <strong>di</strong> macchina.Nel caso della rappresentazione IEEE <strong>di</strong> un numero, si ha t−1 = n, (ricor<strong>di</strong>amo che nella rappresentazioneIEEE si memorizza il numero normalizzato), da cui l’errore <strong>di</strong> arrotondamento relativo che si commette è|x − x ∗ |≤ 2 −(n+1) .|x|In singola precisione (n = 23), avremoEsempio|x − x ∗ |≤ 2 −24 ≈ 5.96 × 10 −8|x|ciò significa che avremo 8 cifre decimali corrette.In doppia precisione (n = 52) avremo|x − x ∗ |≤ 2 −53 ≈ 1.11 × 10 −16|x|ciò significa che avremo 16 cifre decimali corrette.2 Evitiamo <strong>di</strong> effettuare tutti i passaggi che portano alle formule dell’errore assoluto e relativo, che sono il risultato <strong>di</strong> maggiorazioni<strong>di</strong> serie geometriche.27


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORE3.6 Propagazione <strong>degli</strong> erroriPrima <strong>di</strong> vedere come si propagano gli errori nelle operazioni elementari <strong>di</strong> moltiplicazione, <strong>di</strong>visione,ad<strong>di</strong>zione e sottrazione, ve<strong>di</strong>amo il concetto <strong>di</strong> cifre significative.Le cifre significative sono quelle che danno un’informazione effettiva sul valore del numero,in<strong>di</strong>pendentemente dalla parte esponenziale.Se scriviamo il numero in virgola mobile normalizzata, le cifre significative sono date dalle cifre dellaparte frazionaria. La bontà delle cifre va <strong>di</strong>minuendo procedendo da sinistra verso destra e questo può portaread una per<strong>di</strong>ta <strong>di</strong> cifre significative, come possiamo vedere stu<strong>di</strong>ando la propagazione <strong>degli</strong> errori nelleoperazioni elementari.Supponiamo che i numeri su cui lavoriamo siano affetti da errore (<strong>di</strong> arrotondamento), mentre le operazionisiano eseguite in modo esatto. In<strong>di</strong>chiamo con il simbolo o una qualunque delle operazioni elementari{×,/,+,−} e in<strong>di</strong>chiamo con f l(x) il numero x rappresentato in floating point e arrotondato, quin<strong>di</strong>f l(x) = x(1 + e x ) dove e x è l’errore <strong>di</strong> arrotondamento.Allora f l(x o y) = f l(x)o f l (y) = x(1 + e x )o y(1 + e y ).G Moltiplicazione 3 x(1 + e x ) × y(1 + e y ) = x × y(1 + e x )(1 + e y ) ≈ x × y(1 + e x + e y )Sulla cancellazioneQuin<strong>di</strong> l’errore nel prodotto è dato da e x y = e x + e yG Divisione (con y ≠ 0) 4 x(1 + e x )y(1 + e y ) = x y (1 + e x)(1 − e y + e 2 y + ...) ≈ x y (1 + e x − e y )Si ha e x/y = e x − e y : gli errori si accumulano ad<strong>di</strong>tivamenteG Ad<strong>di</strong>zione (e, analogamente, Sottrazione)x(1 + e x ) + y(1 + e y ) = x + y + xe x + ye y = (x + y)(1 + xx + y e x +yx + y e y )L’errore è e x+y =xx + y e x +yx + y e y , una combinazione lineare che <strong>di</strong>pende da x e y.– x y > 0 =⇒ |e x+y | ≤ |e x | + |e y |– x y < 0 =⇒ |x||x + y| e |y|possono essere molto gran<strong>di</strong> e, in tal caso, ci sarà un’amplificazione|x + y|notevole dell’errore. Si ha il fenomeno <strong>di</strong> cancellazione se non si fa attenzione al numero <strong>di</strong> cifresignificative dei numeri che vengono sommati.Supponiamo <strong>di</strong> avere due numeri molto vicini tra loro, in cui le prime p + 2 cifre della parte frazionariasono buone mentre le altre sono corrotte. Inoltre, le prime p cifre siano le stesse per entrambi i numeri(usiamo i simboli v v v v v e w w w w w w per esprimere le cifre corrotte):f l(x) = 1.d −1 d −2 ...d −p b −(p+1) b −(p+2) v v v v × 2 ef l(y) = 1.d −1 d −2 ...d −p b ′ −(p+1) b′ −(p+2) w w w w × 2eQuando an<strong>di</strong>amo a fare la sottrazione le prime p cifre buone si annullano. Da p + 2 cifre buone, ne abbiamoora solo 2 e tutte le altre sono quelle corrotte. Con la normalizzazione il risultato <strong>di</strong>venta del tipo (ora qqqqqsono le cifre corrotte):f l(x − y) = 1.b −1 ′′ b′′ −2qqqqqq × 2e3 Nei calcoli sono trascurabili le potenze maggiori o uguali a due per e x e e y4 1Possiamo scrivere = (1 − e y + e 2 y1 + e + ...) come risultato della formula polinomiale <strong>di</strong> Taylor della funzione f (e 1y ) = <strong>di</strong>y 1 + e ycentro 0.28


3.6. Propagazione <strong>degli</strong> erroriRicor<strong>di</strong>amo, infine, che in aritmetica <strong>di</strong> macchina non valgono più la proprietà <strong>di</strong>stributiva o associativadel prodotto.Esempio 3.6.1 Sia x = 0.1103 e y = 0.009963. Se consideriamo un sistema decimale a 4 cifre,normalizzando i numeri, abbiamo x = 1.103 · 10 −1 e y = 9.963 · 10 −3Facendo la sottrazione <strong>di</strong> questi due numeri, abbiamo 1.103 · 10 −1 − 9.963 · 10 −3 = 0.1103 − 0.009963 =0.100337. Facendo l’arrotondamento a 4 cifre abbiamo il valore 1.0034 · 10 −1 .|0.100337 − 0.10034|L’errore relativo che commettiamo è: ≈ 2.99 × 10 −5 . Questo errore è minore della0.100337precisione <strong>di</strong> macchina (considerata la base 10 e le 4 cifre) 1 2 · 10−3 .Tuttavia, se non teniamo conto delle cifre significative ma tronchiamo i numeri alle prime 4 cifre, abbiamola sottrazione <strong>di</strong> 0.1103 − 0.0099 = 0.1004.|0.100337 − 0.1004|Questa volta l’errore relativo è ≈ .63 × 10 −3 . L’errore è maggiore della precisione <strong>di</strong>0.100337macchina.Esempio 3.6.2 Sia da risolvere l’equazione ax 2 +bx+c = 0 con a = 1, b = −56 e c = 1, quin<strong>di</strong> x 2 −56x+1 = 0,in una macchina a 4 cifre decimali (normalizzata).Applicando la formula x 1/2 = −b ± b 2 − 4acabbiamo x 1/2 = 28 ± 783 = 28 ± 27.98213716 ={ 2a0.01786284073. L’arrotondamento delle due ra<strong>di</strong>ci in virgola mobile normalizzata a 4 cifre decimali55.98213716dà: x 1 = 1.7863 · 10 −2 e x 2 = 5.5982 · 10 1 .Consideriamo ora la macchina a 4 cifre decimali per risolvere l’equazione:x 1 = 28 − 783 = 2.8 · 10 1 − 2.7982 · 10 1 = 0.0018 · 10 1 = 0.018 = 1.8 · 10 −2x 2 = 28 + 783 = 2.8 · 10 1 + 2.7982 · 10 1 = 5.5982 · 10 1La ra<strong>di</strong>ce x 2 è arrotondata correttamente, mentre la variabile x 1 no, per effetto della cancellazione.Poichè vale x 1 x 2 = c/a, nel nostro caso deve valere x 1 x 2 = 1 da cui x 1 = 1/x 2 = 1/(5.5982·10 1 ) = 1.7863·10 −2Esempio 3.6.3 Ve<strong>di</strong>amo come non valga più la relazione (a − b) 2 = a 2 − 2ab + b 2 .Sia a = 15.6 e b = 15.7 e la macchina sia a 3 cifre decimali (non normalizzata, per cui scriveremo la partefrazionaria come 0.qual cosa).(a − b) = (a − b) ∗ + e a−b . Abbiamo (a − b) ∗ = 15.6 − 15.7 = −0.1.Quin<strong>di</strong> (a − b) 2 = +0.01 = 0.1 · 10 −1 .Consideriamo ora a 2 − 2ab + b 2 = 243.36 − 489.84 + 246.49 = 0.24336 · 10 3 − 0.48984 · 10 3 + 0.24649 · 10 3Considerando la macchina a 3 cifre decimali, abbiamo: 0.243 · 10 3 − 0.490 · 10 3 + 0.246 · 10 3 = −0.1 · 10 1I risultati sono completamente <strong>di</strong>versi!29


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATOREEsempio 3.6.4 Consideriamo il problema <strong>di</strong> approssimare la derivata della funzione f (x) = sin x nel puntox = 1.2.Supponiamo <strong>di</strong> non poter valutare <strong>di</strong>rettamente la derivata della f e <strong>di</strong> volerla approssimare applicandola formula polinomiale <strong>di</strong> Taylor:f (x 0 + h) = f (x 0 ) + h f ′ (x 0 ) + h22 f ′′ (x 0 ) + h36 f ′′′ (x 0 ) + h424 f IV (x 0 ) + ...Alloraf ′ (x 0 ) = f (x 0 + h) − f (x 0 )− ( h h2 f ′′ (x 0 ) + h26 f ′′′ (x 0 ) + h324 f IV (x 0 ) + ...)Approssimiamo, quin<strong>di</strong>, la f ′ (x 0 ) calcolando f (x 0 + h) − f (x 0 ).hL’errore <strong>di</strong> <strong>di</strong>scretizzazione che si commette è|f ′ (x 0 ) − f (x 0 + h) − f (x 0 )| = | h h2 f ′′ (x 0 ) + h26 f ′′′ (x 0 ) + h324 f IV (x 0 ) + ...|Supponendo <strong>di</strong> conoscere il valore della derivata seconda in x 0 , per piccoli valori <strong>di</strong> h possiamo dare unastima dell’errore <strong>di</strong> <strong>di</strong>scretizzazione,|f ′ (x 0 ) − f (x 0 + h) − f (x 0 )| ≈ h h2 |f ′′ (x 0 )|Ci aspettiamo, anche senza conoscere il valore <strong>di</strong> f ′′ (x 0 ) (purchè <strong>di</strong>verso da 0) che l’errore <strong>di</strong> <strong>di</strong>scretizzazione<strong>di</strong>minuisca proporzionalmente con il passo h, al decrescere <strong>di</strong> h.Nel nostro caso, in cui f (x) = sin(x), noi conosciamo il valore esatto della derivata in 1.2, vale a <strong>di</strong>recos(1.2) = 0.362357754476674...Il valore che otteniamo approssimando la derivata con la formula che abbiamo ricavato, per h = 0.1 non èmolto accurato. Ci aspettiamo che <strong>di</strong>minuendo il passo h l’errore che commettiamo <strong>di</strong>minuisca.Riportiamo gli errori della formula (in valore assoluto) e confrontiamoli con l’errore <strong>di</strong> <strong>di</strong>scretizzazioneh2 |f ′′ (x 0 )| (i conti sono fatti in singola precisione):h erroreh2 |f ′′ (x 0 )|1.e-1 4.7167e-2 4.6602e-21.e-2 4.6662e-3 4.6602e-31.e-3 4.6608e-4 4.6602e-41.e-4 4.6603e-5 4.6602e-51.e-5 4.6602e-6 4.6602e-61.e-6 4.6597e-7 4.6602e-7L’errore commesso dall’algoritmo decresce come h e, in particolare, come h 2 |f ′′ (1.2)| = 0.46602h.Possiamo pensare <strong>di</strong> ottenere un’accuratezza grande quanto vogliamo a con<strong>di</strong>zione <strong>di</strong> prendere valori <strong>di</strong> hsempre più piccoli. In realtà, per valori <strong>di</strong> h molto piccoli, gli errori iniziano ad aumentare!h erroreh2 |f ′′ (x 0 )|1.e-8 4.3611e-10 4.6602e-91.e-9 5.5947e-8 4.6602e-101.e-10 1.6697e-7 4.6602e-111.e-11 4.6603e-5 4.6602e-121.e-12 1.3006e-4 4.6602e-131.e-13 4.2505e-4 4.6602e-141.e-16 3.6236e-1 4.6602e-161.e-18 3.6236e-1 4.6602e-1930


3.6. Propagazione <strong>degli</strong> erroriIn Figura 3.6 ve<strong>di</strong>amo come la curva dell’errore inizialmente segue la retta descritta dall’errore <strong>di</strong> <strong>di</strong>scretizzazionema poi si allontana da essa. Perchè questo <strong>di</strong>verso comportamento per valori <strong>di</strong> h molto piccoli?L’errore che noi valutiamo è dato dalla somma dell’errore <strong>di</strong> <strong>di</strong>scretizzazione e dell’errore <strong>di</strong> arrotondamento.Per valori <strong>di</strong> h gran<strong>di</strong>, l’errore <strong>di</strong> <strong>di</strong>scretizzazione descresce al <strong>di</strong>minuire <strong>di</strong> h e domina l’errore <strong>di</strong>arrotondamento. Ma quando l’errore <strong>di</strong> <strong>di</strong>scretizzazione <strong>di</strong>venta molto piccolo, per valori <strong>di</strong> h minori <strong>di</strong>10 −8 , allora l’errore <strong>di</strong> arrotondamento inizia a dominare e ad aumentare sempre più al <strong>di</strong>minuire <strong>di</strong> h.Questo è un motivo per cui si deve richiedere ad un algoritmo che l’errore <strong>di</strong> <strong>di</strong>scretizzazione sia quelloche debba prevalere. Nell’errore <strong>di</strong> arrotondamento, per h via via più piccoli, si verifica un errore <strong>di</strong> cancellazione:f (x 0 + h) è praticamente uguale a f (x 0 ) per h molto piccoli! per cui l’errore che calcoliamo è|f ′ (x 0 ) − 0| = f ′ (x 0 ) = 0.3623577544....Una strategia per evitare la cancellazione è <strong>di</strong> scrivere <strong>di</strong>versamente la <strong>di</strong>fferenza f (x 0 +h)− f (x 0 ). Nel caso<strong>di</strong> f (x) = sin(x) ricorriamo alla formula trigonometrica per cui sin(φ) − sin(ψ) = 2cos( φ + ψ )sin( φ − ψ ).2 2Ve<strong>di</strong>amo come migliorano le cose inserendo nel grafico 3.6 anche la curva dell’errore che otteniamo utilizzandoquesta espressione trigonometrica. L’errore continua a <strong>di</strong>minuire anche quando la formula precedentedà un errore crescente. Sempre in Figura 3.6, e in riferimento alla formula “non buona”, abbiamoconsiderato la curva dell’errore <strong>di</strong> arrotondamento in modo da confrontare l’andamento effettivo dell’errorecon un limite superiore teorico dell’errore computazionale totale dato dalla somme <strong>degli</strong> errori<strong>di</strong> <strong>di</strong>scretizzazione e <strong>di</strong> arrotondamento. La rappresentazione <strong>di</strong> f (x) è affetta da errore per cui avremo:f (x) = f ∗ (x)+e x . L’errore <strong>di</strong> arrotondamento è f (x 0 + h) − f (x 0 )= f ∗ (x 0 + h) − f ∗ (x 0 )+ e x 0 +h − e x0. Maggiorandoe x con la precisione <strong>di</strong> macchina ɛ, l’errore <strong>di</strong> arrotondamento è dato da 2ɛ/h: per h piccoli èhhhl’errore che predomina!Figura 3.4: Errore <strong>di</strong> <strong>di</strong>scretizzazione ed effettivo approssimando f ′ (x 0 ) con il rapporto incrementalef (x 0 + h) − f (x 0 ).h31


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATOREFigura 3.5: Errori <strong>di</strong> <strong>di</strong>scretizzazione, <strong>di</strong> arrotondamento, ed errore effettivo approssimando f ′ (x 0 ) con ilrapporto incrementale f (x 0 + h) − f (x 0 ), ed errore che si commette applicando la formula trigonometricahper cui f (x 0 + h) − f (x 0 ) = sin(x 0 + h) − sin(x 0 ) = 2cos(2x 0 + h/2)sin(h/2).3.7 Instabilità e malcon<strong>di</strong>zionamento3.7.1 InstabilitàIn generale è impossibile evitare un accumulo lineare <strong>degli</strong> errori <strong>di</strong> arrotondamento durante un calcolo,ed è accettabile che ci sia una crescita lineare moderata, del tipoE n ≈ c 0 nE 0dove E n misura l’errore relativo dell’n-sima operazione dell’algoritmo 5 e c 0 sia una costante non moltogrande.Se invece avviene una crescita <strong>di</strong> tipo esponenzialeE n ≈ c n 1 E 0allora l’algoritmo è instabile. Algoritmi del genere devono essere evitati!Definizione 3.7.1 Un proce<strong>di</strong>mento numerico si <strong>di</strong>ce instabile se gli errori che vi sono associati non rimangonolimitati ma crescono fino a <strong>di</strong>struggere completamente la soluzione.5 Per algoritmo inten<strong>di</strong>amo un proce<strong>di</strong>mento <strong>di</strong> calcolo. Per una definizione più approfon<strong>di</strong>ta si veda pag. 161 al Capitolo 11.32


3.7. Instabilità e malcon<strong>di</strong>zionamentoEsempio 3.7.1 Consideriamo l’integrale∫ 1x ny n =0 x + 10 dxper valori <strong>di</strong> n = 1,2,...,30. Osserviamo che, poichè x ∈ [0,1], la funzione integranda varia pure essanell’intervallo [0,1] per cui 0 < y n < 1.Analiticamente, si ha:∫ 1x n + 10x n−1 ∫ 1x n−1 ∫(x + 10)1y n + 10y n−1 =dx =dx = x n−1 dx = 10 x + 100 x + 100nVale anche∫la relazione11y 0 =dx = ln(11) − ln(10).0 x + 10Possiamo pensare, quin<strong>di</strong>, <strong>di</strong> calcolare numericamente il valore <strong>di</strong> y n attraverso il seguente algoritmo:1. valutare y 0 = ln(11) − ln(10)2. per n = 1,2,...,30 valutare y n = 1 n − 10y n−1Questa formula ricorsiva dovrebbe dare l’esatto valore se non fossero presenti errori <strong>di</strong> arrotondamento checi allontanano completamente dalla soluzione vera. I numeri che generiamo, infatti, tendono a zero mentrel’errore si moltiplica. Infattiy 1 = 1 − 10y 0y 2 = 1 2 − 10(1 − 10y 0) = 1 2 − 10 + (−10)2 y 0y 3 = 1 3 − 10( 1 2 − 10 + 102 y 0 ) = −10 3 y 0 + cost ante. . . .y n = (−10) n y 0 + cost ante nL’algoritmo quin<strong>di</strong>, considerati gli errori <strong>di</strong> arrotondamento, presenta un errore E n con crescita <strong>di</strong> tipoesponenziale. Difatti otteniamo valori che via via si allontanano dall’intervallo <strong>di</strong> ammissibilità [0,1].I risultati che ricaviamo sono i seguenti (osserviamo che sono leggermente <strong>di</strong>versi a seconda dal linguaggiousato, proprio per effetto dell’instabilità).Da un programma in Fortran:Da un programma Matlab:n y n0 9.5310e-21 4.6898e-22 3.1021e-23 2.3122e-24 1.8778e-2... ....7 -3.0229e-18 3.1479e+09 -3.1368e+110 3.1378e+218 3.1377e+1027 -3.1377e+1930 3.1377e+22n y n0 9.5310e-21 4.6898e-22 3.1018e-23 2.3154e-24 1.8465e-2... ....7 1.1481-28 1.0194e-29 9.1673e-310 8.3270e-318 -9.1694e+127 -9.1699e+930 -9.1699e+1333


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATORESe invece, considero y n−1 = 110 ( 1 n − y n), partendo da un valore <strong>di</strong> n molto grande e andando a ritroso,l’errore <strong>di</strong>minuisce. Perciò, dato un valore <strong>di</strong> accuratezza ɛ > 0 e fissato un intero n 1 è possibile determinarel’intero n 0 tale che, partendo da y n0 = 0 e andando a ritroso, gli integrali y n saranno valutati con un errorein valore assoluto minore <strong>di</strong> ɛ per 0 < n ≤ n 1 . Infatti:y n0 = 0y n0 −1 = 1 110n 0y n0 −2 = 110 ( 1n 0 − 1 − 110. . .y n =1) =n 01(−10) n 0−n n 0+ cost ante n0 −n1(−10) 2 n 0+ cost ante1L’errore al passo n <strong>di</strong>pende, quin<strong>di</strong>, (in valore assoluto) da10 n 0−n .Se richie<strong>di</strong>amo una tolleranza ɛ = 10 −6 , per calcolare y n0 allora dovrà essere110 n < ɛ cioè 10 n 1−n 0< ɛ0−n 1Passando al logaritmo in base 10:n 1 − n 0 < logɛ =⇒ n 0 > n 1 − logɛPer n 1 = 20 si ricava n 0 = 26.Questa volta i calcoli danno gli stessi risultati sia in Matlab sia in Fortran:n y n n y n26 0.000000 11 7.62944e-325 3.84615e-3 10 8.32797e-324 3.61538e-3 9 9.16720e-323 3.80513e-3 8 1.01944e-222 3.96731e-3 7 1.14806e-221 4.14872e-3 6 1.31377e-220 4.34703e-3 5 1.53529e-219 4.56530e-3 4 1.84647e-218 4.80663e-3 3 2.31535e-217 5.07489e-3 2 3.10180e-216 5.37486e-3 1 4.68982e-215 5.71251e-3 0 9.53102e-214 6.09542e-313 6.53332e-312 7.03898e-3Osserviamo come il valore y 0 coincida con il valore teorico noto.L’esempio appena visto ci porta a dare alcune considerazioni sui criteri su cui si deve basare un algoritmo:un algoritmo deve essere accurato, efficiente e robusto, accurato nel senso che bisogna essere in grado<strong>di</strong> sapere la grandezza dell’errore che si commette nell’algoritmo stesso; efficiente in termini <strong>di</strong> velocità <strong>di</strong>esecuzione e <strong>di</strong> richiesta <strong>di</strong> spazio <strong>di</strong> memoria per le variabili utilizzate; robusto nel dare il risultato correttoentro un livello <strong>di</strong> tolleranza dell’errore che sia accettabile.34


3.7. Instabilità e malcon<strong>di</strong>zionamentoFigura 3.6: Esempio: malcon<strong>di</strong>zionamento3.7.2 Malcon<strong>di</strong>zionamentoDefinizione 3.7.2 Un problema si <strong>di</strong>ce malcon<strong>di</strong>zionato se a piccole variazioni nei dati <strong>di</strong> input del problemacorrispondono forti variazioni nei dati <strong>di</strong> output.Quando il problema è molto sensibile alle variazioni dei dati <strong>di</strong> input, producendo risultati molto <strong>di</strong>versi traloro, allora nessun algoritmo, per quanto robusto e stabile, potrà dare una soluzione robusta al problemastesso.Esempio 3.7.2 Il problema del calcolo delle ra<strong>di</strong>ci <strong>di</strong> un polinomio p(x) <strong>di</strong> grado n è un esempio <strong>di</strong>problema malcon<strong>di</strong>zionato.Sia p(x) = a 0 + a 1 x + a 2 x 2 +...+ a n x n . I dati <strong>di</strong> input del problema sono i coefficienti a 0 , a 1 ,..., a n . I dati <strong>di</strong>output sono le ra<strong>di</strong>ci del polinomio.Si può provare che a piccole variazioni sui dati iniziali, corrispondono gran<strong>di</strong> variazioni sui risultati.Ve<strong>di</strong>amo il caso del polinomio p(x) = (x − 1)(x − 2)···(x − 10). Chiaramente, tale polinomio ha ra<strong>di</strong>ci1,2,...,10. Se perturbiamo il polinomio variando il coefficiente a 9 del valore <strong>di</strong> 0.00001, considerando quin<strong>di</strong>il polinomio p(x) + 0.00001x 9 , le ra<strong>di</strong>ci corrispondenti si <strong>di</strong>scostano <strong>di</strong> poco da quelle del polinomio <strong>di</strong>partenza, come si può notare in Figura 3.7.2. Ma se variamo il coefficiente a 9 del valore 0.0001, considerandocioè il polinomio p(x)+0.0001x 9 allora le ra<strong>di</strong>ci corrispondenti a x 7 , x 8 , x 9 , x 10 non saranno più reali maavranno anche una parte immaginaria.La piccola variazione sui dati <strong>di</strong> ingresso, quin<strong>di</strong>, provoca una grande variazione sui dati in uscita, proprioperchè il problema è malcon<strong>di</strong>zionato.35


3. RAPPRESENTAZIONE DEI NUMERI NEL CALCOLATOREin<strong>di</strong>ce <strong>di</strong>con<strong>di</strong>zionamentoUna quantità che misura il grado <strong>di</strong> sensibilità <strong>di</strong> un problema – fornendoci in<strong>di</strong>cazioni sul fatto che apiccole variazioni sui dati <strong>di</strong> ingresso del problema ci possono essere piccole o gran<strong>di</strong> variazioni sui dati <strong>di</strong>uscita – si chiama in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento (o numero <strong>di</strong> con<strong>di</strong>zionamento) del problema.Diamo la definizione nel caso in cui il nostro problema si possa identificare come una funzione f : R −→R. Il valore y = f (x) è il valore <strong>di</strong> uscita del problema f . Vogliamo vedere cosa succede se il dato <strong>di</strong> ingressonon è più x ma x + ∆x. ∆x rappresenta quin<strong>di</strong> una perturbazione sul dato iniziale. Assumiamo x ≠ 0, y ≠ 0.Applichiamo la formula <strong>di</strong> Taylor <strong>di</strong> centro x. Si ha:f (x + ∆x) = f (x) + f ′ (x)∆x +O(∆x 2 ) ≈ f (x) + f ′ (x)∆xLa variazione sul dato d’uscita è data dalla <strong>di</strong>fferenza f (x + ∆x) − f (x). Chiamiamo questa <strong>di</strong>fferenza con∆y. Quin<strong>di</strong> ∆y = f (x + ∆x) − f (x) ≈ f ′ (x)∆x (utilizziamo il risultato ottenuto dalla formula <strong>di</strong> Taylor).Se utilizziamo gli errori relativi, abbiamo (e sapendo che y = f (x)):∆yy∆yy≈ f ′ (x)∆xf (x)Moltiplico poi numeratore e denominatore a secondo membro per x≈ x f ′ (x) ∆xf (x) xAl limite per ∆x → 0, questa uguaglianza approssimata (abbiamo usato il simbolo ≈) <strong>di</strong>venta una verauguaglianza. Questo suggerisce <strong>di</strong> definire l’in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento <strong>di</strong> f me<strong>di</strong>ante la formula(cond f )(x) =x f ′ (x)∣f (x)∣Questo numero ci <strong>di</strong>ce quanto gran<strong>di</strong> sono le perturbazioni relative per y confrontate con le relativeperturbazioni <strong>di</strong> x.Per x = 0 e y ≠ 0, non ha senso considerare l’errore relativo ∆x , e si considera l’errore assoluto su x. In talxcaso, si definisce in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento la quantità(cond f )(x) =f ′ (x)∣f (x)∣Per x = y = 0 si considera invece l’errore assoluto sia per x che per y, <strong>di</strong>modochè l’in<strong>di</strong>ce <strong>di</strong>con<strong>di</strong>zionamento <strong>di</strong>venta(cond f )(x) = |f ′ (x)|Esempio 3.7.3 Sia f (x) = x 1/α , con x > 0 e α > 0. Calcoliamo l’in<strong>di</strong>ce <strong>di</strong> con<strong>di</strong>zionamento applicando laformula (poichè abbiamo supposto x > 0, si ha f (x) ≠ 0). Risulta∣ (cond f )(x) =x f ′ ∣∣∣∣∣∣(x)x 1 ∣ ∣∣∣∣∣∣ ∣f (x)∣ = α x1/α−1= 1 αx 1/αPer α grande, (cond f )(x) tende a zero, quin<strong>di</strong> abbiamo un problema bencon<strong>di</strong>zionato. Se, invece α è moltopiccolo si ha un problema malcon<strong>di</strong>zionato (se α = 10 −10 , si ha f (x) = x 1010 e (cond f )(x) = 10 10 , un valoremolto grande).36


C A P I T O L O4ZERI DI FUNZIONENon so come il mondo potràgiu<strong>di</strong>carmi ma a me sembrasoltanto <strong>di</strong> essere un bambino chegioca sulla spiaggia, e <strong>di</strong> essermi<strong>di</strong>vertito a trovare ogni tanto unsasso o una conchiglia più bella delsolito, mentre l’oceano della veritàgiaceva insondato davanti a me.Isaac Newton4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.2 Metodo delle Bisezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.3 Metodo del Punto Fisso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.4 Il Metodo <strong>di</strong> Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454.5 Convergenza <strong>di</strong> un metodo iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474.6 Complessità computazionale <strong>di</strong> uno schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494.7 Il metodo delle secanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494.8 Confronto tra i meto<strong>di</strong> <strong>di</strong> Newton-Raphson e la Regula Falsi . . . . . . . . . . . . . . . . . . . . . . 504.9 Metodo <strong>di</strong> Newton-Raphson per ra<strong>di</strong>ci multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534.10 Controllo sugli scarti e grafici <strong>di</strong> convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534.11 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554.1 IntroduzioneIl problema <strong>di</strong> calcolare la ra<strong>di</strong>ce quadrata <strong>di</strong> un numero è un problema molto antico. Già gli antichiBabilonesi, intorno al 1700 a.C., se lo erano posto e avevano trovato la soluzione: per calcolare b, partivanoda un certo valore x che si avvicinava alla soluzione, <strong>di</strong>videvano b per questo numero, e facevano poi lame<strong>di</strong>a, iterando il proce<strong>di</strong>mento. L’algoritmo si può schematizzare nel modo seguente:G partire da x 0 prossimo a b;G considerare x 1 = 1 2 (x 0 + b x 0);G generalizzando: x n+1 = 1 2 (x n + b x n).37


4. ZERI DI FUNZIONEPer esempio, per calcolare 2 ≈ 1.41421356237310, sapendo che il valore che dobbiamo approssimare ècompreso tra 1 e 2, possiamo partire da x 0 = 1.5, ottenendo:x 0 = 1.5x 1 = 1 2 (1.5 + 21.5 ) = 1.41666667x 2 = 1 2 (1.41666667 + 21.41666667 ) = 1.41421569x 3 = 1 2 (1.41421569 + 21.41421569 ) = 1.41421356Il metodo usato dai Babilonesi non è altro che il metodo <strong>di</strong> Newton-Raphson (che vedremo più avanti)per trovare gli zeri della funzione f (x) = x 2 − b.I meto<strong>di</strong> numerici <strong>di</strong>scussi in questo Capitolo servono per trovare approssimazioni numeriche adequazioni del tipo f (x) = 0.4.2 Metodo delle BisezioniSia data una funzione f continua in un intervallo [a,b], con f (a) e f (b) che assumono valori <strong>di</strong> segnoopposto. Allora, per il teorema del Valore Interme<strong>di</strong>o (si veda il Teorema 2.5.5 con K = 0), esiste almeno unpunto ξ ∈]a,b[ tale che f (ξ) = 0.Assumiamo, per semplicità che ci sia una sola ra<strong>di</strong>ce ξ nell’intervallo ]a,b[ (nel caso ci sia più <strong>di</strong> unara<strong>di</strong>ce, la procedura che ora descriviamo vale sempre, e ci permette <strong>di</strong> calcolare una <strong>di</strong> queste ra<strong>di</strong>ci).Il metodo delle bisezioni (detto anche metodo <strong>di</strong>cotomico) si chiama così perchè, ad ogni passo, viene<strong>di</strong>mezzato l’intervallo precedente, cercando in tal modo <strong>di</strong> racchiudere la ra<strong>di</strong>ce ξ in sottointervalli semprepiù piccoli.G Si pone a 1 = a e b 1 = b. Si prende il punto me<strong>di</strong>o dell’intervallo [a 1 ,b 1 ], c 1 = a 1 + b 1.G Se f (c 1 ) = 0 allora abbiamo trovato la ra<strong>di</strong>ce dell’equazione, altrimenti si va a controllare il segno <strong>di</strong>f (c 1 ).– Se f (c 1 ) e f (a 1 ) hanno lo stesso segno, allora ξ si trova nell’intervallo ]c 1 ,b 1 [ (applicando <strong>di</strong> nuovoil teorema del Valore Interme<strong>di</strong>o). In tal caso porremo a 2 = c 1 e b 2 = b 1 .– Se, invece, f (c 1 ) e f (b 1 ) hanno lo stesso segno, allora ξ si trova nell’intervallo ]a 1 ,c 1 [ In tal casoporremo a 2 = a 1 e b 2 = c 1 .G Riapplichiamo questa procedura appena descritta sul sottointervallo [a 2 ,b 2 ]G Fermiamo il proce<strong>di</strong>mento ad una certa iterazione n, se f (c n ) = 0 o se l’ampiezza del sottointervalloè sufficientemente piccola, cioè b n − a n≤ tol l dove tol l è una certa tolleranza prefissata. In tal caso2assumiamo c n come approssimazione della ra<strong>di</strong>ce ξ.Osserviamo che, ad ogni passo, viene <strong>di</strong>mezzato l’intervallo in cui si trova la ra<strong>di</strong>ce ξ, da cui|ξ − c n | ≤ b − a2 n .Da questa relazione, si può determinare il numero <strong>di</strong> iterazioni n necessarie per calcolare un’approssimazionedella ra<strong>di</strong>ce ξ entro una certa tolleranza tol richiesta. InfattiMab − a2 n ≤ tol =⇒ |ξ − c n | ≤ tolb − a2 n ≤ tol ⇐⇒ 2 n ≥ b − a =⇒ n ≥tollog((b − a)/tol ).log(2)L’algoritmo <strong>di</strong> bisezione può essere descritto nel modo seguente (sotto forma <strong>di</strong> pseudo-co<strong>di</strong>ce). Se ilmetodo non converge (perchè, ad esempio, la funzione che abbiamo scelto non assume segno opposto agliestremi dell’intervallo), il proce<strong>di</strong>mento iterativo potrebbe entrare in stallo (pensiamo ad un programma dafare eseguire al calcolatore) e quin<strong>di</strong> conviene introdurre un numero massimo <strong>di</strong> iterazioni, che viene in<strong>di</strong>catocon itmax.238


4.3. Metodo del Punto FissoFigura 4.1: Metodo delle BisezioniDati <strong>di</strong> input: a, b, tol , i tmaxDati <strong>di</strong> output: soluzione approssimata c o messaggio <strong>di</strong> fallimento1 verificare che f (a)f (b) < 0, altrimenti non si può implementare il metodo ;2 n ←− 1 ;3 c ←− (a + b)/2 ;4 scar to ←− |b − a|/2 ;5 Fintantochè n ≤ i tmax e ( f (c) ≠ 0 e scar to > tol )6 n ←− n + 1 (incrementa n) ;7 Se f (a)f (c) > 0 allora8 a ←− c9 altrimenti10 b ←− c11 Fine-Se12 aggiorna c ;13 aggiorna scar to ;14 Fine-Fintantochè15 Se f (c) = 0 o scar to ≤ tol allora16 c è la soluzione approssimata17 altrimenti18 n > i tmax ;19 il metodo è fallito dopo i tmax iterazioni ;20 Fine-Se4.3 Metodo del Punto FissoIl problema f (x) = 0 può essere reso equivalente alla ricerca del punto fisso <strong>di</strong> una opportuna funzione g(vale a <strong>di</strong>re del problema g (x) = x).( x) 2−sin(x) ( x) 2−sin(x)+xAd esempio, da f (x) == 0, aggiungendo ad ambo i membri x, otteniamo = x( 22x) 2da cui poniamo g (x) = − sin(x) + x. Le ra<strong>di</strong>ci della f coincidono con i punti fissi della g .2Definizione 4.3.1 Data una funzione g , si definisce punto fisso della g , quel puntoξ che sod<strong>di</strong>sfa la relazione g (ξ) = ξ39


4. ZERI DI FUNZIONEUna funzione può ammettere uno o più punti fissi o non ammetterne affatto.Un modo per calcolare un punto fisso <strong>di</strong> una funzione g è dato da iterazioni successive sulla funzione gstessa.Esempio 4.3.1 Supponiamo che la funzione g sia g (x) = cos(x). Pren<strong>di</strong>amo come valore iniziale x 0 = 1.Con una calcolatrice, an<strong>di</strong>amo a calcolare (in modalità ra<strong>di</strong>anti!) il suo coseno: ricaviamo x 1 = cos(x 0 ) =g (x 0 ) = 0.54030230. Successivamente, calcoliamo il coseno <strong>di</strong> x 1 , ottenendo x 2 = cos(x 1 ) = 0.857553216.Osserviamo che x 2 = cos(x 1 ) = cos(cos(x 0 )) e non cos 2 (x 0 )! Abbiamo innescato, in questo modo, un proce<strong>di</strong>mentoiterativo per cui x n+1 = cos(x n ) = g (x n ). Con la calcolatrice, basta <strong>di</strong>gitare sulla funzione cos ognivolta in modo da avere i nuovi valori della successione x n+1 . I primi numeri che otteniamo non sono moltoimportanti. Quelli importanti sono quelli che si hanno dopo 15, 30 o 100 passi. Nel nostro caso, abbiamon x n5 0.701368774611 0.735604740413 0.741425086614 0.737506890515 0.740147335629 0.739089341430 0.739082298556 0.739085133357 0.739085133258 0.7390851332Perchè i valori <strong>di</strong> x tendono a 0.7390851332? Cosa ha <strong>di</strong> speciale questo numero? È un punto fisso per lafunzione cos(x).Esempio 4.3.2 Consideriamo la funzione g (x) = 1 2 x + 2. Partendo da x 0 = 0 si han x n1 x 1 = 1 2 · 0 + 2 = 22 x 2 = 1 2 · 2 + 2 = 33 x 3 = 1 2 · 3 + 2 = 3.54 x 4 = 1 2 · 3.5 + 2 = 3.755 x 5 = 1 2 · 3.75 + 2 = 3.8756 x 6 = 1 2 · 3.875 + 2 = 3.9375I numeri 2, 3, 3.5, 3.75, 3.875, 3.9375 sembrano avvicinarsi a ξ = 4. Difatti, per valori crescenti <strong>di</strong> n, per x n1che tende a ξ, si ha, da una parte ξ = lim n→∞ x n+1 = lim n→∞2 x n + 2 = 1 2 ξ + 2 da cui, ξ = 1 ξ + 2, cioè ξ = 4.2Scopriamo quin<strong>di</strong> che se l’iterazione x n+1 = g (x n ) converge a ξ, ξ è punto fisso per la funzione g .Da un punto <strong>di</strong> vista geometrico, i grafici <strong>di</strong> y = x (bisettrice del primo e terzo quadrante) e <strong>di</strong> y = g (x) siintersecano in ξ.Tuttavia, non sempre questo schema iterativo, applicato a funzioni che ammettono uno o più punti fissi,40


4.3. Metodo del Punto Fissoconverge. Ve<strong>di</strong>amo con un esempio.Esempio 4.3.3 Sia g (x) = x 2 . Analiticamente troviamo due punti fissi per questa funzione. Dovendo essereξ = ξ 2 , si ricava ξ 2 − ξ = 0, vale a <strong>di</strong>re ξ(ξ − 1) = 0: quin<strong>di</strong> ξ = 0 e ξ = 1 sono i due punti fissi per questafunzione.Partendo da x 0 = 0.5, si ha la successione <strong>di</strong> valori 0.25, 0.0625, 0.00390625, rapidamente il metodo convergea ξ = 0Se si prende come punto iniziale un valore x 0 ∈] − 1,1[, la successione converge a ξ = 0. Le sole successioniche convergono a ξ = 1 solo le ovvie successioni generate da x 0 = ±1. Se si prende come punto iniziale x 0 taleche |x 0 | > 1 allora lo schema iterativo x n+1 = x 2 n <strong>di</strong>verge a +∞. Partendo da x 0 = 2, si ha 4, 16, 256, 65536...Questo esempio è significativo per capire come ciascun punto fisso ξ abbia un proprio bacino <strong>di</strong> attrazione:se si prende x 0 in questo bacino, allora i valori x n tendono a ξ. Un punto fisso può dunque attirare orespingere i valori x n prodotti dallo schema iterativo.Prima <strong>di</strong> passare a stu<strong>di</strong>are quando lo schema <strong>di</strong> punto fisso converge, cerchiamo <strong>di</strong> capire se, data unafunzione g , essa ammetta uno o più punti fissi o non ne ammetta affatto. Sia data una funzione continua gdefinita in un intervallo [a,b]. Se g (a) = a o g (b) = b allora essa ammette a e b come punti fissi. Supponiamoquin<strong>di</strong> che sia g (a) > a e g (b) < b. Definiamo la funzione continua Φ(x) me<strong>di</strong>ante la relazioneΦ(x) = g (x) − xAllora Φ(a) = g (a) − a > 0 e Φ(b) = g (b) − b < 0. Per il Teorema del Valore Interme<strong>di</strong>o esiste almeno un puntoξ ∈]a,b[ tale che Φ(ξ) = 0, vale a <strong>di</strong>re g (ξ) − ξ = 0, cioè g (ξ) = ξ. Esiste almeno un punto fisso per la funzioneg .Questo risultato si può generalizzare nel seguente teorema.Teorema 4.3.1 Data una funzione g definita in [a,b], continua e tale che a ≤ g (x) ≤ b per ogni x ∈ [a,b], allorag ammette almeno un punto fisso.Infatti, dalle ipotesi, i valori della funzione g sono contenuti nell’intervallo [a,b] e, in particolare a ≤ g (a) ≤ be a ≤ g (b) ≤ b. Ci riconduciamo, quin<strong>di</strong>, a quanto abbiamo detto prima per <strong>di</strong>mostrare che esiste almeno unpunto fisso per g .Ora, oltre alle ipotesi precedenti (che ci assicurano l’esistenza del punto fisso) supponiamo che la g sia <strong>di</strong>classe C 1 in [a,b] e che esista una costante m < 1 tale che |g ′ (x)| ≤ m < 1 per ogni x ∈ [a,b]. In questo caso ilpunto fisso per la g è unico.Che esista almeno un punto fisso è assicurato dal teorema precedente. Supponiamo, allora, che esistanodue punti fissi ξ e η, con ξ ≠ η, per la funzione g . Si ha|ξ − η| = |g (ξ) − g (η)|Applicando il teorema del Valor Me<strong>di</strong>o, esiste un punto c compreso tra ξ e η per cui|g (ξ) − g (η)| = |g ′ (c)(ξ − η)| ≤ |g ′ (c)||ξ − η|Ma per ipotesi |g ′ (c)| ≤ m < 1 da cui|ξ − η| ≤ m|ξ − η| < |ξ − η|Si arriva ad una contrad<strong>di</strong>zione. L’assurdo deriva dall’aver supposto ξ ≠ η. Quin<strong>di</strong> ξ = η e il punto fisso èunico. Riassumiamo questo risultato nel seguente teorema.Teorema 4.3.2 Data una funzione g <strong>di</strong> classe C 1 in [a,b], con a ≤ g (x) ≤ b per ogni x ∈ [a,b], e con |g ′ (x)| ≤m < 1 per ogni x ∈ [a,b] allora esiste ed è unico il punto fisso della g in tale intervallo.41


4. ZERI DI FUNZIONEOsserviamo che, data una funzione che ammette punto fisso, le ipotesi dei teoremi precedenti possono essererilassate in un intorno del punto fisso.Possiamo ora provare un teorema <strong>di</strong> convergenza per lo schema del punto fisso.Teorema 4.3.3 A partire da un punto iniziale x 0 , lo schema iterativo x n+1 = g (x n ) converge al punto fisso ξ <strong>di</strong>g se e solo se |g ′ (x)| < 1 in un intorno <strong>di</strong> ξ.Dimostrazione.Dalle relazioniξ = g (ξ)x n+1 = g (x n )sottraendo membro a membro e, applicando il teorema del Valore Me<strong>di</strong>o (con ξ n un opportuno punto delsegmento che congiunge ξ a x n ), otteniamo:ξ − x n+1 = g (ξ) − g (x n ) = g ′ (ξ n )(ξ − x n )Possiamo scrivere questa relazione per n = 0,1,... ottenendoξ − x 1 = g ′ (ξ 0 )(ξ − x 0 )ξ − x 2 = g ′ (ξ 1 )(ξ − x 1 )ξ − x 3 = g ′ (ξ 2 )(ξ − x 2 ). = . . .ξ − x n = g ′ (ξ n−1 )(ξ − x n−1 )Moltiplicando, ora, membro a membro e prendendo i valori assoluti, abbiamo:|ξ − x 1 | · |ξ − x 2 | · ... · |ξ − x n | =|g ′ (ξ 0 )| · |g ′ (ξ 1 )| · |g ′ (ξ 2 )| · ... · |g ′ (ξ n−1 )| · |ξ − x 0 | · |ξ − x 1 | · ... · |ξ − x n−1 |La relazione appena trovata può essere semplificata, <strong>di</strong>videndo ambo i membri per |ξ − x 1 | · |ξ − x 2 | · ... ·|ξ − x n−1 | ottenendo:|ξ − x n | = |g ′ (ξ 0 )| · |g ′ (ξ 1 )| · |g ′ (ξ 2 )| · ·... · |g ′ (ξ n−1 )||ξ − x 0 |Assumiamo, ora che |g ′ (x i )| ≤ m per i = 0,1,...,n − 1. Abbiamo dunque una relazione che lega l’errore alpasso n con l’errore iniziale.|ξ − x n | ≤ m n |ξ − x 0 |Perchè il metodo converga, l’errore deve tendere a zero per n che tende all’infinito. Se m < 1 è assicurata laconvergenza (quin<strong>di</strong>, se in un intorno del punto fisso, la derivata prima è minore <strong>di</strong> 1, lo schema converge).Se invece m > 1 in un intorno del punto fisso, lo schema non può convergere al punto fisso.Se vale m = 1 nulla si può <strong>di</strong>re a priori, ma bisogna vedere caso per caso cosa succede nell’intorno delpunto fisso. ✔Negli esempi precedenti:42g (x) g ′ (x)cos(x) −sin(x)12 x + 2 12x 2 2x


4.3. Metodo del Punto FissoFigura 4.2: Il metodo <strong>di</strong> punto fisso: esempi con g (x) = cos(x) (a sinistra), e g (x) = 1 x + 2 (a destra)2Nel primo caso (esempio 4.3.1) −sin(0.7390851332) = −0.673612, perciò in un intorno del punto fisso laderivata è minore <strong>di</strong> 1 in valore assoluto e si ha convergenza.Nell’esempio 4.3.2 g ′ (x) = 1 qualunque sia x: si ha convergenza.2Nel terzo caso (esempio 4.3.3), g ′ (x) = 2x da cui g ′ (0) = 0 e g ′ (1) = 2. In un intorno del primo punto fisso,vale m < 1, in un intorno del secondo punto fisso m > 1 e non si potrà mai avere convergenza ad esso.Il bacino <strong>di</strong> attrazione si ha quin<strong>di</strong> se vale m < 1.Da un punto <strong>di</strong> vista grafico, le iterazioni dello schema <strong>di</strong> punto fisso si possono vedere sotto forma <strong>di</strong>ragnatela. Le iterazioni, infatti, si muovono avanti e in<strong>di</strong>etro tra il grafico della y = g (x) e il grafico dellabisettrice y = x. L’esempio 4.3.1, con g (x) = cos(x), è rappresentato in Figura 4.2 (a sinistra): partendo da(x 0 , x 0 ) sulla retta y = x, applicando l’algoritmo si ha x 1 = g (x 0 ). Perciò:G da (x 0 , x 0 ) si va su o giù fino a raggiungere (x 0 , x 1 ) sulla curva g ;G da (x 0 , x 1 ) si arriva a (x 1 , x 1 ) sulla bisettrice y = x.Questi due passi vengono ripetuti per tutte le altre iterazioni. Da x 1 si arriva sulla curva a g (x 1 ). Ora l’altezzaè x 2 . Da qui si va sulla bisettrice al punto (x 2 , x 2 ). E così via. Lo scopo delle iterazioni, infatti, è <strong>di</strong> arrivare alpunto (ξ,ξ) ≈ 0.7390851332 che è il punto <strong>di</strong> intersezione tra il grafico <strong>di</strong> g e la bisettrice y = x. Osserviamoche, per questo esempio, i valori della successione si avvicinano a ξ muovendosi a destra e a sinistra rispettoad esso. Si parla <strong>di</strong> convergenza oscillante.Nell’esempio 4.3.2, si devono intersecare due linee rette. Notiamo, anche dalla Figura 4.2 (a destra), che ivalori delle iterazioni si trovano tutti da un lato rispetto al punto fisso: si parla <strong>di</strong> convergenza monotona.In generale, quando 0 ≤ g ′ (x) < 1 in un intorno del punto fisso, si ha convergenza monotona. Se, invece,−1 < g ′ (x) < 0 in un intorno del punto fisso, si ha convergenza oscillante.Analogamente, in Figura 4.3, si possono osservare le conclusioni già viste per l’esempio 4.3.3, in cui g (x) =x 2 : si ha convergenza monotona verso ξ = 0 partendo da un punto iniziale in valore assoluto minore <strong>di</strong> uno,e <strong>di</strong>vergenza monotona a infinito, partendo da |x 0 | > 1.Esempio 4.3.4 Consideriamo ora g (x) = x−sin(x) nell’intervallo [0,2π]. Data la perio<strong>di</strong>cità della funzioneseno, g ammette più <strong>di</strong> un punto fisso. Infatti da ξ = ξ − sin(ξ) si ha 0 = sin(ξ) da cui ξ = 0, ξ = π e ξ = 2π.Stu<strong>di</strong>amo ora la derivata prima g ′ (x) = 1 − cos(x). Si ha g ′ (0) = 1 − 1 = 0, g ′ (π) = 1 − (−1) = 2 e g ′ (2π) =1−1 = 0. Da queste informazioni, deduciamo che qualunque sia il punto iniziale x 0 la successione generatadallo schema del punto fisso non potrà mai convergere a π, come si vede anche dalla Figura 4.4.Nel caso in cui il metodo <strong>di</strong> punto fisso converge, si possono ricavare delle maggiorazioni per l’errore chesi commette approssimando ξ me<strong>di</strong>ante x n .43


4. ZERI DI FUNZIONEFigura 4.3: Il metodo <strong>di</strong> punto fisso: esempio con g (x) = x 2 . Si noti la convergenza monotona a ξ = 0 (asinistra) e la <strong>di</strong>vergenza monotona da ξ = 1 (a destra)Figura 4.4: Il metodo <strong>di</strong> punto fisso: esempio con g (x) = x − sin(x). ξ = 0 e ξ = 2π sono punti fissi attrattivi, alcontrario <strong>di</strong> ξ = π in cui g ′ (ξ) = g ′ (π) = 2Infatti, possiamo scrivere l’errore ξ − x n nel modo seguente:ξ − x n = g (ξ) − g (x n−1 )Applicando il teorema del valor me<strong>di</strong>o e considerando, come prima, |g ′ (x)| ≤ m < 1 in un intorno del puntofisso, si ha:|ξ − x n | ≤ m|ξ − x n−1 | (4.1)Possiamo scrivere ξ − x n−1 nel modo seguente aggiungendo e sottraendo x n :ξ − x n−1 = ξ − x n + x n − x n−1ξ − x n−1 = g (ξ) − g (x n−1 ) + x n − x n−1|ξ − x n−1 | ≤ m|ξ − x n−1 | + |x n − x n−1 |(1 − m)|ξ − x n−1 | ≤ |x n − x n−1 ||ξ − x n−1 | ≤ 11 − m |x n − x n−1 |44Andando a sostituire questa maggiorazione nella <strong>di</strong>suguaglianza (4.1), si ha|ξ − x n | ≤ m1 − m |x n − x n−1 |


4.4. Il Metodo <strong>di</strong> Newton-RaphsonAbbiamo così trovato una maggiorazione dell’errore che lega l’errore al passo n con il valore assoluto della<strong>di</strong>fferenza tra due iterazioni successive |x n − x n−1 | (quest’ultima quantità prende il nome <strong>di</strong> scarto).Generalmente, per vedere se il metodo <strong>di</strong> punto fisso converge al punto fisso entro una certa tolleranzaprestabilita, il controllo da fare è proprio sullo scarto d n = |x n − x n−1 |. Sfruttiamo questo fatto per vederecome implementare l’algoritmo dello schema <strong>di</strong> punto fisso (sotto forma <strong>di</strong> pseudo-co<strong>di</strong>ce; per i dettaglisull’implementazione in Fortran si vada a pag. 170):Dati <strong>di</strong> input: x 0 , tol ,i tmaxDati <strong>di</strong> output: x n soluzione approssimata o messaggio <strong>di</strong> fallimento1 n ←− 1 contatore delle iterazioni;2 d n ←− 2tol (una quantità iniziale > tol ) ;3 Fintantochè n ≤ i tmax e d n > tol4 incrementa n <strong>di</strong> 1;5 applicare l’algoritmo <strong>di</strong> punto fisso x n = g (x n−1 ) ;6 aggiorna d n ;7 Fine-Fintantochè8 Se d n ≤ tol allora9 x n è la soluzione approssimata10 altrimenti11 n > i tmax ;12 il metodo è fallito dopo i tmax iterazioni ;13 Fine-Se4.4 Il Metodo <strong>di</strong> Newton-RaphsonIl metodo <strong>di</strong> Newton-Raphson 1 è uno dei meto<strong>di</strong> più potenti e più famosi per risolvere equazioni non lineari.Ci sono <strong>di</strong>versi approcci per introdurre questo metodo – tra questi c’è anche quello <strong>di</strong> vedere il metodo<strong>di</strong> Newton-Raphson come un particolare schema <strong>di</strong> punto fisso, come vedremo in seguito.Supponiamo ora che la derivata prima e seconda <strong>di</strong> f esistano e siano continue e assumiamo che laderivata prima f ′ sia valutabile con sufficiente facilità.Lo schema <strong>di</strong> Newton-Raphson è uno schema iterativo che produce una successione <strong>di</strong> approssimazionix 0 , x 1 ,..., x n della ra<strong>di</strong>ce della funzione f .Sia x n l’iterata corrente. Applicando la formula <strong>di</strong> Taylor <strong>di</strong> centro x n si ha:f (x) = f (x n ) + f ′ (x n )(x − x n ) + f ′′ (ξ x )(x − x n ) 2 /2dove ξ x è un punto (che non conosciamo) compreso tra x e x n .Sia x = ξ, dove ξ è ra<strong>di</strong>ce <strong>di</strong> f , f (ξ) = 0. Se f fosse lineare, avremmo f ′′ ≡ 0 e quin<strong>di</strong> potremmo trovare lara<strong>di</strong>ce risolvendo <strong>di</strong>rettamente0 = f (ξ) = f (x n ) + f ′ (x n )(ξ − x n )ottenendo, con semplici passaggi,ξ = x n − f (x n)f ′ (x n )1 Il metodo fu descritto da Isaac Newton in due suoi scritti del 1669 e del 1671, anche se era riferito solo a polinomi (in particolare ax 3 − 2x − 5 = 0). Il metodo <strong>di</strong> Newton fu pubblicato per la prima volta nel 1685. Nel 1690 Joseph Raphson ne pubblicò una descrizionesemplificata in termini <strong>di</strong> approssimazioni successive x n piuttosto che <strong>di</strong> sequenze <strong>di</strong> polinomi. Fu solo nel 1740 che Thomas Simpsondescrisse il metodo <strong>di</strong> Newton come un metodo iterativo per risolvere equazioni non lineari (e non solo polinomi) e <strong>di</strong>ede una versionegeneralizzata per sistemi <strong>di</strong> due equazioni.Isaac Newton (1643-1727), inglese, fu fisico, matematico, astronomo, alchimista, inventore, filosofo naturalista. È visto come uno deipiù gran<strong>di</strong> scienzati nella storia dell’umanità.Su Joseph Raphson (1648-1715) non si hanno molti dettagli. Pare che Newton stesso gli permettesse <strong>di</strong> vedere e stu<strong>di</strong>are i suoi scrittimatematici. Il suo lavoro del 1690 Analysis aequationum universalis gli valse l’ingresso nella Royal Society, nel 1691 benchè fosse unostudente (si laureò nel 1692) piuttosto anziano (aveva 43 anni).45


4. ZERI DI FUNZIONEPer una funzione non lineare, il <strong>di</strong>scorso da fare è molto simile.La nuova approssimazione x n+1 vogliamo che sia uguale al valore x n più una certa quantità h che cipermetta <strong>di</strong> arrivare alla soluzione desiderata.Applicando la formula <strong>di</strong> Taylor <strong>di</strong> centro x n , deve esseref (x n+1 ) = f (x n + h) = f (x n ) + f ′ (x n )h + f ′′ (ξ h )h 2 /2Vogliamo che sia f (x n+1 ) = 0, da cui, trascurando il termine in h 2 , ricaviamoh = − f (x n)f ′ (x n )Utilizziamo questo valore <strong>di</strong> h per la nuova approssimazione x n+1 = x n + h me<strong>di</strong>ante la formulax n+1 = x n − f (x n)f ′ , n = 0,1,2,... (4.2)(x n )L’interpretazione geometrica del metodo <strong>di</strong> Newton è che x n+1 è l’intercetta, sull’asse delle x, dellatangente della f a x n (ve<strong>di</strong> figura 4.5).Figura 4.5: Il metodo <strong>di</strong> Newton-Raphson applicato alla funzione f (x) = (x/2) 2 − sin(x) con x 0 = 1.3Lo schema <strong>di</strong> Newton-Raphson si può vedere come un caso particolare dello schema del punto fisso applicatoalla funzione g (x) = x − f (x)/f ′ (x). Perchè lo schema del punto fisso converga, deve essere |g ′ (x)| < 1in un intorno <strong>di</strong> ξ. Nel caso specifico abbiamo:|g ′ (x)| = |1 − f ′ (x) 2 − f (x)f ′′ (x)f ′ (x) 2 | = | f (x)f ′′ (x)f ′ (x) 2 |Supponendo f ′ (ξ) ≠ 0 (che è il caso in cui la ra<strong>di</strong>ce non è multipla), si ha |g ′ (ξ)| = 0, poichè al numeratoref (ξ) = 0 (essendo ξ ra<strong>di</strong>ce della f ). Per continuità, allora, vale |g ′ (x)| < 1 in un intorno <strong>di</strong> ξ. Pertanto il metodo<strong>di</strong> Newton-Raphson è generalmente convergente.46


4.5. Convergenza <strong>di</strong> un metodo iterativoPer vedere come si riduce l’errore via via che le approssimazioni si avvicinano a ξ, consideriamo l’errorecambiato <strong>di</strong> segno ɛ n , per cui x n = ξ + ɛ n . Sostituendo in (4.2) abbiamoɛ n+1 + ξ = ɛ n + ξ − f (ξ + ɛ n)f ′ (ξ + ɛ n )ɛ n+1 = ɛ n − f (ξ + ɛ n)f ′ (ξ + ɛ n )Applicando la formula polinomiale <strong>di</strong> Taylor sia su f sia su f ′ <strong>di</strong> centro ξ, si ha:ɛ n+1 = ɛ n − f (ξ) + ɛ n f ′ (ξ) + ɛ 2 n f ′′ (ξ)/2 + ...f ′ (ξ) + ɛ n f ′′ (ξ) + ...Poichè f (ξ) = 0, raccogliendo i termini si ricava:ɛ n+1 = ɛ n f ′ (ξ) + ɛ 2 n f ′′ (ξ) − ɛ n f ′ (ξ) − ɛ 2 n f ′′ (ξ)/2 + ...f ′ (ξ) + ɛ n f ′′ (ξ) + ...= ɛ2 n f ′′ (ξ)/2 + ...f ′ (ξ) + ɛ n f ′′ (ξ) + ...Trascurando i termini ɛ n f ′′ (ξ)+... al denominatore e le potenze maggiori o uguali a ɛ 3 n al numeratore si trova:ɛ n+1 = f ′′ (ξ)2f ′ (ξ) ɛ2 n = Aɛ2 nponendo A = f ′′ (ξ)2f ′ (ξ) .L’ultima relazione che abbiamo ottenuto ci <strong>di</strong>ce che l’errore al passo n + 1 è proporzionale, secondo ilfattore A, al quadrato dell’errore al passo precedente. Perciò se partiamo da un errore iniziale dell’or<strong>di</strong>ne<strong>di</strong> 10 −2 , al passo successivo l’errore è proporzionale a 10 −4 e poi a 10 −8 fino a 10 −16 in tre sole iterazioni. Ilnumero delle cifre significative raddoppia ad ogni passo del metodo. Si parla <strong>di</strong> convergenza quadratica.Nel caso in cui ξ sia una ra<strong>di</strong>ce multipla, allora f ′ (ξ) = 0 allora A = ∞: se il metodo converge, la convergenzanon sarà più quadratica ma avremo una convergenza <strong>di</strong> tipo lineare, come vedremo meglio inseguito.Se in ξ vi è un punto <strong>di</strong> flesso, non orizzontale, per cui f (ξ) = 0, f ′ (ξ) ≠ 0, f ′′ (ξ) = 0, allora A = 0 e ciaspettiamo una convergenza superiore a quella quadratica.Sullaconvergenza4.5 Convergenza <strong>di</strong> un metodo iterativoUn metodo iterativo si <strong>di</strong>ce:G linearmente convergente se esiste una costante M < 1 tale che, per n sufficientemente grande, vale|x n+1 − ξ| ≤ M|x n − ξ|G a convergenza quadratica se esiste una costante M tale che, per n sufficientemente grande, vale|x n+1 − ξ| ≤ M|x n − ξ| 2G a convergenza superlineare se esiste una successione <strong>di</strong> costanti M n → 0 tale che, per nsufficientemente grande, vale|x n+1 − ξ| ≤ M n |x n − ξ|.In generale un metodo ha or<strong>di</strong>ne <strong>di</strong> convergenza p se si possono definire due costanti p ≥ 1 e M > 0 taliche|x n+1 − ξ|limn→∞ |x n − ξ| p = M 47


4. ZERI DI FUNZIONELa costante M prende il nome <strong>di</strong> costante asintotica dell’errore o fattore <strong>di</strong> convergenza.Nel caso del metodo <strong>di</strong> Newton-Raphson, generalmente vale p = 2 e la costante asintotica dell’errore èquella che abbiamo definito come A presa in valore assoluto, cioè M =f ′′ (ξ∣2f ′ (ξ)∣ .Nel metodo del punto fisso, la convergenza è lineare. Infatti, considerando l’errore cambiato <strong>di</strong> segno, larelazione x n+1 = g (x n ) si può scrivere, in modo equivalente, comeξ + ɛ n+1 = g (ξ + ɛ n ) e, applicando la formula (polinomiale) <strong>di</strong> Taylor si haξ + ɛ n+1 = g (ξ) + ɛ n g ′ (ξ) + ...ξ + ɛ n+1 = ξ + ɛ n g ′ (ξ) + ...ɛ n+1 = ɛ n g ′ (ξ) + ... e, al limite per n → ∞ɛ n+1 = g ′ (ξ)ɛ nLa costante asintotica per lo schema <strong>di</strong> punto fisso vale, dunque, M = |g ′ (ξ)|.Il metodo delle bisezioni, invece, può essere visto come un metodo lineare, con M = 1 2 (considerandoche, ad ogni passo, si riduce della metà l’intervallo in cui viene cercata l’approssimazione della ra<strong>di</strong>ce).Esempio 4.5.1 Consideriamo l’equazione f (x) = 2x − cos(x) + 1 = 0 che ammette come unica ra<strong>di</strong>ce ξ = 0.Poichè f ′ (x) = 2 + sin(x), il metodo <strong>di</strong> Newton-Raphson <strong>di</strong>venta:x n+1 = x n − 2x n − cos(x n ) + 12 + sin(x n )Partendo da x 0 = 0.5 e richiedendo una tolleranza pari a 10 −10 nei risultati (interrompiamo l’algoritmoquando d n < 10 −10 ), si ha:I valori generati dall’algoritmo tendono a ξ = 0.n x n d n0 0.51 0.4730746270E-01 0.4526925E+002 0.5462695134E-03 0.4676119E-013 0.7458221874E-07 0.5461949E-034 0.1395426403E-14 0.7458222E-075 0.7647622253E-17 0.1387779E-14Considerando che f ′′ (x) = cos(x) possiamo valutare la costante asintotica M = |f ′′ (ξ)|2|f ′ (ξ)| = |cos(ξ)|2(|2 + sin(ξ)|) =14 = 0.25Da un punto <strong>di</strong> vista teorico, applicando il teorema del valor me<strong>di</strong>o, si haf (ξ) − f (x n ) = f ′ (ξ n )(ξ − x n )dove ξ n è un punto, che non conosciamo, compreso tra ξ e x n . Per x n vicino a ξ possiamo considerareξ n ≈ x n , da cui ricaviamo (essendo f (ξ) = 0):−f (x n ) ≈ f ′ (x n )(ξ − x n ). Sostituendo questa espressione nell’iterazione <strong>di</strong> Newton-Raphson si ha:x n+1 = x n − f (x n)f ′ (x n ) ≈ x n + (ξ − x n )vale a <strong>di</strong>rex n+1 − x n = ξ − x n cioè d n+1 = ɛ nMa in con<strong>di</strong>zioni <strong>di</strong> convergenza, d n+1 < d n da cui, per l’errore, vale la maggiorazione ɛ n < d n .48


4.6. Complessità computazionale <strong>di</strong> uno schemaPerciò gli scarti sono molto vicini agli errori e possono essere utilizzati sia per controllare il numero <strong>di</strong>iterazioni da effettuare per approssimare la ra<strong>di</strong>ce entro una certa tolleranza sia per approssimare M.Nel nostro esempiod 2(d 1 ) 2 = 0.2282 d 3(d 2 ) 2 = 0.2498 d 4(d 3 ) 2 = 0.2500 d 5(d 4 ) 2 = 0.24954.6 Complessità computazionale <strong>di</strong> uno schemaUn altro elemento da considerare per valutare l’efficienza numerica <strong>di</strong> uno schema iterativo è la sua complessitàcomputazionale. Un metodo, infatti, può avere un elevato or<strong>di</strong>ne <strong>di</strong> convergenza ma avere anche uncosto computazionale molto elevato. Viceversa, un metodo può avere un basso or<strong>di</strong>ne <strong>di</strong> convergenza maessere anche semplice computazionalmente e, quin<strong>di</strong>, molto vantaggioso da questo punto <strong>di</strong> vista.Si definisce in<strong>di</strong>ce <strong>di</strong> efficienza E dello schema iterativo la quantitàE = p 1/sdove s in<strong>di</strong>ca il numero <strong>di</strong> volte in cui bisogna calcolare la funzione e la sua derivata prima ad ogni iterazionee p è l’or<strong>di</strong>ne <strong>di</strong> convergenza del metodo.4.7 Il metodo delle secantiLa conoscenza della derivata prima della f per applicare il metodo <strong>di</strong> Newton-Raphson potrebbe esseresemplice ma a volte potrebbe rivelarsi un’operazione molto costosa e alquanto complicata.Il metodo delle secanti è una variante del metodo <strong>di</strong> Newton-Raphson dove, al posto della derivata prima,si considera una sua approssimazione.Scriviamo la formula ricorsivax n+1 = x n − f (x n)C nPer C n = f ′ (x n ) abbiamo la formula <strong>di</strong> Newton-Raphson, che possiamo anche chiamare della tangentevariabile perchè è il coefficiente angolare della retta tangente a (x n , f (x n )) che interseca l’asse delle x in x n+1 .Ve<strong>di</strong>amo altre scelte <strong>di</strong> C n :G C n = f ′ (x 0 ) il valore <strong>di</strong> C n è costante e dà vita al metodo della tangente fissa.G C n = f (x 1) − f (x 0 ): abbiamo sempre una costante che approssima la derivata f ′ (x 0 ) utilizzando i valorix 1 − x 0<strong>di</strong> x 1 e x 0 . Lo schema è detto della secante fissa.G C n = f (x n) − f (x n−1 ). La derivata f ′ (x n ) è approssimata utilizzando il rapporto incrementale della fx n − x n−1valutata in x n e x n−1 . Abbiamo il metodo delle secante variabile, che chiameremo nel seguito anchemetodo 2 della Regula Falsi.In forma estesa, l’iterazione n + 1 della Regula Falsi si scrive come:x n+1 = x n − f (x n)(x n − x n−1 )f (x n ) − f (x n−1 )49


4. ZERI DI FUNZIONEFigura 4.6: Il metodo della Regula Falsi applicato alla funzione f (x) = (x/2) 2 − sin(x) con x 0 = 1.3 e x 1 = 1.35Notiamo che, per innescare il metodo occorrono due valori iniziali, x 0 e x 1 . Ma è richiesta solo lavalutazione della funzione f a ciascun passo (nessuna conoscenza della derivata prima).Da un punto <strong>di</strong> vista geometrico, nel metodo delle secanti il valore x n+1 è dato dall’intercetta sull’assedelle x della retta passante per x n , f (x n ) e x n−1 , f (x n−1 ). Per quanto riguarda l’accumulo <strong>degli</strong> errori <strong>di</strong> arrotondamento,conviene utilizzare la formula così come è stata scritta in quanto è più sicura rispetto alla formacompatta in cui vengono raccolti i termini, data dax n+1 = x n−1 f (x n ) − x n f (x n−1 )f (x n ) − f (x n−1 )in quanto in quest’ultima, si può avere il fenomeno della cancellazione numerica per x n ≈ x n−1 ef (x n )f (x n−1 ) > 0.Per quanto riguarda l’or<strong>di</strong>ne <strong>di</strong> convergenza si può <strong>di</strong>mostrare che si ha convergenza superlineare poichèvale la relazioneɛ n+1 = Adove p = 1 + 52pp + 1 ɛpnɛ n+1 = A 0.618 ɛ 1.618n= 1.618 e A è la costante asitontica del metodo <strong>di</strong> Newton-Raphson, da cui4.8 Confronto tra i meto<strong>di</strong> <strong>di</strong> Newton-Raphson e la Regula FalsiSebbene il metodo <strong>di</strong> Newton-Raphson abbia or<strong>di</strong>ne <strong>di</strong> convergenza più elevato della Regula Falsi,quest’ultimo è computazionalmente più efficiente. Si ha infattiMetodo p s ENewton-Raphson 2 2 2 ≈ 1.414Regula Falsi 1.618 1 1.6182 Attenzione! In letteratura viene descritto un altro metodo (simile ma non lo stesso) con il nome della Regula Falsi o Falsa Posizioneche genera i valori x n+1 in modo che la ra<strong>di</strong>ce ξ sia sempre compresa tra le iterazioni successive.50


4.8. Confronto tra i meto<strong>di</strong> <strong>di</strong> Newton-Raphson e la Regula FalsiVe<strong>di</strong>amo ora come applicare i due meto<strong>di</strong> e le <strong>di</strong>fferenze che si hanno.Esempio 4.8.1 Consideriamo la funzione f (x) = 0 con f (x) = (x/2) 2 − sin(x). La derivata prima è f ′ (x) =(x/2) − cos(x) Consideriamo come x 0 = 1.3 per entrambi i meto<strong>di</strong> e x 1 = 1.35 per la Regula Falsi. Comecriterio <strong>di</strong> arresto, consideriamo una tolleranza tol = 1.e − 8, cioè andremo avanti con le iterazioni fino aquando troveremo che lo scarto d n = |x n − x n−1 | sarà minore <strong>di</strong> tol. Otteniamo i seguenti risultati per ilmetodo <strong>di</strong> Newton-RaphsonPer la Regula Falsi:n x n f (x n ) f ′ (x n ) d n d n /dn−120 1.3 -0.541058185 0.3825011711 2.714526871831 1.42796213 2.26744846 1.414526872 2.084760792766 0.215754599 1.53401376 0.629766079 0.3147435653 1.944113685369 0.0137718957 1.33676314 0.140647107 0.354627394 1.933811265085 7.60156095E-05 1.32199993 0.0103024203 0.5208080085 1.933753764621 2.37200355E-09 1.32191743 5.7500464E-05 0.5417423966 1.933753762827 -1.00668172E-16 1.79436599E-09 0.542710632n x n f (x n )f (x n ) − f (x n−1 )d n d n /dx n − x n−11.618n−10 1.3 -0.5410581851 1.35 -0.520098358 0.4191965522 2.590702853065 1.15448972 1.34970922 1.240702853 1.735341043061 -0.233640901 1.62285784 0.85536181 0.6033862154 1.879309845941 -0.0698346071 1.1377902 0.143968803 0.1853744735 1.940687248331 0.00919996444 1.28768192 0.0613774024 1.412310766 1.933542654410 -0.000279035921 1.32673746 0.00714459392 0.6531002157 1.933752971771 -1.04570967E-06 1.3217654 0.000210317362 0.6239352398 1.933753762918 1.19824825E-10 1.32191686 7.91146198E-07 0.7044414559 1.933753762827 -1.00668172E-16 9.0644825E-11 0.676026603Attraverso gli scarti, abbiamo fatto una stima della costante asintotica dell’errore, considerando che, allimite per k → ∞, x n → ξ. Le ultime colonne delle tabelle, infatti, valutano i rapporti d n /dn−1 2 e d n/dn−1 1.618.Diamo un’ulteriore stima <strong>di</strong> tali costanti facendo uso della definizione teorica e considerando ξ ≈ x n .Per il metodo <strong>di</strong> Newton-Raphson dobbiamo calcolare M = |f ′′ (ξ)|2|f ′ mentre per la Regula Falsi dobbiamo(ξ)|considerare il valore M 0.618 .Poichè f ′′ (x) = 1/2+sin(x), abbiamo, per ξ ≈ x 6 (<strong>di</strong> Newton-Raphson) o, equivalentemente per ξ ≈ x 9 (dellaRegula Falsi), in pratica ξ ≈ 1.933753762827, f ′ (ξ) = 1.32191743 e f ′′ (ξ) = 1.4348509. Otteniamo quin<strong>di</strong>:M ≈ 0.542715784 e M 0.618 ≈ 0.685434221Esempio 4.8.2 Sia data f (x) = sin(x). Nell’intervallo ] − π/2,π/2[ la f ha esattamente una ra<strong>di</strong>ce, ξ = 0.Il metodo <strong>di</strong> Newton applicato alla funzione f , <strong>di</strong>venta:x n+1 = x n − tan(x n ), n = 0,1,2,...Se scegliamo come valore iniziale x 0 = x ∗ tale che tan(x ∗ ) = 2x ∗ , allora x 1 = −x 0 , x 2 = −x 1 = x 0 ... Si ha unasituazione <strong>di</strong> stallo: i valori della successione saranno, alternativamente, x ∗ e −x ∗ e non avremo convergenzaalla ra<strong>di</strong>ce ξ = 0. Il valore critico x ∗ vale 1.165561185207 e lo si può trovare numericamente applicandoil metodo del punto fisso a alla funzione g (x) = arctan(2x).a Se si considera g (x) = tan(x)/2 si trova il punto fisso 0 in quanto g ′ (x ∗ ) > 1 per g (x) = tan(x)/2.51


4. ZERI DI FUNZIONEVe<strong>di</strong>amo dunque cosa accade applicando il metodo <strong>di</strong> Newton-Raphson e la Regula Falsi utilizzando comex 0 = x ∗ ( e x 1 = −x 0 nella Regula Falsi). Facciamo i conti in singola precisione a , richiedendo un’accuratezzadell’or<strong>di</strong>ne ɛ = 10 −8 .Abbiamo le seguenti tabelle.Per Newton-RaphsonPer la Regula Falsi:n x n f (x n ) f ′ (x n ) d n0 1.1655612 0.919009745 0.3942348661 -1.1655612 -0.919009745 0.394234866 2.33112242 1.1655612 0.919009745 0.394234866 2.33112243 -1.1655612 -0.919009745 0.394234866 2.3311224...n 1.1655612 0.919009745 0.394234866 2.3311224n+1 -1.1655612 -0.919009745 0.394234866 2.3311224n x n f (x n )f (x n ) − f (x n−1 )x n − x n−1d n0 1.1655612 0.9190097451 -1.1655612 -0.919009745 0.7884697322 0.000000024087 0.000000024087 0.788469732 1.16556123 -0.000000006462 -0.000000006462 3.05485912E-08 2.38417108E-084 0.000000000000 0.0000000000000 6.46195142E-09Poche iterazioni sono necessarie perchè la Regula Falsi converga alla soluzione esatta.Perchè il metodo <strong>di</strong> Newton-Raphson converga il valore iniziale x 0 deve essere scelto tale che |x 0 | < x ∗ .a Lavorando in doppia precisione non si riesce a osservare il comportamento ciclico ma si ha convergenza o <strong>di</strong>vergenza aseconda che si abbia un’iterata |x k | < o > x ∗ ...QuandoNewton-Raphson dàrisultatiscarsiQuesto esempio ci permette <strong>di</strong> capire il significato <strong>di</strong> metodo generalmente convergente e il fatto che le proprietà<strong>di</strong> convergenza <strong>di</strong> un metodo possono valere localmente, cioè quando si è sufficientemente vicini allara<strong>di</strong>ce.Da un punto <strong>di</strong> vista pratico occorre prestare molta attenzione anche alla scelta del punto iniziale per ilmetodo <strong>di</strong> Newton-Raphson. Dal momento che la formula richiede una <strong>di</strong>visione per f ′ (x n ), occorre evitare<strong>di</strong> prendere un punto iniziale in cui la f abbia una tangente (e quin<strong>di</strong> f ′ ) con pendenza vicina allo zero. In talcaso, infatti, ci si può allontanare dalla ra<strong>di</strong>ce e il metodo può non convergere.Esempio 4.8.3 Consideriamo f (x) = x 5 − 6, per la quale f ′ (x) = 5x 4 , il cui grafico è in Figura 4.7 (a destra).Se partiamo da un punto iniziale prossimo allo zero, poichè la tangente alla f è quasi orizzontale, non siriesce ad avere convergenza se non dopo molte iterazioni: partendo da x 0 = 0.01 e richiedendo una tolleranza10 −8 , sono necessarie 88 iterazioni per arrivare a ξ = 1.430969081115725849. Ve<strong>di</strong>amo in tabella, comecambia il numero delle iterazioni al variare <strong>di</strong> x 0 :x 0 0.05 0.1 0.5 0.8 1.0 1.4 1.5 2. 3. 10. 20. 100.iterazioni 59 46 18 10 7 4 4 6 8 14 17 2452


4.9. Metodo <strong>di</strong> Newton-Raphson per ra<strong>di</strong>ci multipleFigura 4.7: Il metodo <strong>di</strong> Newton-Raphson applicato alla funzione f (x) = sin(x) con x 0 = x ∗ (a sinistra). Lafunzione f (x) = x 5 − 6 (a destra)4.9 Metodo <strong>di</strong> Newton-Raphson per ra<strong>di</strong>ci multipleDefinizione 4.9.1 Data una funzione f (x) = 0, una ra<strong>di</strong>ce ξ è multipla <strong>di</strong> molteplicità r se vale: f (ξ) = f ′ (ξ) =... = f r −1 (ξ) = 0 e f r (ξ) ≠ 0.Quando si ha una ra<strong>di</strong>ce multipla, il metodo <strong>di</strong> Newton-Raphson <strong>di</strong>venta un metodo del primo or<strong>di</strong>ne inquanto la formula che lega l’errore al passo n + 1 con l’errore al passo n <strong>di</strong>venta 3 :ɛ n+1 = r − 1 ɛ nrda cui la costante asintotica è M = r − 1 . Per poter avere un metodo che sia <strong>di</strong> nuovo a convergenzarquadratica, occorre mo<strong>di</strong>ficare l’algoritmo, ottenendo la formula <strong>di</strong> Newton-Raphson mo<strong>di</strong>ficata, nel modoseguente:x n+1 = x n − r f (x n)f ′ (x n )4.10 Controllo sugli scarti e grafici <strong>di</strong> convergenzaDa un punto <strong>di</strong> vista pratico, il controllo per verificare la convergenza o meno della successione x n generatadallo schema iterativo viene effettuato sullo scarto d n = |x n − x n−1 | piuttosto che sull’errore ɛ n = |ξ − x n |,poichè, se avessimo informazioni sull’errore, conosceremmo anche il valore <strong>di</strong> ξ (che, in generale, non ènoto).Nel caso del metodo <strong>di</strong> Newton-Raphson, quando è <strong>di</strong> or<strong>di</strong>ne 2, abbiamo visto che il controllo sullo scartova bene (si veda quanto detto a pag. 49).Ve<strong>di</strong>amo cosa succede per meto<strong>di</strong> lineari. Sia tol l la tolleranza richiesta per approssimare ξ utilizzandogli scarti. Sappiamo che, per n grande e se il metodo converge, vale la relazioneɛ n+1 ≈ Mɛ ndove M < 1 è la costante asintotica.3 Il proce<strong>di</strong>mento da seguire è del tutto simile a quanto è stato fatto nell’ipotesi in cui f ′ (ξ) ≠ 0. Come esercizio, si consiglia <strong>di</strong> provarea ricavare questo risultato.53


4. ZERI DI FUNZIONERiscriviamo la precedente formula come:|ξ − x n+1 | ≈ M|ξ − x n | = M|ξ − x n + x n+1 − x n+1 | ≤ M (|ξ − x n+1 | + |x n+1 − x n |)Quin<strong>di</strong>ɛ n+1 ≤ M(ɛ n+1 + d n+1 )(1 − M)ɛ n+1 ≤ Md n+1Supponendo d n+1 ≤ tol l, valeɛ n+1 ≤M1 − M d n+1 ≤ M1 − M tol lMPerciò, per1 − M < 1 (quin<strong>di</strong> per M < 1/2), se d n+1 ≤ tol l anche ɛ n+1 ≤ tol l. Se, invece, M ≥ 1/2, alloral’errore può essere più grande della tolleranza richiesta.Per quanto riguarda il metodo della secante variabile, poichè è superlineare, in base alla definizione,ɛ n+1 ≈ M n+1 ɛ n con M n+1 → 0, perciò si può vedere come un caso limite <strong>di</strong> convergenza lineare con fattore <strong>di</strong>convergenza che tende a zero, e quin<strong>di</strong> il controllo dello scarto permette un buon controllo dell’errore.Quando si implementa un metodo iterativo, si può fare il grafico semilogaritmico <strong>di</strong> convergenza delmetodo, ponendo sull’asse delle ascisse i valori delle iterazioni e sull’asse delle or<strong>di</strong>nate i logaritmi (in base10) <strong>degli</strong> scarti.Asintoticamente possiamo sostituire l’errore con lo scarto, nella definizione <strong>di</strong> or<strong>di</strong>ne <strong>di</strong> convergenza <strong>di</strong>un metodo, per cui d n ≈ Md p n−1 .Nel caso in cui p = 1, si ha:d n ≈ Md n−1d n−1 ≈ Md n−2d n−2 ≈ Md n−3. . . .d 2 ≈ Md 1d 1 ≈ Md 0Partendo ora dalla prima relazione abbiamo:d n ≈ Md n−1 ≈ M 2 d n−2 ≈ M 3 d n−3 ≈ ... ≈ M n d 0Troviamo una relazione tra d n e d 0 . Passando ai logaritmi:log 10 (d n ) = n log 10 (M) + log 10 (d 0 )Abbiamo un’equazione del tipo y = ax + b dove y = log 10 (d n ) e x = n, che rappresenta l’equazione della rettanel nostro grafico semilogaritmico, e la pendenza della retta vale a = log 10 (M). Dalla pendenza della rettapossiamo dunque risalire al valore della costante asintotica M.Nel caso in cui p ≠ 1 il <strong>di</strong>scorso si fa più complicato (e non staremo qui ad analizzarlo nei dettagli). Peresempio, per p = 2, si trova una curva che <strong>di</strong>pende da 2 n .54


4.11. <strong>Esercizi</strong>Esempio 4.10.1 In Figura 4.8, riportiamo un esempio <strong>di</strong> grafico con i profili <strong>di</strong> convergenza per i meto<strong>di</strong><strong>di</strong> Newton-Raphson, secante variabile e punto fisso per trovare lo zero della funzione f (x) = x + ln(x)(applicando lo schema <strong>di</strong> punto fisso alla funzione g (x) = e −x ).Figura 4.8: Profili <strong>di</strong> convergenza a confronto4.11 <strong>Esercizi</strong><strong>Esercizi</strong>o 4.11.1 Si vuole risolvere l’equazione x = g (x) con lo schema del punto fisso; sapendo cheg (x) = x 2 − 5x + 9(a) calcolare analiticamente il valore del punto fisso;(b) determinare il fattore <strong>di</strong> convergenza M dello schema del punto fisso;(c) calcolare le approssimazioni x 1 , x 2 e x 3 partendo prima da x 0 = 1 e poi da x 0 = 2.5 e giustificandoneil <strong>di</strong>verso comportamento.Svolgimento(a) ξ è punto fisso della funzione g se verifica g (ξ) = ξ.Imponiamo dunque la con<strong>di</strong>zione g (ξ) = ξ. Ricaviamo ξ 2 − 5ξ + 9 = ξ, ovvero ξ 2 − 6ξ + 9 = 0, cioè(ξ − 3) 2 = 0, da cui ξ = 3 è punto fisso della g .55


4.11. <strong>Esercizi</strong>Inoltre f è continua, quin<strong>di</strong> ammette almeno una ra<strong>di</strong>ce nell’intervallo dato. La derivata prima è:f ′ (x) = 1 x + 2x − 1, che possiamo anche scrivere come f ′ (x) = 1 + 2x2 − x: numeratore e denominatorexsono entrambi sempre positivi nell’intervallo dato, (la parabola 2x 2 − x + 1 ha <strong>di</strong>scriminante negativo∆ = −7, <strong>di</strong> conseguenza, per ogni x reale si ha 2x 2 − x + 1 > 0). Da f ′ (x) > 0 per ogni x segue che f ècrescente e, quin<strong>di</strong>, ammette un’unica ra<strong>di</strong>ce.(b) Applichiamo il metodo delle bisezioni a partire dall’intervallo dato (utilizziamo la notazione x s perin<strong>di</strong>care l’estremo sinistro dell’intervallo, x d per in<strong>di</strong>care l’estremo destro dell’intervallo, x c , il puntome<strong>di</strong>o dell’intervallo considerato):iter. x s f (x s ) segno x d f (x d ) segno x c f (x c )1 0.7 -0.566674944 - 2.3 3.822909123 + 1.5 1.1554651082 0.7 -0.566674944 - 1.5 1.155465108 + 1.1 0.205310180Il valore x 0 è dunque x 0 = 1.1.(c) Il metodo <strong>di</strong> Newton-Rapshon è x k+1 = x k − f (x k)f ′ (x k ) dove f ′ = 1/x +2x −1. Partendo da x 0 = 1.1, si ricavax 1 = 1.1 − 0.205310182.1090909 = 1.002654656(d) Applicando il metodo della Regula Falsi si ha:k x k f (x k )f (x k ) − f (x k−1 )x k − x k−11 1.002654656 0.5312842078E-02 0.2054513650E+012 1.000068720 0.1374413812E-03 0.2001364094E+013 1.000000046(e) Considerato che la ra<strong>di</strong>ce esatta è ξ = 1, la costante asintotica <strong>di</strong> convergenza della Regula Falsi si calcolautilizzando l’espressione M = | f ′′ (ξ)2f ′ (ξ) |0.618 . Da f ′ (x) = 1 x + 2x − 1 segue f ′ (1) = 2 e f ′′ (x) = − 1 x 2 + 2,da cui f ′′ (1) = 1, per cui M = 1 0.618= 0.4245481.459


C A P I T O L O5INTERPOLAZIONENon vi è alcuna incompatibilità fral’esatto e il poetico. Il numero ènell’arte come nella scienza.L’algebra è nell’astronomia el’astronomia confina con la poesia.L’anima dell’uomo ha tre chiavi cheaprono tutto: la cifra, la lettera, lanota. Sapere, pensare, sognare.Victor Hugo5.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625.3 Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635.3.1 Funzioni base monomiali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635.3.2 Polinomi <strong>di</strong> Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655.3.3 Formula dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665.3.4 Differenze <strong>di</strong>vise e formula <strong>di</strong> Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675.4 Considerazioni sull’interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.4.1 Fenomeno <strong>di</strong> Runge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.4.2 Malcon<strong>di</strong>zionamento nell’interpolazione con funzioni base monomiali . . . . . . . . . . 725.5 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735.1 IntroduzioneIl censimento della popolazione italiana, dall’unità d’Italia al 2001, ha visto un incremento dellapopolazione, come si può vedere in Tabella 5.1. Gli stessi dati sono riportati in Figura 5.1.Ci si può chiedere se questi dati possono essere utili (considerandoli tutti o solo una parte) per dare unaragionevole stima della popolazione nel 1975 o nel 1995 o per pre<strong>di</strong>re a quanto ammonterà nel 2015. Per farciò, possiamo seguire due strade:G cercare una funzione che passi esattamente per i dati assegnati (detti anche punti <strong>di</strong> appoggio): questoproce<strong>di</strong>mento prende il nome <strong>di</strong> interpolazione ed è il soggetto <strong>di</strong> questo Capitolo;61


5. INTERPOLAZIONEAnno 1861 1871 1881 1901 1911 1921 1931Popolazione 22176 27300 28952 32963 35842 39397 41043Anno 1936 1951 1961 1971 1981 1991 2001Popolazione 42398 47516 50624 54137 56557 56778 56996Tabella 5.1: Dati forniti dall’ISTAT, tratti da http://dawinci.istat.it/daWinci/jsp/dawinci.jsp:popolazione residente dell’Italia ai confini ai confini attuali ai censimenti dal 1861 al 2001. Popolazione inmigliaia.Figura 5.1: Censimento della popolazione residente in Italia.G cercare una funzione che, “in qualche modo” passi vicino ai dati assegnati: si parla <strong>di</strong> approssimazione(che vedremo nel prossimo Capitolo).In particolare, dato l’insieme dei punti (x i , y i ), i = 0,1,...,n, dove y i è il valore assunto da una funzione fin x i o il valore <strong>di</strong> un dato sperimentale, cerchiamo una funzione v(x) che, in maniera ragionevole si ad<strong>di</strong>caall’insieme dei dati. Se i dati sono accurati, ha senso richiedere che la funzione interpoli i dati (cioè passiesattamente per le coppie <strong>di</strong> punti): v(x i ) = y i . Nell’approssimazione, invece, si cerca una funzione piùsemplice v(x) che sia vicina ad una funzione più complicata f (x) o ad una serie <strong>di</strong> dati.5.2 InterpolazioneUna funzione <strong>di</strong> interpolazione v(x) serve per vari scopi.G Possiamo usare la v(x) per trovare valori approssimati y in punti x <strong>di</strong>versi da quelli assegnatix 0 , x 1 ,... x n . Se x si trova all’interno dell’intervallo che contiene le ascisse dei dati assegnati si parla<strong>di</strong> interpolazione. Se invece x si trova all’esterno dell’intervallo si ha estrapolazione. Nell’esempio dellapopolazione italiana, si interpolano i dati per stimare la popolazione nel 1975 o nel 1995, si applicainvece un proce<strong>di</strong>mento <strong>di</strong> estrapolazione se si vuole stimare la popolazione del 2012.G Se le coppie <strong>di</strong> dati assegnati si riferiscono ad una funzione f (x), la funzione <strong>di</strong> interpolazione puòessere utile per approssimare le derivate o gli integrali della f .Assumiamo che la funzione v <strong>di</strong> interpolazione sia una combinazione lineare <strong>di</strong> funzioni base <strong>di</strong> unqualche appropriato spazio <strong>di</strong> funzioni, cioè si possa scrivere come62v(x) = c 0 φ 0 (x) + ... + c n φ n (x)


5. INTERPOLAZIONEFigura 5.2: Interpolazione lineare e quadraticaEsempio 5.3.2 Consideriamo adesso un ulteriore coppia <strong>di</strong> punti per cui i dati che abbiamo sono n + 1 = 3ex i 1 2 4y i 1 3 3Il problema è ora <strong>di</strong>verso rispetto a quello appena risolto, perchè la terza coppia <strong>di</strong> punti specifica unavalore y 2 ben <strong>di</strong>verso da quello predetto da p 1 in x 2 = 4. Difatti p 1 (x 2 ) = 7, nell’esempio precedente, mentreora al valore <strong>di</strong> x 2 = 4 deve corrispondere y 2 = 3.Cerchiamo il polinomio <strong>di</strong> grado 2, quin<strong>di</strong>, della forma p 2 (x) = c 0 + c 1 x + c 2 x 2 che passa attraverso i puntidati.Le con<strong>di</strong>zioni <strong>di</strong> interpolazione adesso sono:⎧⎪⎨ p 2 (x 0 ) = c 0 + 1c 1 + 1c 2 = 1p 2 (x 1 ) = c 0 + 2c 1 + 4c 2 = 3⎪⎩p 2 (x 2 ) = c 0 + 4c 1 + 16c 2 = 3Abbiamo un sistema lineare <strong>di</strong> 3 equazioni in 3 incognite, la cui soluzione è:c 0 = − 7 3 , c 1 = 4, c 2 = − 2 3 .Il polinomio è p 2 (x) = (−2x 2 + 12x − 7)/3. Per x = 3 si ha p 2 (3) = 11 = 3.666666667, valore ben <strong>di</strong>verso da3p 1 (3) = 5. Del resto le curve che abbiamo ottenuto coincidono solo nei punti d’appoggio comuni a entrambe,per il resto l’una è una retta, l’altra è un polinomio <strong>di</strong> secondo grado (si veda Figura 5.2).Generalizzando gli esempi precedenti, date n + 1 coppie <strong>di</strong> punti, il polinomio <strong>di</strong> interpolazione <strong>di</strong> gradon sarà costruito risolvendo un sistema lineare <strong>di</strong> n equazioni nelle n incognite c 0 ,c 1 ,...,c n :⎧p n (x 0 ) = y 0 ⇐⇒ c 0 + c 1 x 0 + c 2 x0 2 + ... + c n x0 n = y 064p ⎪⎨ n (x 1 ) = y 1 ⇐⇒ c 0 + c 1 x 1 + c 2 x1 2 + ... + c n x1 n = y 1p n (x 2 ) = y 2 ⇐⇒ c 0 + c 1 x 2 + c 2 x2 2 + ... + c n x2 n = y 2.⎪⎩p n (x n ) = y n ⇐⇒ c 0 + c 1 x n + c 2 xn 2 + ... + c n xn n = y n


5.3. Interpolazione polinomialeIn forma compatta, sotto forma matriciale 2 le equazioni del sistema si possono scrivere come⎛1 x 0 x0 2 ... x n ⎞⎛ ⎞ ⎛ ⎞01 x 1 x1 2 ... x1n c 0 y 01 x 2 x 2 2... x2n c 1⎜⎝..⎜.⎟⎝⎟. ⎠ = y 1⎜⎝⎟. ⎠. ⎠1 x n xn 2 ... xnn c n y nLa matrice dei coefficienti è una matrice ben nota in letteratura e prende il nome <strong>di</strong> matrice <strong>di</strong> Vandermonde.3 È una matrice con determinante <strong>di</strong>verso da zero, e quin<strong>di</strong> il sistema ammette una ed una solasoluzione. Osserviamo che la prima colonna ha tutti gli elementi uguali a 1, la seconda colonna ha le ascissedei punti <strong>di</strong> appoggio, la terza colonna ha i quadrati <strong>di</strong> esse, e così via.Perciò, date n+1 coppie <strong>di</strong> punti <strong>di</strong> appoggio (x i , y i ), i = 0,...,n, con ascisse <strong>di</strong>stintex i , esiste un unico polinomio interpolatore p(x) <strong>di</strong> grado al più n tale che p(x i ) = y i ,i = 0,...,n.Tuttavia, la matrice <strong>di</strong> Vandermonde non ha buone proprietà: <strong>di</strong>fatti è una matrice malcon<strong>di</strong>zionata, equesto lo si osserva al crescere <strong>di</strong> n in quanto la soluzione del sistema <strong>di</strong>venta inaccurata 4 , qualunque metodovenga utilizzato per risolverlo.Questo approccio ci è servito per <strong>di</strong>mostrare che il polinomio <strong>di</strong> interpolazione esiste ed è unico, manon è utile nella pratica a causa del malcon<strong>di</strong>zionamento. Sarebbe preferibile, quin<strong>di</strong>, poter usare funzionibase <strong>di</strong>verse dai monomi in modo da evitare il malcon<strong>di</strong>zionamento, avere meno operazioni dal punto <strong>di</strong>vista computazionale e poter manipolare in maniera più efficiente le funzioni basi φ i in vista <strong>di</strong> una loroapplicazione nella <strong>di</strong>fferenziazione e integrazione numerica.5.3.2 Polinomi <strong>di</strong> LagrangeScriviamo il polinomio p(x) con i coefficienti c i uguali alle or<strong>di</strong>nate dei punti d’appoggio y i , c i ≡ y i :p(x) = p n (x) = y 0 φ 0 (x) + ... y n φ n (x)Una base <strong>di</strong> funzioni che ci permette una simile rappresentazione è data dai polinomi <strong>di</strong> Lagrange. 5I polinomi <strong>di</strong> Lagrange L j (x), per j = 0,1,...,n sono polinomi <strong>di</strong> grado n che, nei no<strong>di</strong> x i , sod<strong>di</strong>sfano larelazione{0 se i ≠ jL j (x i ) =1 se i = jAllora il polinomio p n (x) = ∑ nj =0 L j (x) · y j è tale che p n (x i ) = y i cioè sod<strong>di</strong>sfa la con<strong>di</strong>zione <strong>di</strong>interpolazione, per ogni i = 0,...,n.2 Questo argomento verrà approfon<strong>di</strong>to nel Capitolo 7, dove riman<strong>di</strong>amo per i dettagli.3 Alexandre-Theophile Vandermonde, (1735-1796), abbandonò una carriera da violinista per de<strong>di</strong>carsi alla matematica quandoaveva 35 anni. Si occupò <strong>di</strong> vari problemi <strong>di</strong> algebra, <strong>di</strong> topologia, calcolo combinatoriale, e teoria dei determinanti.4 Una matrice A è malcon<strong>di</strong>zionata quando, a piccole variazioni sui coefficienti della matrice, corrispondono gran<strong>di</strong> variazioni nellasoluzione del sistema lineare Ax = b5 Joseph Louis Lagrange (1736-1813) nacque a Torino (come Giuseppe Luigi Lagrangia) e si trasferì in Francia, a Parigi, dove <strong>di</strong>vennecitta<strong>di</strong>no francese adottando la traduzione francese del suo nome. Matematico e astronomo, <strong>di</strong>ede un importante contributo allameccanica classica e celeste e alla teoria dei numeri.65


5. INTERPOLAZIONEI polinomi <strong>di</strong> Lagrange sono definiti dalla relazione: 6L j (x) =n∏k=0k≠j(x − x k )(x j − x k )Introduciamo anche il polinomio F (x) <strong>di</strong> grado n + 1 (che ci servirà in seguito), che si annulla nelle n + 1ascisse dei dati assegnati.F (x) =n∏(x − x k )k=0In forma estesa abbiamoL j (x) = (x − x 0)···(x − x j −1 )(x − x j +1 )···(x − x n )(x j − x 0 )···(x j − x j −1 )(x j − x j +1 )···(x j − x n ) = n∏k=0k≠jx − x kx j − x kEsempio 5.3.3 Siano date le tre coppie <strong>di</strong> punti dell’esempio precedente (1,1), (2,3), (4,3). I polinomi <strong>di</strong>Lagrange sono:(x − 2)(x − 4) (x − 2)(x − 4)L 0 (x) = =(1 − 2)(1 − 4) 3(x − 1)(x − 4) (x − 1)(x − 4)L 1 (x) = = −(2 − 1)(2 − 4) 2(x − 1)(x − 2) (x − 1)(x − 2)L 2 (x) = =(4 − 1)(4 − 2) 6Il polinomio si scrive, quin<strong>di</strong> comep 2 (x) = L 0 (x) · 1 + L 1 (x) · 3 + L 2 (x) · 3 = 1 3 (x − 2)(x − 4) − 3 2 (x − 1)(x − 4) + 3 (x − 1)(x − 2)6Raccogliendo i termini ritroviamo p 2 (x) = (−2x 2 + 12x − 7)/3, lo stesso polinomio ottenuto con le funzionibase monomiali, e ciò è dovuto all’unicità del polinomio interpolatore.Formuladell’errore5.3.3 Formula dell’erroreSupponiamo, ora, che le or<strong>di</strong>nate y i siano i valori <strong>di</strong> una funzione f valutata nei punti <strong>di</strong> appoggio x i . Conosciamo,quin<strong>di</strong>, una funzione f e <strong>di</strong> questa funzione vogliamo fare l’interpolazione sostituendola me<strong>di</strong>anteun polinomio <strong>di</strong> grado n tale che p(x i ) = f (x i ) = y i , i = 0,...,n.Quale errore si commette interpolando la funzione f con un polinomio <strong>di</strong> grado n?Consideriamo un ulteriore punto t <strong>di</strong>stinto dai punti <strong>di</strong> appoggio e compreso nell’intervallo I in<strong>di</strong>viduatodai valori minimo e massimo delle ascisse dei punti <strong>di</strong> appoggio.f (t) − p(t)Definiamo la quantità S che <strong>di</strong>pende da t, data da S = e la funzione G(x) = f (x)−p(x)−SF (x).F (t)6 Ricor<strong>di</strong>amo che, dati n valori w 1 , w 2 ,..., w n usiamo la seguente simbologia per in<strong>di</strong>care la loro somma e il loro prodotto, rispettivamente:.n∑w i = w 1 + w 2 + w 3 + ... + w ni=1n∏w i = w 1 · w 2 · w 3 · ... · w ni=166


5.3. Interpolazione polinomialeLa quantità chiamata c 2 prende il nome <strong>di</strong> <strong>di</strong>fferenza <strong>di</strong>visa del secondo or<strong>di</strong>ne e si in<strong>di</strong>ca conf [x 0 , x 1 , x 2 ] = f [x 1, x 2 ] − f [x 0 , x 1 ]x 2 − x 0.Facendo le opportune sostituzioni si ricava c 2 = − 4 6 = − 2 3 .Quin<strong>di</strong>, p 2 (x) = f (x 0 ) + f [x 0 , x 1 ](x − x 0 ) + f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ) Nell’esempio considerato: p 2 (x) =1 + 2(x − 1) − 2 (x − 1)(x − 2)3Date le stesse coppie <strong>di</strong> punti, abbiamo visto come cambia la rappresentazione (usando come funzionibase i monomi, poi i polinomi <strong>di</strong> Lagrange e ora la formulazione <strong>di</strong> Newton) ma il polinomio finale è semprelo stesso essendo unico il polinomio interpolatore.Da questo esempio, si può vedere come la rappresentazione secondo Newton sia <strong>di</strong> tipo ricorsivo: il polinomiop 1 (x) = f (x 0 ) + f [x 0 , x 1 ](x − x 0 ) (che si ha arrestandosi ai primi due passi del proce<strong>di</strong>mento appenaeffettuato) è un polinomio, in tal caso una retta, che interpola i dati (x 0 , y 0 ), e (x 1 , y 1 ). Il polinomio p 2 (x) è datodalla somma <strong>di</strong> p 1 (x) e del termine f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ). Quin<strong>di</strong>, una volta determinato il polinomiop n−1 che interpola i primi n dati, possiamo usare questa rappresentazione per costruire p n che interpola idati precedenti cui si aggiunge la coppia (x n , y n ).Il coefficiente c j del polinomio interpolatore <strong>di</strong> Newton si chiama <strong>di</strong>fferenza <strong>di</strong>visa <strong>di</strong> or<strong>di</strong>ne j e vienein<strong>di</strong>cata con f [x 0 , x 1 ,..., x j ].Perciò:f [x 0 ] = c 0 , f [x 0 , x 1 ] = c 1 , ..., f [x 0 , x 1 ,..., x n ] = c nLa notazione utilizzata ci permette <strong>di</strong> capire anche da quali coppie <strong>di</strong> punti <strong>di</strong>pende il coefficiente c j .Dati i punti x 0 , x 1 ,..., x n , per in<strong>di</strong>ci i e j arbitrari con 0 ≤ i ≤ j ≤ n, si haf [x i ] = f (x i )f [x i ,..., x j ] = f [x i+1,... x j ] − f [x i ,..., x j −1 ]x j − x iLa formula interpolatoria alle <strong>di</strong>fferenze <strong>di</strong>vise <strong>di</strong> Newton è dunque data dap n (x) = f [x 0 ] + f [x 0 , x 1 ](x − x 0 ) + f [x 0 , x 1 , x 2 ](x − x 0 )(x − x 1 ) + ...+ f [x 0 , x 1 ,..., x n ](x − x 0 )(x − x 1 )···(x − x n−1 )Da un punto <strong>di</strong> vista computazionale i coefficienti si ricavano me<strong>di</strong>ante la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise,tenendo presente che per calcolare f [x 0 , x 1 ,..., x n ] dobbiamo aver calcolato tutte le <strong>di</strong>fferenze <strong>di</strong>visef [x j −k ,..., x j ], con 0 ≤ k ≤ j ≤ n.69


5. INTERPOLAZIONEx i f [·] f [·,·] f [·,·,·] f [·,·,·,·] f [·,·,·,·,·]x 0 f (x 0 )f [x 0 , x 1 ]x 1 f (x 1 ) f [x 0 , x 1 , x 2 ]f [x 1 , x 2 ] f [x 0 , x 1 , x 2 , x 3 ]x 2 f (x 2 ) f [x 1 , x 2 , x 3 ] f [x 0 , x 1 , x 2 , x 3 , x 4 ]f [x 2 , x 3 ] f [x 1 , x 2 , x 3 , x 4 ]x 3 f (x 3 ) f [x 2 , x 3 , x 4 ]x 4 f (x 4 )..f [x 3 , x 4 ]..I coefficienti della <strong>di</strong>agonale principale sono i coefficienti c j del polinomio interpolatore <strong>di</strong> Newton...Esempio 5.3.5 Costruiamo la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise per i dati (1,1), (2,3) e (4,3).x i f [·] f [·,·] f [·,·,·]1 122 3 − 2 304 3Il polinomio p 2 (x) si scrive: p 2 (x) = 1 + 2(x − 1) − 2 (x − 1)(x − 2).3Se vogliamo aggiungere altri dati, per esempio, la coppia (5,4), dobbiamo aggiungere una riga alla tabelladella <strong>di</strong>fferenza <strong>di</strong>visa e un termine al polinomio che abbiamo già ricavato per ottenere quello <strong>di</strong> gradosuperiore interpolante tutti i dati che abbiamo a <strong>di</strong>sposizione.x i f [·] f [·,·] f [·,·,·] f [·,·,·,·]1 122 3 − 2 3014 3315 414Il polinomio p 3 (x) è p 3 (x) = p 2 (x) + 1 (x − 1)(x − 2)(x − 4).4Il concetto <strong>di</strong> <strong>di</strong>fferenza <strong>di</strong>visa può essere visto come un’estensione del concetto <strong>di</strong> derivata <strong>di</strong> unafunzione.Si ha, infatti, che, per f derivabile, la <strong>di</strong>ffenza <strong>di</strong>visa del primo or<strong>di</strong>ne f [x 0 , x 1 ] può essere vista come unrapporto incrementale e quin<strong>di</strong>, al limite per x 1 → x 0 , si ha f ′ (x 0 ).70


5.4. Considerazioni sull’interpolazione polinomialeLa <strong>di</strong>fferenza <strong>di</strong>visa k-sima e la derivata k-sima <strong>di</strong> f sono legate tra loro. Si può provare, infatti, per k ≥ 1che vale la relazionef [x 0 , x 1 ,..., x k ] = f (k) (ξ)k!dove ξ è un punto appartente all’interno dell’intervallo in<strong>di</strong>viduato dagli estremi <strong>di</strong> x 0 ,..., x k . Quando i punticoincidono, si haf [ x 0,x 0 ,...,x 0} {{ }] = f (k) (x 0 )k!k+1 volteQuesta formula serve per calcolare il polinomio <strong>di</strong> interpolazione che interpola non solo una certa funzionef ma anche le sue derivate in alcuni punti assegnati (si veda l’esercizio 5.5.3 a fine Capitolo).Se al polinomio p n (x) aggiungiamo la coppia <strong>di</strong> dati (x, f (x)) si ha p n+1 (x) = f (x) = p n (x) +f [x 0 , x 1 ,..., x n , x](x − x 0 )(x − x 1 ) · ...(x − x n ). L’ultima <strong>di</strong>fferenza <strong>di</strong>visa non si può calcolare, poichè <strong>di</strong>pendeda x (che è la nostra variabile), ma ci è utile per capire quanto vale l’errore che commettiamo nell’approssimaref (x) me<strong>di</strong>ante il polinomio interpolatore, applicando la rappresentazione <strong>di</strong> Newton. Inoltre, dato cheil polinomio interpolatore è unico (fissate le coppie <strong>di</strong> dati del problema), anche l’errore che si commette è lostesso, qualunque sia la strategia utilizzata per arrivare ad esso. Quin<strong>di</strong> possiamo eguagliare l’errore trovatoutilizzando i polinomi <strong>di</strong> Lagrange con l’errore trovato nella rappresentazione <strong>di</strong> Newton, ottenendo:f (n+1) (ξ(x)) n∏n∏(x − x i ) = f [x 0 , x 1 ,..., x n , x] (x − x i )(n + 1)!i=0i=0Derivatak-sima dellafFormuladell’errore5.4 Considerazioni sull’interpolazione polinomiale5.4.1 Fenomeno <strong>di</strong> RungeData una funzione f , si pensa che il polinomio <strong>di</strong> interpolazione possa approssimare bene la funzione,soprattutto se si aumenta il numero dei punti <strong>di</strong> appoggio. In realtà questo non è sempre vero e un semplicee famoso esempio ce lo fa capire. Sia data la funzione <strong>di</strong> Runge 8 1f (x) = e consideriamo il polino- Fenomeno <strong>di</strong>1 + x2 Rungemio <strong>di</strong> interpolazione <strong>di</strong> questa funzione per valori crescenti <strong>di</strong> n prendendo punti <strong>di</strong> appoggio equi<strong>di</strong>stantinell’intervallo [−5,5]. Partiamo da n + 1 = 2 con i punti equi<strong>di</strong>stanti x 0 = −5, x 1 = 0 e x 2 = 5. Si ha la tabellax i −5 0 5y i = f (x i ) 3.846154e − 2 1. 3.846154e − 2Costruiamo quin<strong>di</strong> il polinomio <strong>di</strong> interpolazione p 2 (x) (utilizzando l’approccio <strong>di</strong> Lagrange o <strong>di</strong> Newton, irisultati non cambiano). Raddoppiamo il numero dei punti aggiungendo un punto tra x 0 e x 1 e uno tra x 1 ex 2 . Abbiamo n + 1 = 5 e i valori della tabellax i −5 −2.5 0 2.5 5y i = f (x i ) 3.846154e − 2 1.379310e − 1 1. 1.379310e − 1 3.846154e − 2Con lo stesso proce<strong>di</strong>mento, costruiamo i polinomi <strong>di</strong> interpolazione <strong>di</strong> grado 8 e 16. In Figura 5.4 sono riportatii grafici della funzione <strong>di</strong> Runge (in nero) e dei polinomi interpolanti <strong>di</strong> grado 2, 4 e 8. Si può osservareche solo in un sottointervallo <strong>di</strong> [−5,5] al crescere <strong>di</strong> n, i polinomi convergono alla funzione. Agli estremidell’intervallo [−5,5] si hanno oscillazioni che aumentano sempre più al crescere <strong>di</strong> n. Infatti in Figura 5.5(a sinistra) non si riesce più a <strong>di</strong>stinguere il profilo della funzione <strong>di</strong> Runge perchè il polinomio <strong>di</strong> interpolazione<strong>di</strong> grado 16 ha delle oscillazioni molto alte. Tuttavia, se restringiamo questo grafico in un intornodell’origine, possiamo vedere come il polinomio p 16 si avvicini bene alla funzione – si veda la Figura 5.5 (adestra)! L’esempio <strong>di</strong> Runge è utile per capire che la scelta dei no<strong>di</strong> equi<strong>di</strong>stanti non si rivela sempre la sceltagiusta e che altri tipi <strong>di</strong> interpolazione possono dare risultati migliori. Per indagare ulteriormente su questoproblema, si rimanda alla letteratura specializzata del settore.8 Carl Runge (1856-1927) fu un matematico tedesco. Fu studente <strong>di</strong> Weierstrass, Kirchhoff, Helmholtz. Iniziò poi a collaborare conKronecker e poi si de<strong>di</strong>cò in particolare allo stu<strong>di</strong>o della soluzione numerica <strong>di</strong> equazioni algebriche e alla spettroscopia.71


5. INTERPOLAZIONEFigura 5.4: Funzione <strong>di</strong> Runge e polinomi interpolanti <strong>di</strong> grado 2, 4 e 8.Figura 5.5: Funzione <strong>di</strong> Runge e polinomio interpolante <strong>di</strong> grado 16 su tutto l’intervallo [−5,5] (a sinistra) e inun sottointervallo (a destra)5.4.2 Malcon<strong>di</strong>zionamento nell’interpolazione con funzioni base monomialiAll’inizio <strong>di</strong> questo Capitolo, abbiamo introdotto il polinomio <strong>di</strong> interpolazione me<strong>di</strong>ante funzioni basemonomiali: il problema dell’interpolazione veniva risolto me<strong>di</strong>ante un sistema lineare la cui matrice, <strong>di</strong>Vandermonde, è malcon<strong>di</strong>zionata.Ve<strong>di</strong>amo <strong>di</strong> capire questo malcon<strong>di</strong>zionamento me<strong>di</strong>ante un esempio. Si voglia stu<strong>di</strong>are l’interpolazionedei seguenti datix i 1010.5 1011.5 1012.5 1013 1014 1015y i 4 2.5 2.5 2 2 0Confrontando i vari algoritmi <strong>di</strong> interpolazione, osserveremo che gli algoritmi <strong>di</strong> Lagrange e delle <strong>di</strong>fferenze<strong>di</strong>vise <strong>di</strong> Newton danno buoni risultati. Al contrario, il metodo che porta alla costruzione della matrice<strong>di</strong> Vandermonde porta a risultati <strong>di</strong>sastrosi, come si può vedere in Figura 5.6. Eppure, dal punto <strong>di</strong> vistateorico i risultati dovrebbero essere identici.72


5.5. <strong>Esercizi</strong>Figura 5.6: Effetti del malcon<strong>di</strong>zionamentoPerchè si hanno questi risultati? Bisogna tener conto <strong>di</strong> tre aspetti: il calcolo della matrice del sistema V ;la soluzione del sistema lineare V c = y; il calcolo dei valori del polinomio.La matrice <strong>di</strong> Vandermonde consiste <strong>di</strong> colonne che crescono <strong>di</strong> colonna in colonna - 1, x i , x 2 i , x3 i , ...,x 5 i . Per questo caso test, si va da 1 a elementi dell’or<strong>di</strong>ne <strong>di</strong> 1015 . La matrice è molto mal con<strong>di</strong>zionata.Perciò la soluzione del sistema lineare non può dare risultati affidabili e il vettore che fornisce i coefficienti delpolinomio interpolatore è completamente errato. Ciò porta anche al fenomeno della cancellazione numericanel calcolo del polinomio <strong>di</strong> interpolazione, per cui si ha una significativa per<strong>di</strong>ta <strong>di</strong> accuratezza e il graficorisultante presenta un profilo altamente oscillante.5.5 <strong>Esercizi</strong><strong>Esercizi</strong>o 5.5.1 Sia data la tabella seguente:x i -1 0 2 3 4f (x i ) 9 0 0 15 84(a) Scrivere la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise.(b) Trovare il polinomio interpolatore (con la formula <strong>di</strong> Newton) <strong>di</strong> grado non superiore a 4.Svolgimento(a) La tabella delle <strong>di</strong>fferenza <strong>di</strong>vise è:(b) Il polinomio <strong>di</strong> Newton <strong>di</strong> grado 4 che interpola i dati assegnati è dunque (prendendo i valori della<strong>di</strong>agonale principale della tabella)p(x) = 9 − 9(x + 1) + 3(x + 1)x + 0.5(x + 1)x(x − 2) + (x + 1)x(x − 2)(x − 3) == x 4 − 3.5x 3 + 3.5x 2 − x73


5. INTERPOLAZIONEx i f (x i ) f (·,·) f (·,·,·) f (·,·,·,·) f (·,·,·,·,·)-1 90 00 − 90 − (−1) = −92 03 154 840 − 02 − 0 = 0 0 + 92 − (−1) = 315 − 03 − 2 = 15 15 − 03 − 0 = 5 5 − 33 − (−1) = 0.584 − 154 − 3 = 69 69 − 154 − 2 = 27 27 − 54 − 0 = 11 211/2 − 1/2= 14 − (−1)<strong>Esercizi</strong>o 5.5.2 Sia data la tabella seguente:x i 0 0.1 0.8 1.2f (x i ) 1 0.48 1.32 5.32(a) Scrivere la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise.(b) Usando i quattro punti in successione, scrivere i polinomi interpolanti (<strong>di</strong> Newton) p n (x) <strong>di</strong> gradonon superiore ad n (con n=0,1,2,3); commentare il risultato.(c) Usando p n (x) stimare, per ogni n, f (0.6) e f ′ (0.6).(d) scrivere il polinomio p 2 (x) con la formula <strong>di</strong> Lagrange.Svolgimento(a) La tabella delle <strong>di</strong>fferenza <strong>di</strong>vise è:x i f (x i ) f (·,·) f (·,·,·) f (·,·,·,·)0 10.1 0.480.48 − 1= −5.20.10.8 1.321.32 − 0.48= 1.20.71.2 + 5.2= 80.81.2 5.325.32 − 1.32= 100.410 − 1.2= 81.18 − 81.2 = 0(b) I polinomi <strong>di</strong> Newton <strong>di</strong> grado 0,1,2 e 3 sono:p 0 (x) = 1p 1 (x) = 1 − 5.2xp 2 (x) = 1 − 5.2x + 8x(x − 0.1) = 8x 2 − 6x + 1p 3 (x) = 1 − 5.2x + 8x(x − 0.1) + 0x(x − 0.1)(x − 0.8) = 1 − 5.2x + 8x(x − 0.1) = p 2 (x)74


5.5. <strong>Esercizi</strong>Il polinomio p 3 (x) coincide con p 2 (x) in quanto p 2 (x 3 ) = p 2 (1.2) = f (1.2) = f (x 3 ) cioè il polinomio<strong>di</strong> grado 2 interpola non solo i dati (x 0 , f (x 0 )), (x 1 , f (x 1 )) e (x 2 , f (x 2 )) ma anche (x 3 , f (x 3 )).(c) Per le derivate <strong>di</strong> p n (x), n = 0,1,2 si hap ′ 0 (x) = 0p 1 ′ (x) = −5.2p 2 ′ (x) = 16x − 6La stima <strong>di</strong> f (0.6) e f ′ (0.6) è:n p n (0.6) p n ′ (0.6)0 1 01 -2.12 -5.22 0.28 3.6(d) I polimoni <strong>di</strong> Lagrange per ricavare il polinomio p 2 sono dati considerando i valori x 0 , x 1 e x 2 :(x − 0.1)(x − 0.8)L 0 (x) =(−0.1)(−0.8)L 1 (x) =L 2 (x) =x(x − 0.8)0.1(0.1 − 0.8) = x2 − 0.8x−0.07x(x − 0.1)0.8(0.8 − 0.1) = x2 − 0.1x0.56= x2 − 0.9x + 0.080.08Il polinomio è:p 2 (x) = 1L 0 (x) + 0.48L 1 (x) + 1.32L 2 (x)= x2 − 0.9x + 0.08− 0.48 x2 − 0.8x+ 1.32 x2 − 0.1x0.080.070.56= 12.5(x 2 − 0.9x + 0.08) − 6.857142857(x 2 − 0.8x) + 2.357142857(x 2 − 0.1x)e raccogliendo i terminip 2 (x) = 8x 2 − 6x + 1<strong>Esercizi</strong>o 5.5.3 Trovare il polinomio <strong>di</strong> grado non superiore a 4 che interpola i dati seguenti: f (0) =2, f ′ (0) = 7, f ′′ (0) = 18, f (1) = 27 f ′ (1) = 60. Stimare f (0.2) e f ′ (0.2).SvolgimentoCostruiamo la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise tenendo presente che le derivate <strong>di</strong> una funzione f si possonoavere come limite delle <strong>di</strong>fferenze <strong>di</strong>vise:f [0,0] = f ′ (0) = 7 f [0,0,0] = f ′′ (0)2!Si ottiene, dunque,= 9 f [1,1] = f ′ (1) = 6075


5. INTERPOLAZIONE0 270 2 97 90 2 18 825 171 27 35601 27Il polinomio è dunque p(x) = 2 + 7x + 9x 2 + 9x 3 + 8x 3 (x − 1), vale a <strong>di</strong>rep(x) = 8x 4 + x 3 + 9x 2 + 7x + 2.La stima <strong>di</strong> f (0.2) è data da: f (0.2) ≈ p(0.2) = 3.7808.Per stimare f ′ (0.2) dobbiamo prima calcolare la derivata prima <strong>di</strong> p. Si hap ′ (x) = 32x 3 + 3x 2 + 18x + 7,da cui f ′ (0.2) ≈ p ′ (0.2) = 12.056.76


C A P I T O L O6APPROSSIMAZIONEI numeri governano il mondo.Platone6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776.2 Retta <strong>di</strong> regressione lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786.3 Approssimazione polinomiale ai minimi quadrati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806.4 Approssimazioni <strong>di</strong> tipo esponenziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816.5 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826.1 IntroduzioneLa legge <strong>di</strong> Hooke stabilisce che l’allungamento subito da una molla, costruita con materiale uniforme,è <strong>di</strong>rettamente proporzionale alla forza applicata: F (x) = kx dove k è la costante <strong>di</strong> proporzionalità, dettacostante elastica, e x rappresenta l’allungamento della molla.Supponiamo <strong>di</strong> voler determinare k per una molla che, quando è a riposo, esercita una forza <strong>di</strong>1,4724811N . Se applichiamo una forza pari a 2.418165N si misura un allungamento pari a 0.042m. Sianoeffettuate <strong>di</strong>verse misure, ricavando i dati <strong>di</strong> Tabella 6.1. I dati raccolti non giacciono esattamente su unax 0.00000 0.04200 0.08000 0.11800 0.15600F 1.472481 2.418165 3.363849 4.309533 5.255217Tabella 6.1: Dati sperimentali per la legge <strong>di</strong> Hookelinea retta. Per approssimare la costante elastica k, potremmo prendere una qualunque coppia <strong>di</strong> dati e fareil rapporto tra la forza e l’allungamento. In questo modo, tuttavia, non terremmo conto <strong>di</strong> tutte le misureeffettuate. È più ragionevole trovare la linea retta che meglio approssima tutti i dati sperimentali e utilizzarlaper approssimare il valore <strong>di</strong> k. Questo tipo <strong>di</strong> approssimazione sarà l’argomento <strong>di</strong> questo Capitolo.A <strong>di</strong>fferenza dell’interpolazione, in cui si cerca una funzione che passi esattamente per i dati assegnati,nell’approssimazione si cerca una funzione (più semplice <strong>di</strong> quella data, se vi è una funzione <strong>di</strong> partenza) cheapprossimi al meglio i dati assegnati, senza passare esattamente per questi.Alcuni dei motivi che spingono a cercare una funzione <strong>di</strong> approssimazione piuttosto che <strong>di</strong> interpolazionesono questi:77


6. APPROSSIMAZIONEFigura 6.1: Legge <strong>di</strong> Hooke: i dati sperimentalix i 1 2 3 4 5 6 7 8 9 10y i 1.2 2.3 4.5 5.1 7 8.5 10.2 13.1 12.5 16.5Tabella 6.2: Dati sperimentaliG i dati a <strong>di</strong>sposizione sono affetti da errore;G siamo interessati a vedere l’andamento dei dati su lunga scala, in una visione globale 1G vogliamo che la funzione <strong>di</strong>penda da pochi parametri, sebbene questi siano determinati considerandotutti i dati a <strong>di</strong>sposizione.Nel seguito stu<strong>di</strong>eremo l’approssimazione ai minimi quadrati.6.2 Retta <strong>di</strong> regressione lineareSupponiamo <strong>di</strong> avere i 10 dati sperimentali della Tabella 6.2 (quin<strong>di</strong> n + 1 = 10). La Figura 6.2 (a sinistra)mostra il grafico delle coppie <strong>di</strong> punti: appare evidente che la relazione tra x e y è <strong>di</strong> tipo lineare. Il motivoper cui i dati non sono esattamente su una retta è dovuto ad errori nei dati. Non ha senso, quin<strong>di</strong>, cercare unafunzione che passi esattamente per i dati assegnati (come accade nell’interpolazione), perchè una funzionedel genere introdurrebbe oscillazioni prive <strong>di</strong> significato fisico: lo ve<strong>di</strong>amo andando a costruire il polinomio<strong>di</strong> interpolazione <strong>di</strong> grado 9 che passa esattamente per i dati e che ve<strong>di</strong>amo in Figura 6.2 (a destra). Cerchiamoallora una retta (funzione lineare, poichè abbiamo visto che i dati hanno una relazione <strong>di</strong> tipo lineare) chemeglio approssima i dati senza dover coincidere con essi. Sia p 1 (x) = a 0 + a 1 x la retta che an<strong>di</strong>amo cercando(dobbiamo quin<strong>di</strong> capire come trovare i due coefficienti a 0 e a 1 ). Allora p 1 (x i ) = a 0 + a 1 x i , per i = 0,1,...,nrappresenta il valore sulla retta che deve approssimare il valore y i dato dal problema. Per ogni dato sperimentale,per i = 0,1,...,n, possiamo misurare lo scarto che scaturisce dall’approssimare y i me<strong>di</strong>ante a 0 + a 1 x i .Nell’approccio ai minimi quadrati, si cerca <strong>di</strong> minimizzare la somma dei quadrati delle <strong>di</strong>fferenze tra i valoridati y i e i valori corrispondenti p 1 (x i ) sulla retta; si cerca, cioè, <strong>di</strong> minimizzare la somma dei quadrati <strong>degli</strong>1 Se si hanno a <strong>di</strong>sposizione n = 100 dati, anche molto accurati, una funzione interpolante può dare una buona idea localmente,mentre una funzione approssimante data da una retta fornisce una migliore idea del comportamento su lunga scala dei dati.78


6.2. Retta <strong>di</strong> regressione lineareFigura 6.2: Dati sperimentali (a sinistra) della Tabella 6.2 e polinomio <strong>di</strong> interpolazione (a destra).scarti. Introduciamo, quin<strong>di</strong> la funzione che <strong>di</strong>pende dai coefficienti incogniti a 0 e a 1 .S(a 0 , a 1 ) =n∑ [ ] 2(a0 + a 1 x i ) − y ii=0Per minimizzare questa funzione, occorre porre le derivate parziali della S rispetto ad a 0 e a 1 uguali a zero. 2Si pone dunque0 = ∂S(a 0, a 1 )∂a 0= ∂∂a 00 = ∂S(a 0, a 1 )∂a 1= ∂∂a 1n∑ [ ] 2n∑ [ ](a0 + a 1 x i ) − y i = 2 (a0 + a 1 x i ) − y ii=0i=0n∑ [ ] 2n∑ [ ](a0 + a 1 x i ) − y i = 2 (a0 + a 1 x i ) − y i xii=0Queste equazioni si semplificano nel sistema delle cosiddette equazioni normali:{(n + 1)a0 + a 1∑ ni=0 x i = ∑ ni=0 y ia 0∑ ni=0 x i + a 1∑ ni=0 x2 i = ∑ ni=0 x i y ii=0Introducendo la notazione A 12 = ∑ ni=0 x i , A 22 = ∑ ni=0 x2 i , b 1 = ∑ ni=0 y i e b 2 = ∑ ni=0 x i y i e osservando che lamatrice del sistema è simmetrica (A 12 = A 21 ), la soluzione è data da:a 0 = A 22b 1 − A 12 b 2(n + 1)A 22 − A 2 12a 1 = (n + 1)b 2 − A 12 b 1(n + 1)A 22 − A 2 12Nell’esempio proposto, per calcolare la retta <strong>di</strong> approssimazione ai minimi quadrati, dobbiamo calcolarei coefficienti delle equazioni normali. In Tabella 6.2 poniamo i valori che servono per risolvere il sistema: lasoluzione è a 0 = −0.87333333 e a 1 = 1.62969697. La retta è rappresentata in Figura 6.3.La retta che abbiamo appena costruito è la retta che minimizza gli scarti verticali, supponendo affettida errore le or<strong>di</strong>nate delle coppie <strong>di</strong> punti a <strong>di</strong>sposizione. Essa prende pure il nome <strong>di</strong> retta <strong>di</strong> regressionelineare sugli scarti verticali.Osserviamo che il baricentro dei punti assegnati giace sulla retta ai minimi quadrati, in quanto considerandola prima equazione del sistema si ha, per X = ∑ ni=0 x i /(n + 1) e Y = ∑ ni=0 y i /(n + 1) (le coor<strong>di</strong>nate delbaricentro dei punti assegnati):Sulbaricentroa 0 + a 1 X = Y2 Per funzioni f (x) <strong>di</strong> una variabile reale, i punti <strong>di</strong> massimo o minimo si trovano tra i punti critici della f , per i quali f ′ (x) = 0,stu<strong>di</strong>ando il segno della f ′′ . Analogo proce<strong>di</strong>mento si segue per funzioni <strong>di</strong> due variabili. Per la funzione S(a 0 , a 1 ) che stiamo stu<strong>di</strong>ando,si può provare che i valori (a 0 , a 1 ) che annullano le derivate parziali della S rappresentano i valori che minimizzano la S stessa. Questoargomento viene approfon<strong>di</strong>to nei corsi <strong>di</strong> Analisi Matematica.79


6. APPROSSIMAZIONEx i y i x 2 xi i y i1 1.2 1 1.22 2.3 4 4.63 4.5 9 13.54 5.1 16 20.45 7 25 356 8.5 36 517 10.2 49 71.48 13.1 64 104.89 12.5 81 112.510 16.5 100 165A 12 = 55 b 1 = 80.9 A 22 = 385 b 2 = 579.4Tabella 6.3: Tabella per il calcolo della retta <strong>di</strong> approssimazione ai minimi quadratiFigura 6.3: Retta <strong>di</strong> approssimazione sugli scarti verticali.Se invece sono affetti da errore le ascisse delle coppie <strong>di</strong> punti, si può cercare la retta che minimizza gliscarti orizzontali, detta anche retta <strong>di</strong> regressione lineare sugli scarti orizzontali, (basta scambiare il ruolodelle x con quello delle y per ricavare, con lo stesso proce<strong>di</strong>mento, la retta p 1 (y) = b 0 + b 1 y). Il baricentro deipunti assegnati giace anche su questa retta, da cui possiamo concludere che esso è il punto <strong>di</strong> intersezionedelle due rette che minimizzano gli scarti verticali e orizzontali.6.3 Approssimazione polinomiale ai minimi quadratiIn generale, avendo a <strong>di</strong>sposizione n+1 coppie <strong>di</strong> punti, il problema <strong>di</strong> approssimazione si può ricondurrealla ricerca <strong>di</strong> un polinomio <strong>di</strong> approssimazione <strong>di</strong> grado m, p m (x) = a 0 + a 1 x + a 2 x 2 + ...+ a m x m con m < n.Quando n = m il polinomio d’approssimazione coincide con quello d’interpolazione.La funzione da minimizzare è80S(a 0 , a 1 ,..., a m ) =n∑ [(a0 + a 1 x i + a 2 x 2 i + ... + a m x m ] 2i) − y ii=0


6.4. Approssimazioni <strong>di</strong> tipo esponenzialeLa procedura seguita per la retta viene generalizzata. Questa volta bisogna porre uguali a zero le m+1 derivateparziali della S rispetto ai coefficienti del polinomio p m .∂S∂a j= 0j = 0,1,...,mRicaviamo, quin<strong>di</strong>n∑2 (a 0 + a 1 x i + ... + a m x m i− y i )x j ii=0= 0 per j = 0,1,...,mIn forma estesa possiamo scriveren∑n∑x j i + a 1a 0i=0x j +1i=0i+ ... + a mn∑x j +m =ii=0i=0n∑x j i y iper j = 0,1,...,mPoichè queste equazioni si hanno per j = 0,1...,m, si ha da risolvere un sistema, che, scritto in formamatriciale, è:A T Aa = A T bdove A è una matrice rettangolare (n + 1) × (m + 1), data da⎛1 x 0 x0 2 ... x m ⎞01 x 1 x1 2 ... x m 1A =⎜⎝...⎟. ⎠1 x n xn 2 ... xnmLe equazioni del sistema sono dette equazioni normali. Si può provare che la matrice Q = A T A èsimmetrica, definita positiva 3 ed è non singolare, quin<strong>di</strong> il sistema ammette soluzione.6.4 Approssimazioni <strong>di</strong> tipo esponenzialePuò capitare che i dati sperimentali abbiano un andamento <strong>di</strong> tipo esponenziale o ricor<strong>di</strong>no una funzionepotenza della variabile x. Allora si può richiedere che la funzione approssimante abbia una delle due formeseguenti (e, a seconda della rappresentazione, si ha un <strong>di</strong>verso modello):y(x) = ae bxy(x) = ax bmodello esponenzialemodello potenzacon a e b opportune costanti. Per ricavare a e b si passa ai logaritmi ricavando l’equazione <strong>di</strong> una retta i cuicoefficienti sono ottenuti con la procedura <strong>di</strong> minimizzazione ai minimi quadrati. Da questi, si ritorna poi aicoefficienti delle funzioni <strong>di</strong> partenza. Ve<strong>di</strong>amo come.G Nel caso del modello esponenziale, passando ai logaritmi (in base naturale) si ha:ln(y) = ln(a) + bxPonendo X = x, Y = ln(y), a 0 = ln(a) e a 1 = b, si ha un’equazione del tipo Y = a 0 + a 1 X .Quin<strong>di</strong>, dalle coppie <strong>di</strong> dati (x i , y i ) i = 0,1,...,n, si deve passare alle coppie (X i = x i , Y i = ln(y i ))e su queste coppie si costruisce la retta <strong>di</strong> approssimazione ai minimi quadrati con la procedura cheabbiamo stu<strong>di</strong>ato in Sezione 6.2. Una volta ricavati i coefficienti a 0 e a 1 , si ha a = e a 0e b = a 1 .3 Le definizioni <strong>di</strong> matrice simmetrica e matrice definita positiva sono date nel Capitolo 7.81


6. APPROSSIMAZIONEG Nel caso del modello potenza, passando ai logaritmi (qualunque sia la base usata, il risultato noncambia) si ha:log(y) = log(a) + b log(x)Ponendo X = log(x), Y = log(y), a 0 = log(a) e a 1 = b, si ha un’equazione del tipo Y = a 0 + a 1 X .Quin<strong>di</strong>, dalle coppie <strong>di</strong> dati (x i , y i ) i = 0,1,...,n, si deve passare alle coppie (X i = log(x i ), Y i =log(y i )) e su queste coppie si costruisce la retta <strong>di</strong> approssimazione ai minimi quadrati. Una voltaricavati i coefficienti a 0 e a 1 , si ha b = a 1 mentre, con gli opportuni passaggi, si trova il valore <strong>di</strong> a.6.5 <strong>Esercizi</strong><strong>Esercizi</strong>o 6.5.1 Sia data la tabella seguente:x i -1 0 2 3 4f (x i ) 9 0 0 15 84(a) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati <strong>degli</strong> scarti verticali.(b) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati <strong>degli</strong> scarti orizzontali.(c) Calcolare il punto <strong>di</strong> intersezione delle due rette e <strong>di</strong>re <strong>di</strong> che punto si tratta.Svolgimento(a) Il sistema da risolvere per ottenere la retta <strong>di</strong> approssimazione ai minimi quadrati è:{na0 + ∑ ni=1 x i a 1 = ∑ ni=1 y i∑ ni=1 x i a 0 + ∑ ni=1 x2 i a 1 = ∑ ni=1 x i y idove n = 5. Poichè ∑ ni=1 x i = 8, ∑ 5i=1 x2 i = 30, ∑ 5i=1 y i = 108 e ∑ 5i=1 x i y i = 372, si ha il sistema{5a0 + 8a 1 = 1088a 0 + 30a 1 = 372La soluzione è a 0 = 3.069767442, a 1 = 11.581395349. La retta ai minimi quadrati che minimizza gliscarti verticali è: y = 3.069767442 + 11.581395349x.(b) Ricaviamo la retta <strong>di</strong> approssimazione che minimizza gli scarti orizzontali.{nb0 + ∑ ni=1 y i b 1 = ∑ ni=1 x i∑ ni=1 y i b 0 + ∑ ni=1 y 2 i b 1 = ∑ ni=1 y i x idove n = 5. Poichè ∑ ni=1 y i = 108, ∑ 5i=1 y 2 i = 7362, ∑ 5i=1 x i = 8 e ∑ 5i=1 x i y i = 372, si ha il sistema{5b0 + 108b 1 = 8108b 0 + 7362b 1 = 372La soluzione è b 0 = 0.744452398, b 1 = 0.03960868528. La retta ai minimi quadrati che minimizza gliscarti orizzontali è: x = 0.744452398 + 0.03960868528y.82


6.5. <strong>Esercizi</strong>(c) Troviamo il punto <strong>di</strong> intersezione delle due rette:{y = 3.069767442 + 11.581395349xx = 0.744452398 + 0.03960868528yRicaviamo x = 1.6 e y = 21.6Se calcoliamo il baricentro dei punti assegnati, troviamo∑ 5i=1X =x i= −1 + 2 + 3 + 4∑ 5i=1= 1.6 Y =y i 9 + 15 + 84= ) = 21.65555Il punto <strong>di</strong> intersezione delle due rette è il baricentro dei punti assegnati.<strong>Esercizi</strong>o 6.5.2 Sono assegnati i seguenti dati sperimentalix i 4.0 4.2 4.5 4.7 5.1 5.5 5.9 6.3 6.8 7.1y i 102.56 113.18 131.2 142 168 196.2 225 256.8 299.51 325.6Costruire la curva <strong>di</strong> approssimazione ai minimi quadrati della forma ax b .Svolgimento Per trovare la curva <strong>di</strong> approssimazione del tipo y = ax b , dobbiamo prima passare ai logaritmi:log(y) = log(ax b ) = log(a) + b log(x)In questo modo ci riconduciamo ad una retta <strong>di</strong> approssimazione ai minimi quadrati sui logaritmi dei puntiassegnati. Consideriamo il logaritmo naturale (ma i risultati non cambiano con i logaritmi in un’altra base).I dati su cui lavorare sono dunque:log(x i ) log(y i )1.386294361 4.6304479931.435084525 4.7289794721.504077397 4.8767228761.547562509 4.9558270583.931825633 5.1239639801.704748092 5.2791345471.774952351 5.4161004021.840549633 5.5482975721.916922612 5.7021478061.960094784 5.785669634Calcoliamo la retta <strong>di</strong> approssimazione ai minimi quadrati, ponendo X i = log(x i ) e Y i = log(y i ). Il sistemada risolvere è{na0 + ∑ ni=1 X i a 1 = ∑ ni=1 Y i∑ ni=1 X i a 0 + ∑ ni=1 X 2 i a 1 = ∑ ni=1 X i Y idove n = 10.Si ha ∑ ni=1 X i = 16.6995268, ∑ ni=1 X 2 = 28.2537116, ∑ ni i=1 Y i = 52.0472913, ∑ ni=1 X i Y i = 87.6541085Il sistema da risolvere <strong>di</strong>venta{10a0 + 16.6995268a 1 = 52.047291316.6995268a 0 + 28.2537116a 1 = 87.6541085che ha come soluzione a 0 = 1.84197978 e a 1 = 2.013679425.Ora a 0 = log(a) da cui a = e a 0= 6.30901637 Invece a 1 = b. Il modello y = ax b <strong>di</strong>venta quin<strong>di</strong> y =6.30901637x 2.013679425 .83


C A P I T O L O7METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARIAll’inizio e alla fine abbiamo ilmistero. Potremmo <strong>di</strong>re cheabbiamo il <strong>di</strong>segno <strong>di</strong> Dio. A questomistero la matematica si avvicina,senza penetrarlo.Ennio De Giorgi7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857.2 Elementi <strong>di</strong> Algebra Lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867.3 Metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.3.1 Sostituzione all’in<strong>di</strong>etro e in avanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.3.2 Eliminazione <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917.4 Strategie <strong>di</strong> pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937.5 Fattorizzazione triangolare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947.5.1 Fattorizzazione LDU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957.5.2 Fattorizzazione <strong>di</strong> Gauss senza pivoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977.5.3 Fattorizzazione <strong>di</strong> Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997.6 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007.1 IntroduzioneSi consideri la capacità C <strong>di</strong> un conduttore. Dall’elettrostatica, sappiamo che vale q = Cφ dove q rappresentala carica del conduttore e φ il suo potenziale elettrostatico, quando il conduttore è isolato. Nel caso incui il conduttore non sia isolato, la situazione cambia. Supponiamo <strong>di</strong> avere 4 conduttori in equilibrio elettrostaticoall’interno <strong>di</strong> una cavità collegata a terra (a terra il potenziale elettrostatico vale zero). Supponendo<strong>di</strong> collegare i conduttori 2, 3 e 4 a terra, si ha φ 2 = φ 3 = φ 4 = 0 e φ 1 ≠ 0. Il conduttore 1 induce carica sugli altriconduttori, per cui, per ciascun conduttore vale, rispettivamente:85


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARIq 1 = C 11 φ 1q 2 = C 21 φ 1q 3 = C 31 φ 1q 4 = C 41 φ 1Si ripete lo stesso <strong>di</strong>scorso supponendo φ 2 ≠ 0 e tutti gli altri potenziali nulli. Poi sia φ 3 ≠ 0 e gli altri potenzialinulli. Infine φ 4 ≠ 0 e tutti gli altri nulli.La sovrapposizione dei 4 stati considerati corrisponde alla situazione in cui φ 1 ,φ 2 ,φ 3 ,φ 4 sono tutti <strong>di</strong>versida zero. Si ha perciò:q 1 = C 11 φ 1 +C 12 φ 2 +C 13 φ 3 +C 14 φ 4q 2 = C 21 φ 1 +C 22 φ 2 +C 23 φ 3 +C 24 φ 4q 3 = C 31 φ 1 +C 32 φ 2 +C 33 φ 3 +C 34 φ 4q 4 = C 41 φ 1 +C 42 φ 2 +C 43 φ 3 +C 44 φ 4I coefficienti C i i si chiamano coefficienti <strong>di</strong> capacità, mentre i coefficienti C i j , con j ≠ i si chiamanocoefficienti <strong>di</strong> induzione.Si può presentare il problema inverso: note le cariche q i , si vuole determinare il valore dei φ i . Si devequin<strong>di</strong> risolvere un sistema lineare <strong>di</strong> 4 equazioni in 4 incognite.In questo Capitolo stu<strong>di</strong>eremo meto<strong>di</strong> <strong>di</strong>retti per la soluzione <strong>di</strong> sistemi lineari del tipo⎧a 11 x 1 + a 12 x 2 + ... + a 1n x n = b 1a ⎪⎨ 21 x 1 + a 22 x 2 + ... + a 2n x n = b 2a 31 x 1 + a 32 x 2 + ... + a 3n x n = b 3(7.1). = . .⎪⎩a n1 x 1 + a n2 x 2 + ... + a nn x n = b ndove a i j , per i , j = 1,2,...,n e b i , per i = 1,2,...,n sono assegnati e le incognite da determinare sonox 1 , x 2 ,..., x n . I meto<strong>di</strong> <strong>di</strong>retti sono meto<strong>di</strong> che risolvono il problema in un numero fissato <strong>di</strong> passi,introducendo un errore dovuto solo all’arrotondamento.7.2 Elementi <strong>di</strong> Algebra LineareMatriceSia dato un sistema lineare come in (7.1). Per poterlo semplificare, possiamo eseguire le seguentioperazioni (trasformazioni elementari) :G L’i -sima equazione del sistema può essere moltiplicata per una qualunque costante λ ≠ 0 e l’equazionerisultante può essere usata al posto <strong>di</strong> quella <strong>di</strong> partenza: la soluzione del sistema non cambia.G L’equazione j -sima, moltiplicata per una qualunque costante λ ≠ 0 e sommata all’equazione i -sima,può essere usata al posto dell’equazione i -sima <strong>di</strong> partenza: la soluzione del sistema non cambia.G Le equazione i -sime e j -sime possono essere scambiate: la soluzione del sistema non cambia.In questa maniera, un sistema lineare può essere trasformato in uno <strong>di</strong> più facile soluzione, comevedremo nell’algoritmo <strong>di</strong> eliminazione <strong>di</strong> Gauss.Poichè le operazioni da fare coinvolgono i coefficienti a i j e b i , conviene scrivere il sistema <strong>di</strong> equazionilineari utilizzando una forma compatta me<strong>di</strong>ante matrici e vettori.Definizione 7.2.1 Una matrice n × m è una griglia rettangolare (o array) <strong>di</strong> elementi <strong>di</strong>sposti su n righe e mcolonne.86


7.2. Elementi <strong>di</strong> Algebra LineareGeneralmente, una matrice si denota con una lettera maiuscola, per esempio A, mentre i suoi valori siin<strong>di</strong>cano con la corrispondente lettera minuscola e i pe<strong>di</strong>ci che si riferiscono alla riga e colonna in cui si trovaquel valore, per esempio a i j si riferisce all’elemento <strong>di</strong> riga i e colonna j della matrice A.⎛⎞a 11 a 12 a 13 ... a 1nA = [ a 21 a 22 a 23 ... a 2n] a i j = a 31 a 32 a 33 ... a 3n⎜⎝... ...⎟. ⎠a n1 a n2 a n3 ... a nnEsempio 7.2.1( )2 10 5A =3 1 0è una matrice 2 × 3 con elementi a 11 = 2, a 12 = 10, a 13 = 5, a 21 = 3, a 22 = 1 e a 23 = 0.Per in<strong>di</strong>care che una matrice A ha n righe e m colonne, <strong>di</strong>remo che A ha <strong>di</strong>mensione n × m. Quandolavoreremo con matrici quadrate <strong>di</strong> n righe e n colonne, parleremo <strong>di</strong> <strong>di</strong>mensione n della matrice per in<strong>di</strong>careche il numero <strong>di</strong> righe è uguale al numero <strong>di</strong> colonne e vale n.I vettori si possono vedere come un caso particolare delle matrici. Si parla <strong>di</strong> vettore riga se ci riferiamo auna matrice 1 × n e si parla <strong>di</strong> vettore colonna se ci si riferisce a una matrice n × 1.Per in<strong>di</strong>care un vettore colonna e un vettore riga si usa, rispettivamente, la notazione⎛ ⎞x 1x 2x =x 3⎜⎝⎟. ⎠x nx = ( x 1 x 2 x 3 ... x n)VettoriVe<strong>di</strong>amo, nel seguito, alcune importanti definizioni e proprietà delle matrici.G Due matrici A e B, <strong>di</strong> <strong>di</strong>mensione n × m, sono uguali se hanno lo stesso numero <strong>di</strong> righe e <strong>di</strong> colonne,e, inoltre, vale, a i j = b i j per i ,= 1,2,...,n e j = 1,2,...,m.G Date due matrici A e B, entrambe n × m, si definisce la matrice somma <strong>di</strong> A e B la matrice n × m A + Bi cui elementi sono dati da a i j + b i j , per i ,= 1,2,...,n e j = 1,2,...,m.G Se A è una matrice n ×m e λ è un numero reale, la moltiplicazione scalare <strong>di</strong> λ per A, denotata con λA,è una matrice n × m i cui elementi sono λa i j per i ,= 1,2,...,n e j = 1,2,...,m.G In<strong>di</strong>chiamo con O la matrice i cui elementi sono tutti uguali a zero.G Data la matrice A, n × m, in<strong>di</strong>chiamo con −A la matrice i cui elementi sono −a i j .Teorema 7.2.1 Date A, B e C tre matrici n × m, e λ e µ due numeri reali, valgono le seguenti proprietà:G A + B = B + A G(A + B) +C = A + (B +C )G A +O = O + A = A G A + (−A) = −A + A = OGλ(A + B) = λA + λB G(λ + µ)A = λA + µAGλ(µA) = (λµ)A G1A = A87


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARIMatriceprodottoG Date due matrici A <strong>di</strong> <strong>di</strong>mensione n×m e B <strong>di</strong> <strong>di</strong>mensione m×p, la matrice prodotto <strong>di</strong> A e B, denotatacon C = AB, è una matrice i cui elementi c i j sono dati da:c i j =m∑a i k b k j = a i 1 b 1j + a i 2 b 2j + ... + a i m b m jk=1per i = 1,2,...,n e j = 1,2,..., p.ProdottomatricevettoreG Data una matrice A <strong>di</strong> <strong>di</strong>mensione n e un vettore colonna x <strong>di</strong> lunghezza n, si definisce il vettore y = Axprodotto della matrice A per il vettore x, il vettore le cui componenti sono date dan∑y i = a i j x j per i = 2,...,nj =1Dati due vettori x e y si definisce prodotto scalare x T y = ∑ nProdottoi=1 x i y i .scalare traG In generale, AB ≠ B A.vettoriMatrice<strong>di</strong>agonaleG Una matrice D si <strong>di</strong>ce <strong>di</strong>agonale se è quadrata con d i j = 0 per i ≠ j . Gli elementi <strong>di</strong>versi da zero sitrovano quin<strong>di</strong> sulla <strong>di</strong>agonale (detta <strong>di</strong>agonale principale) che si può tracciare partendo dall’elementoin alto a sinistra (<strong>di</strong> posto 11) e arrivando all’elemento in basso a destra (<strong>di</strong> posto nn).Esempio:⎛⎞1 0 0 0D = ⎜0 2 0 0⎟⎝0 0 5 0 ⎠0 0 0 −1MatriceIdentitàMatricetri<strong>di</strong>agonaleMatricetriangolaresuperioreMatricetriangolareinferioreG Si chiama matrice identità e si in<strong>di</strong>ca con I , una matrice <strong>di</strong>agonale i cui elementi <strong>di</strong>agonali valgono 1.Esempio:⎛⎞1 0 0 0I = ⎜0 1 0 0⎟⎝0 0 1 0⎠0 0 0 1G Una matrice si <strong>di</strong>ce tri<strong>di</strong>agonale se gli elementi non nulli si trovano sulla <strong>di</strong>agonale principale e suglielementi delle <strong>di</strong>agonali che si trovano sopra e sotto la <strong>di</strong>agonale principale.Esempio:⎛⎞−2 1 0 0 01 −2 1 0 0A =⎜ 0 1 −2 1 0⎟⎝ 0 0 1 −2 1 ⎠0 0 0 1 −2G Una matrice si <strong>di</strong>ce triangolare se ha tutti gli elementi nulli a parte quelli che si trovano sopra o sotto la<strong>di</strong>agonale principale.– Si definisce matrice triangolare superiore U (U sta per upper) <strong>di</strong> <strong>di</strong>mensione n, la matrice per laquale, per j = 1,2,...,n, si hau i j = 0 per i = j + 1, j + 2,...,n– Si definisce matrice triangolare inferiore L (L sta per lower) <strong>di</strong> <strong>di</strong>mensione n, la matrice per laquale, per i = 1,2,...,n, si hal i j = 0 per j = i + 1,i + 2,...,n88


7.2. Elementi <strong>di</strong> Algebra LineareEsempi⎛1 −2⎞5.3⎛1 0⎞0U = ⎝0 3.2 −4⎠ L = ⎝ 2 −21 0 ⎠0 0 10−3.4 5.7 −4Teorema 7.2.2 Date A matrice n × m, B matrice m × s, C matrice s × p, D matrice m × s, I m e I s le matriciidentità, rispettivamente <strong>di</strong> <strong>di</strong>mensione m e s, e λ e µ due numeri reali, valgono le seguenti proprietà:G A(BC ) = (AB)C G A(B + D) = AB + ADGI m B = B B I s = B Gλ(AB) = (λA)B = A(λB).A questo punto, il sistema lineare (7.1) può essere scritto in forma matriciale comeAx = bCollegata alla soluzione <strong>di</strong> un sistema lineare è l’inversa <strong>di</strong> una matrice.Definizione 7.2.2 Data una matrice A <strong>di</strong> <strong>di</strong>mensione n, A si <strong>di</strong>ce nonsingolare (o invertibile o regolare) seesiste una matrice, che in<strong>di</strong>chiamo come A −1 <strong>di</strong> <strong>di</strong>mensione n tale cheMatriceinversaA A −1 = A −1 A = ILa matrice A −1 si chiama matrice inversa della A. Una matrice che non ha inversa si <strong>di</strong>ce, invece, singolare (onon invertibile).Teorema 7.2.3 Per ogni matrice A <strong>di</strong> <strong>di</strong>mensione n nonsingolare si ha:G A −1 è unicaG A −1 è nonsigolare e (A −1 ) −1 = AG Se B è non singolare, <strong>di</strong> <strong>di</strong>mensione n, allora (AB) −1 = B −1 A −1Dato il sistema Ax = b, se A è nonsingolare, si ha x = A −1 b.Un’altra importante matrice associata ad un’assegnata matrice A è la sua trasposta.Definizione 7.2.3 La trasposta <strong>di</strong> una matrice A <strong>di</strong> <strong>di</strong>mensione n × m è una matrice A T <strong>di</strong> <strong>di</strong>mensione m × nper cui la colonna i della trasposta coincide con la riga i della matrice A <strong>di</strong> partenza: a T i j = a j i .Trasposta <strong>di</strong>una matriceEsempio:A =( 1 2) 32 5 6⎛1⎞2A T = ⎝2 5⎠3 6Legata alla trasposta <strong>di</strong> una matrice è la seguente definizione.Definizione 7.2.4 Una matrice quadrata si <strong>di</strong>ce simmetrica se A = A T .Esempio:⎛1 4⎞8⎛1 4⎞8A = ⎝4 2 6⎠ A T = ⎝4 2 6⎠8 6 58 6 5Teorema 7.2.4 Valgono le seguenti proprietà (per matrici per cui è possibili eseguire le seguenti operazioni):89


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARIDeterminante<strong>di</strong> unamatriceG(A T ) T = AG(AB) T = B T A TG(A + B) T = A T + B TGSe esiste A −1 allora (A −1 ) T = (A T ) −1Il determinante <strong>di</strong> una matrice permette <strong>di</strong> stabilire esistenza e unicità della soluzione nei sistemi lineari.Data una matrice quadrata A, il suo determinante si in<strong>di</strong>ca me<strong>di</strong>ante la notazione det(A) o |A|.G Se A = [a] è una matrice 1 × 1, allora det(A) = a.G Se A è una matrice <strong>di</strong> <strong>di</strong>mensione n, si definisce minore M i j il determinante della sottomatrice <strong>di</strong><strong>di</strong>mensione n − 1 ottenuta cancellando la i -sima riga e la j -sima colonna da A.G Il determinante <strong>di</strong> A è dato dalla formuladet(A) =det(A) =n∑(−1) i+j a i j M i jj =1n∑(−1) i+j a i j M i ji=1(fissato un qualunque i = 1,2,...,n)(fissato un qualunque j = 1,2,...,n)Il calcolo del determinante <strong>di</strong> una matrice <strong>di</strong> <strong>di</strong>mensione n richiede O (n!) moltiplicazioni. Quin<strong>di</strong>, anche pervalori piccoli <strong>di</strong> n, le operazioni da fare <strong>di</strong>ventanto proibitive.Teorema 7.2.5 Sia assegnata A una matrice quadrata <strong>di</strong> <strong>di</strong>mensione n.Se una riga o una colonna <strong>di</strong> A ha elementi tutti nulli, allora det(A) = 0.Se A ha due righe o due colonne con gli stessi elementi, allora det(A) = 0.G Denotata con à la matrice ottenuta scambiando due righe <strong>di</strong> A, si ha det(Ã) = −det(A).G Denotata con à la matrice ottenuta da A moltiplicando una sua riga per un numero reale λ, si hadet(Ã) = λdet(A).G Denotata con à la matrice ottenuta da A sommando una sua riga per un’altra che è stata moltiplicataper λ, si ha det(Ã) = det(A).G Se B è un’altra matrice <strong>di</strong> <strong>di</strong>mensione n, si ha det(AB) = det(A)det(B)G det(A T ) = det(A)G Se esiste A −1 , si ha det(A −1 1) =det(A)G Se A è una matrice trangolare superiore o trangolare inferiore o <strong>di</strong>agonale, allora det(A) = ∏ ni=1 a i i7.3 Metodo <strong>di</strong> eliminazione <strong>di</strong> GaussRitorniamo al sistema <strong>di</strong> equazioni (7.1), che possiamo scrivere in forma matriciale come Ax = b.Nel metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss 1 il sistema lineare <strong>di</strong> partenza viene trasformato in uno equivalente<strong>di</strong> più facile soluzione in quanto la matrice del nuovo sistema ha forma triangolare (superiore o inferiore) epuò essere risolto facilmente me<strong>di</strong>ante sostituzione (all’in<strong>di</strong>etro o in avanti).Ve<strong>di</strong>amo nel dettaglio come si risolve un sistema lineare con queste tecniche.7.3.1 Sostituzione all’in<strong>di</strong>etro e in avantiLa matrice A sia nonsingolare e triangolare superiore, cioè⎛⎞a 11 a 12 ... a 1n. a .. 22 a2nA =⎜.⎝... .. ⎟⎠a nn1 Carl Friedrich Gauss fu un matematico e fisico tedesco (1777-1855) che ha dato il suo contribuito in maniera significativa innumerosi campi: teoria dei numeri, analisi, geometria <strong>di</strong>fferenziale, geodesia, magnetismo, astronomia, ottica. Al pari <strong>di</strong> Eulero, Newtone Archimede è considerato uno dei più gran<strong>di</strong> matematici della storia.In suo onore è stato dato il suo nome a una nave <strong>di</strong> ricerca tedesca, a una montagna (Gaussberg) in Antartide, a un cratere sulla luna,e all’unità <strong>di</strong> misura della densità <strong>di</strong> flusso magnetico o <strong>di</strong> induzione magnetica.90


7.3. Metodo <strong>di</strong> eliminazione <strong>di</strong> GaussLa soluzione del sistema Ax = b può dunque procedere dal basso verso l’alto, a partire dall’ultima riga. Leequazioni, infatti, sonoa 11 x 1 + a 12 x 2 + a 13 x 3 + ... a 1n x n = b 1a 22 x 2 + a 23 x 3 + ... a 2n x n = b 2a 33 x 3 + ... a 3n x n = b 2. = . . .a nn x n = b nL’ultima riga si legge come a nn x n = b n . Quin<strong>di</strong> possiamo ricavare x n = b n /a nn .Noto il valore <strong>di</strong> x n , possiamo ricavare x n−1 dalla riga n − 1 del sistema:1a n−1n−1 x n−1 + a n−1n x n = b n−1 . Si ha x n−1 = (b n−1 − a n−1n x n ).a n−1n−1Si procede a ritroso in questo modo arrivando fino alla prima equazione che ci permette <strong>di</strong> calcolare il valore<strong>di</strong> x 1 . Osserviamo che tutte le <strong>di</strong>visioni per i coefficienti a i i sono possibili in quanto stiamo supponendoA non singolare e, poichè det A = ∏ ni=1 a i i ≠ 0, necessariamente ciascun a i i ≠ 0.Possiamo dunque scrivere l’algoritmo <strong>di</strong> sostituzione all’in<strong>di</strong>etro:Per i = n fino a i = 1, procedendo all’in<strong>di</strong>etro con passo −1x i =b i − ∑ nj =i+1 a i j x ja i iUn analogo algoritmo si ricava quando la matrice è triangolare inferiore. In tal caso, si parte dalla primaequazione per ricavare x 1 e poi si va avanti nell’equazione successiva.Si ha l’algoritmo <strong>di</strong> sostituzione in avanti:Per i = 1 fino a i = n, procedendo in avanti con passo 1x i =b i − ∑ i−1j =1 a i j x ja i i7.3.2 Eliminazione <strong>di</strong> GaussAssumiamo, ora, che la matrice A sia piena (o densa, cioè abbia quasi tutti gli elementi non nulli). Applichiamotrasformazioni elementari per riga in modo da ridurre il sistema <strong>di</strong> partenza in uno equivalente <strong>di</strong>forma triangolare superiore, che potremo risolvere me<strong>di</strong>ante sostituzione all’in<strong>di</strong>etro.La soluzione del problema Ax = b, infatti, non cambia se moltiplichiamo una riga per una costante, sesottraiamo il multiplo <strong>di</strong> una riga da un’altra riga o se facciamo scambi <strong>di</strong> righe, come abbiamo detto all’iniziodella Sezione 7.2.Supponiamo, per il momento, che tutti gli elementi della <strong>di</strong>agonale principale <strong>di</strong> A siano non nulli.G Al primo passo vogliamo eliminare gli elementi della prima colonna al <strong>di</strong> sotto della <strong>di</strong>agonaleprincipale:91


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI– sottraiamo la prima equazione moltiplicata per a 21a 11dalla seconda equazione:a 21 x 1 + a 22 x 2 + a 23 x 3 + ... + a 2n x n = b 2a 21a 11(a 11 x 1 + a 12 x 2 + a 13 x 3 + ... + a 1n x n ) = a 21a 11b 1(a 22 − a 21a 11a 12 )x 2 + (a 23 − a 21a 11a 13 )x 3 + ... + (a 2n − a 21a 11a 1n )x n = b 2 − a 21a 11b 1– sottraiamo la prima equazione moltiplicata per a 31a 11dalla terza equazione.– ...– sottraiamo la prima equazione moltiplicata per a n1a 11dalla n-sima equazione.Come risultato <strong>di</strong> questa operazione avremo una nuova matrice con gli elementi della primacolonna, eccetto quello <strong>di</strong> posto 11, tutti uguali a zero.⎛⎞⎛⎞ ⎛ ⎞a 11 a 12 ... a 1n x 1 b 10 a (1)22... a (1)2nx 2⎜⎝.. ...⎟⎜. ⎠⎝⎟. ⎠ = b (1)2 ⎜ ...⎟⎝ ⎠0 a (1)n2... a nn(1) x n b n(1)G Al secondo passo, consideriamo il sistema ridotto che si ha ignorando la prima equazione del sistemae la prima colonna della nuova matrice che abbiamo ottenuta (che ha tutti 0 al <strong>di</strong> sotto dell’elemento<strong>di</strong>agonale).A questa sottomatrice applichiamo lo stesso proce<strong>di</strong>mento <strong>di</strong> prima, sottraendo, quin<strong>di</strong>, la primaequazione della sottomatrice moltiplicata per a(1) 32a (1)22via.Dopo questo passo, il sistema sarà equivalente a:⎛⎞a 11 a 12 ... ... a ⎛ ⎞ ⎛ ⎞1n0 a (1)22a (1)23... a (1) x 1b 12nx 2b (1)2. 0 a (2)33... a (2)3nx 3⎜⎝... ...⎟⎜=b (2)3 . ⎠⎝⎟ ⎜ ... ⎟. ⎠ ⎝ ⎠0 0 a (2)n3... a nn(2) x n b n(1)dalla seconda equazione della sottomatrice, e cosìG Dopo aver applicato questo proce<strong>di</strong>mento n − 1 volte, avremo un sistema triangolare superioresemplice da risolvere utilizzando l’algoritmo <strong>di</strong> sostituzione all’in<strong>di</strong>etro.⎛⎞a 11 a 12 ... ... a ⎛ ⎞ ⎛1n0 a (1)22a (1)23... a (1) x 12nx 2. 0 a (2)33... a (2)3nx 3⎜⎝.. ... ...⎟⎜=. ⎠⎝⎟ ⎜. ⎠ ⎝0 0 ... 0 a nn(n−1) x nb 1b (1)2b (2)3...b (n−1)n⎞⎟⎠92


7.4. Strategie <strong>di</strong> pivotingEsempio 7.3.1 Sia A =( ) ( )2 1 2e .3 2=¯ 3.5Per applicare il metodo <strong>di</strong> Gauss, dobbiamo moltiplicare la prima equazione per 3 e sottrarla dalla seconda23x 1 + 2x 2 = 3.5−32 (2x 1 + 1x 2 ) = 3 2 2 =0x 1 + 0.5x 2 = 0.5Il sistema(equivalente)( ) (<strong>di</strong>venta)2 1 x1 2=0 0.5 x 2 0.57.4 Strategie <strong>di</strong> pivotingGli elementi <strong>di</strong>agonali generati ad ogni passo del metodo <strong>di</strong> eliminazione a (k) sono detti elementii ipivotali.Nel descrivere il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss abbiamo supposto, per semplicità, che tutti gli elementi<strong>di</strong>agonali fossero <strong>di</strong>versi da zero. Ma una matrice può essere non singolare senza che gli elementi della<strong>di</strong>agonale principale siano tutti <strong>di</strong>versi da zero.Inoltre, andando avanti nel proce<strong>di</strong>mento <strong>di</strong> eliminazione, può succedere che un elemento pivotale <strong>di</strong>ventinullo – e quin<strong>di</strong> la corrispondente incognita non può essere eliminata attraverso quella equazione nelproce<strong>di</strong>mento <strong>di</strong> sostituzione all’in<strong>di</strong>etro.C’è, infine, da considerare il fatto che si possono avere grossi errori numerici quando un elementopivotale è molto piccolo.Cosa fare in queste circostanze? In che modo applicare l’eliminazione <strong>di</strong> Gauss?Si hanno le cosiddette strategie <strong>di</strong> pivoting:G pivoting parzialeMano mano che si va avanti nell’eliminazione, per i = 1,2,...,n −1 a ciascuno sta<strong>di</strong>o si sceglie il piùpiccolo intero q tale che|a (i−1) | = maxqii≤j ≤n |a(i−1) |j ie si scambiano le righe i e q.Si opera, dunque, un controllo sulla colonna i -sima dalla posizione i fino alla posizione n, andandoa cercare il coefficiente massimo in modulo.G pivoting totaleNel pivoting totale, invece, la ricerca dell’elemento più grande avviene in tutta la sottomatrice adestra e sotto l’elemento <strong>di</strong>agonale i -simo. Si vanno quin<strong>di</strong> a cercare i più piccoli interi q e r tali che|a qr(i−1) | = maxi≤k,j ≤n |a(i−1) j k|Si opera, quin<strong>di</strong>, uno scambio non solo <strong>di</strong> righe ma anche <strong>di</strong> colonne in modo da portare l’elementopivotale dalla riga e colonna qr al posto i i . Di questo scambio <strong>di</strong> colonne bisogna conservaretraccia perchè vengono scambiate anche le componenti del vettore soluzione, in modo da effettuare loscambio inverso una volta risolto il sistema.93


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARIIl maggiore sforzo computazionale garantisce maggiore accuratezza e stabilità nei risultati, nel senso chegli errori <strong>di</strong> arrotondamento non sono così amplificati come potrebbe succedere senza l’adozione <strong>di</strong> unatecnica <strong>di</strong> pivoting.Esempio 7.4.1 Consideriamo il sistemax 1 + x 2 +x 3 = 1x 1 + 1.0001x 2 + 2x 3 = 2x 1 + 2x 2 + 2x 3 = 1L’esatta soluzione, corretta a 4 cifre decimali, è x = (1, −1.0001, 1.0001) T .L’eliminazione <strong>di</strong> Gauss senza pivoting porta al sistemax 1 + x 2 +x 3 = 10.0001x 2 + 1x 3 = 11x 2 + 1x 3 = 0e, infine, ax 1 + x 2 +x 3 = 10.0001x 2 + 1x 3 = 1−9999x 3 = −10000Se usiamo un’aritmetica in base 10 con 3 cifre decimali, allora la sostituzione all’in<strong>di</strong>etro ci darà: x 3 =−10000/ − 9999 = 1.000, x 2 = 1 − 10.0001 = 0 e x 1 = 0.La soluzione è completamente sbagliata.Se, invece, facciamo lo scambio della seconda e terza riga adottando il pivoting parziale, allora avremo ilsistema:x 1 + x 2 +x 3 = 11x 2 + 1x 3 = 00.0001x 2 + 1x 3 = 1e, infine,x 1 + x 2 +x 3 = 11x 2 + 1x 3 = 00.9999x 3 = 1Questa volta si ha (sempre lavorando con 3 cifre decimali) x 3 = 1.000, x 2 = −1.000, x 1 = 1.000, che è lasoluzione corretta a 3 cifre decimali.7.5 Fattorizzazione triangolareIl metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss, visto in forma matriciale, decompone la matrice A nel prodotto LU<strong>di</strong> due matrici L, trangolare inferiore, e U , triangolare superiore.94


7.5. Fattorizzazione triangolareBasta considerare, ad ogni passo, la matrice⎛10 1. 0 1.. 0 1M (k) ... − a(k−1) k+1k=a (k−1)kk... − a(k−1) k+2ka (k−1)kk....⎜⎝... − a(k−1) n ka (k−1)kk1. ... ..⎞⎟1⎠Si considera quin<strong>di</strong> la matrice A (k) = M (k) A (k−1) = M (k) M (k−1) ... M (1) A e il vettore b (k) = M (k) b (k−1) =M (k) M (k−1) ... M (1) b.Dopo n − 1 passi, avremoU = A (n−1) = M (n−1) ... M (2) M (1) Acon U matrice triangolare superiore. Otteniamo quin<strong>di</strong> A = LU , conL = (M (n−1) ... M (2) M (1) ) −1 = [M (1) ] −1 ...[M (n−2) ] −1 [M (n−1) ] −1L è triangolare inferiore con elementi dati dal prodotto delle matrici M (k) generate durante l’eliminazione <strong>di</strong>Gauss.7.5.1 Fattorizzazione LDUL’eliminazione <strong>di</strong> Gauss è un caso particolare <strong>di</strong> fattorizzazione LDU , nella quale la matrice A viene decompostanel prodotto <strong>di</strong> 3 matrici, la L che è triangolare inferiore con elementi sulla <strong>di</strong>agonale principale(elementi <strong>di</strong>agonali) uguali a 1, la D che è una matrice <strong>di</strong>agonale e la U che è una triangolare superiore conelementi <strong>di</strong>agonali uguali a 1.Nell’eliminazione <strong>di</strong> Gauss vista prima, nella U abbiamo inglobato anche la matrice D, per cui abbiamouna fattorizzazione LU .La decomposizione LDU è assicurata dal teorema LDU . Prima <strong>di</strong> vedere il teorema, definiamo i minoriprincipali <strong>di</strong> una matrice A.Definizione 7.5.1 Data una matrice A si definisce minore principale <strong>di</strong> <strong>di</strong>mensione k (con 1 ≤ k ≤ n), lasottomatrice che si ha prendendo le prime k righe e k colonne <strong>di</strong> A.⎡⎤a 11 ... a 1k⎢⎣.⎥. ⎦a k1 ... a kkMinoreprincipaleTeorema 7.5.1 (LDU ) Nell’ipotesi che tutti i minori principali <strong>di</strong> A, (per i = 1,2,...,n) siano non-singolari,allora la matrice A è decomponibile in maniera univoca nel prodotto A = LDUQualsiasi matrice non singolare può essere condotta sotto una forma tale da sod<strong>di</strong>sfare il teorema LDUme<strong>di</strong>ante opportuni scambi <strong>di</strong> righe e <strong>di</strong> colonne (abbiamo visto cosa fare quando un elemento pivotale è95


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARIMatrice <strong>di</strong>permutazionenullo). Fare uno scambio <strong>di</strong> righe o <strong>di</strong> colonne significa moltiplicare la matrice A con un’opportuna matrice<strong>di</strong> permutazione.Una matrice <strong>di</strong> permutazione P è una matrice ottenuta dalla matrice identità operando scambi <strong>di</strong> righe o<strong>di</strong> colonne in modo che la matrice risultante abbia esattamente un unico valore <strong>di</strong>verso da zero su ogni rigae colonna, e tale valore sia uguale a 1.Esempio 7.5.1 Si consideri la matrice <strong>di</strong> permutazione P <strong>di</strong> <strong>di</strong>mensione 3 data da⎛ ⎞1 0 0P = ⎝0 0 1⎠0 1 0Qualunque sia la matrice A, <strong>di</strong> <strong>di</strong>mensione 3, moltiplicandola a sinistra per P si ottiene lo scambio dellaseconda e terza riga <strong>di</strong> A; invece, moltiplicandola a destra per P si ottiene lo scambio della seconda e terzacolonna <strong>di</strong> A:⎛ ⎞⎛⎞ ⎛⎞1 0 0 a 11 a 12 a 13 a 11 a 12 a 13PA = ⎝0 0 1⎠⎝a 21 a 22 a 23⎠ = ⎝a 31 a 32 a 33⎠0 1 0 a 31 a 32 a 33 a 21 a 22 a 23⎛⎞⎛⎞ ⎛⎞a 11 a 12 a 13 1 0 0 a 11 a 13 a 12AP = ⎝a 21 a 22 a 23⎠⎝0 0 1⎠ = ⎝a 21 a 23 a 22⎠a 31 a 32 a 33 0 1 0 a 31 a 33 a 32Quin<strong>di</strong>, il teorema LDU si può applicare alla matrice A o ad un’opportuna matrice PA, se si effettua il pivotingparziale, o a PAQ se si effettua il pivoting totale (e quin<strong>di</strong> si considerano due matrici <strong>di</strong> permutazioni P e Q).In genere, la matrice D viene inglobata nella L o nella U (post-moltiplicando o pre-moltiplicando le L e leU definite prima per la D).G Nel caso in cui la matrice D viene inglobata nella matrice L, la L ha elementi <strong>di</strong>agonali l i i ≠ 0, mentrela U ha elementi <strong>di</strong>agonali unitari. Si parla <strong>di</strong> fattorizzazione <strong>di</strong> Crout.G Nel caso in cui la matrice D viene inglobata nella matrice U , la U ha elementi <strong>di</strong>agonali u i i ≠ 0, mentrela L ha elementi <strong>di</strong>agonali unitari. Si parla <strong>di</strong> fattorizzazione <strong>di</strong> Doolittle.Scriviamo in forma estesa il prodotto tra matrici, nell’ipotesi <strong>di</strong> operare la fattorizzazione <strong>di</strong> Crout:⎛⎞ ⎛⎞⎛⎞a 11 a 12 ... a 1n l 11 0 ... 0 1 u 12 ... u 1na 21 a 22 ... a 2n⎜⎝..⎟. ⎠ = l 21 l 22 ... 00 1 ... u 2n⎜⎝..⎟⎜. ⎠⎝..⎟. ⎠a n1 a n2 ... a nn l n1 l n2 ... l nn 0 0 ... 1Moltiplichiamo la prima riga <strong>di</strong> L per le colonne <strong>di</strong> U ed eguagliamo i termini con gli elementi della primariga <strong>di</strong> A. Otteniamo:l 11 · 1 = a 11l 11 · u 1k = a 1k , k = 2,...,nQuin<strong>di</strong>: l 11 = a 11 e u 1k = a 1k /l 11 . Abbiamo ricavato gli elementi della prima riga <strong>di</strong> L e U .Moltiplicando le successive righe <strong>di</strong> L per le colonne <strong>di</strong> U ed uguagliando i termini ai corrispondentitermini <strong>di</strong> A, abbiamo:l i j = a i j −j −1 ∑m=1u i j = 1 (a i j −l i il i m u m j i = 1,2,...n j = 1,2,...,ii−1 ∑m=1l i m u m j ) i = 1,2,...,n − 1 j = i + 1,...n96


7.5. Fattorizzazione triangolareSi calcolano prima gli elementi della riga i -sima <strong>di</strong> L e poi quelli della riga i -sima <strong>di</strong> U , per i = 1,2,...,n.Trovate le matrici L e U , il sistema <strong>di</strong> partenza Ax = b è equivalente a LU x = b.Si pone, dunque, y = U x, ottenendo il sistema Ly = b. Si ricava facilmente y me<strong>di</strong>ante sostituzione inavanti e da U x = y si ricava x me<strong>di</strong>ante sostituzione all’in<strong>di</strong>etro.Lo sforzo computazionale maggiore è quin<strong>di</strong> quello per il calcolo dei coefficienti <strong>di</strong> L e U .Nell’eliminazione <strong>di</strong> Gauss noi ricaviamo espressamente solo la U mentre le mo<strong>di</strong>fiche operate sullacolonna dei termini noti è equivalente al prodotto L −1 b (quin<strong>di</strong> da LU x = b risolviamo U x = L −1 b).7.5.2 Fattorizzazione <strong>di</strong> Gauss senza pivotingAbbiamo visto che, a volte, il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss richiede scambi <strong>di</strong> righe per evitare <strong>di</strong>visioniper zero. Allo stesso modo, il teorema <strong>di</strong> fattorizzazione LDU vale su matrici A non singolari o su matriciottenute da A me<strong>di</strong>ante moltiplicazioni a sinistra o a destra con opportune matrici <strong>di</strong> permutazione.Ci chie<strong>di</strong>amo se esistono matrici per le quali il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss possa essere implementatosenza scambi <strong>di</strong> righe e per le quali l’algoritmo <strong>di</strong> eliminazione <strong>di</strong> Gauss sia stabile rispetto ad una crescita<strong>di</strong> errori <strong>di</strong> arrotondamento.Ve<strong>di</strong>amo, nel seguito, alcune speciali classi <strong>di</strong> matrici per cui valgono le nostre richieste.Una matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ce <strong>di</strong>agonalmente dominante in senso stretto per righe se vale larelazione|a i i | >n∑|a i j | per ogni i = 1,2,...,n.j =0j ≠iUna matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ce <strong>di</strong>agonalmente dominante in senso stretto per colonne se vale larelazione|a j j | >n∑|a i j | per ogni j = 1,2,...,n.i=0i≠jMatrice <strong>di</strong>agonalmentedominante insenso strettoper righeMatrice <strong>di</strong>agonalmentedominante insenso strettoper colonneEsempio 7.5.2⎛⎞7 3 1A = ⎝2 10 −2⎠5 0 6A è una matrice <strong>di</strong>agonalmente dominante in senso stretto per righe poichè vale:|7| > |3| + |1| = 4, |10| >|2| + | − 2| = 4 e |6| > |5| + |0|. Non è <strong>di</strong>agonalmente dominante in senso stretto per colonne in quanto sullaprima colonna si ha |7| = |2| + |5|.Esempio 7.5.3⎛⎞6 3 −4A = ⎝ 3 9 5 ⎠−4 5 11A non è <strong>di</strong>agonalmente dominante in senso stretto per righe poichè, sulla prima riga si ha |6| < |3| + | − 4| =7. Essendo simmetrica, la matrice non può essere neanche <strong>di</strong>agonalmente dominante in senso stretto percolonne, perchè la relazione che abbiamo sulla prima riga vale sulla prima colonna.Le definizioni appena date si possono rilassare, definendo le matrici <strong>di</strong>agonalmente dominanti.97


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARIUna matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ce <strong>di</strong>agonalmente dominante per righe se vale la relazioneMatrice <strong>di</strong>agonalmentedominante|a i i | ≥n∑|a i j | per ogni i = 1,2,...,n.j =0j ≠iAnaloga è la definizione <strong>di</strong> matrice <strong>di</strong>agonalmente dominante per colonne (basta applicare la definizione<strong>di</strong> matrice <strong>di</strong>agonalmente dominante per righe sulla matrice A T )Si hanno i seguenti teoremi.Teorema 7.5.2 Se A è una matrice <strong>di</strong>agonalmente dominante e non singolare, allora il metodo <strong>di</strong> eliminazione<strong>di</strong> Gauss può essere implementato senza alcuno scambio <strong>di</strong> righe e <strong>di</strong> colonne e i calcoli sono stabili rispettoalla crescita <strong>degli</strong> errori <strong>di</strong> arrotondamento.Teorema 7.5.3 Se A è una matrice <strong>di</strong>agonalmente dominante in senso stretto (per righe o per colonne), alloraA è non singolare. In questo caso il metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss può essere implementato senza alcunoscambio <strong>di</strong> righe e <strong>di</strong> colonne e i calcoli sono stabili rispetto alla crescita <strong>degli</strong> errori <strong>di</strong> arrotondamento.Un’altra importante classe <strong>di</strong> matrici è data dalle matrici definite positive.Una matrice A <strong>di</strong> <strong>di</strong>mensione n si <strong>di</strong>ceG definita positiva se è simmetrica e vale x T Ax > 0 qualunque sia il vettore x ≠ 0MatricedefinitapositivaG semidefinita positiva se x T Ax ≥ 0 qualunque sia il vettore x,G indefinita altrimenti. 2Si ha un’analoga definizione per matrici definite negative e semidefinite negative. Una matrice A <strong>di</strong><strong>di</strong>mensione n si <strong>di</strong>ceMatricedefinita negativa se è simmetrica e vale x T Ax < 0 qualunque sia il vettore x ≠ 0,definitaG semidefinita negativa se x T Ax ≤ 0 qualunque sia il vettore x.negativaDalla definizione <strong>di</strong> matrice definita positiva, deve essere x T Ax > 0 qualunque sia il vettore x, vale a <strong>di</strong>re:⎛⎞⎛⎞a 11 a 12 ... a 1n x 1( )a 21 a 22 ... a 2nx 2x1 x 2 ... x m ⎜⎝.. ...⎟⎜. ⎠⎝⎟. ⎠a n1 a n2 ... a nn x m⎛∑ nj =1 a ⎞1j x j= ( ∑ n)j =1x 1 x 2 ... x m a 2j x jn∑ n∑⎜⎝⎟. ⎠ = a i j x i x j > 0i=1 j =1∑ nj =1 a n j x jBasarsi sulla definizione per verificare che una matrice sia o meno definita positiva può essere molto<strong>di</strong>fficile. Fortunatamente, ci sono molti criteri che ci permettono <strong>di</strong> <strong>di</strong>re se una matrice è definita positiva ono.IL seguente risultato ci permette <strong>di</strong> eliminare certe matrici dalla classe delle matrici definite positive, senon sod<strong>di</strong>sfano certi requisiti.Teorema 7.5.4 Se una matrice A <strong>di</strong> <strong>di</strong>mensione n è definita positiva, alloraG A ammette la matrice inversa;G a i i > 0 per ogni i = 1,2,...,nVe<strong>di</strong>amo ora una con<strong>di</strong>zione necessaria e sufficiente per matrici definite positive.2 Osserviamo che non tutti gli autori richiedono la simmetria per definire una matrice definita positiva, e <strong>di</strong>stinguono tra matricidefinite positive e matrici simmetriche definite positive.98


7.5. Fattorizzazione triangolareTeorema 7.5.5 Una matrice A simmetrica <strong>di</strong> <strong>di</strong>mensione n è definita positiva se e solo se tutti i suoi minoriprincipali hanno determinante positivo.Teorema 7.5.6 Una matrice A simmetrica <strong>di</strong> <strong>di</strong>mensione n con elementi <strong>di</strong>agonali tutti positivi e<strong>di</strong>agonalmente dominante è definita positiva.Anche per matrici simmetriche definite positive, si può applicare il metodo <strong>di</strong> eliminazione <strong>di</strong> Gausssenza operare scambi <strong>di</strong> righe e <strong>di</strong> colonne e i calcoli rimangono stabili rispetto alla crescita <strong>degli</strong> errori <strong>di</strong>arrotondamento. Questo risultato ci serve per la fattorizzazione <strong>di</strong> Cholesky.7.5.3 Fattorizzazione <strong>di</strong> CholeskyNel caso in cui la matrice A sia simmetrica, il teorema LDU si presenta nel seguente modoTeorema 7.5.7 (LDU per matrici simmetriche) Se A è una matrice simmetrica e nessuno dei suoi minoriprincipali è singolare, allora A si può decomporre nel prodotto A = LDL T , dove L è triangolare inferiore conelementi <strong>di</strong>agonali unitari ed è univocamente determinata, L T è la sua trasposta e D è matrice <strong>di</strong>agonale.Dimostrazione. Poichè A è simmetrica, si ha A = A T , quin<strong>di</strong> LDU = (LDU ) T = U T D T L T = U T DL T . Sideduce quin<strong>di</strong>, dall’uguaglianza, che U = L T e la decomposizione <strong>di</strong>venta A = LDL T . ✔Nel caso particolare in cui A sia simmetrica e definita positiva, deve valerex T Ax = x T LDL T x = (L T x) T DL T x = y T Dy > 0 con y = L T x per ogni x > 0.Perciò gli elementi <strong>di</strong> D (che è una matrice <strong>di</strong>agonale) devono necessariamente essere tutti positivi – essendoA definita positiva. In tal caso, posto M = LD 1/2 si ha A = M M T , il prodotto <strong>di</strong> una matrice triangolareinferiore con coefficienti tutti reali per la sua trasposta. Se D non fosse definita positiva (ma avesse qualcheelemento negativo), allora neanche A sarebbe definita positiva e la matrice M sarebbe non reale.Quin<strong>di</strong> se A è simmetrica, si ha la decomposizione nel prodotto LL T (chiamiamo <strong>di</strong> nuovo con L lamatrice M) con L reale se e solo se A è definita positiva.I coefficienti della matrice L si trovano facendo il prodotto righe per colonne ed eguagliando i termini aicorrispondenti elementi <strong>di</strong> A.Si ricava:l 11 = a 11l i 1 = a i 1 /l 11 i = 2,3,...,ni−1 ∑l i i = √ (ai i − l 2 i k ) i = 2,3,...,nk=1l i j = 1 j∑−1(a i j − l i k l j k ) j = 2,...,n i = j + 1,...,nl i ik=1Tale fattorizzazione prende il nome <strong>di</strong> fattorizzazione <strong>di</strong> Cholesky 3 .3 André-Louis Cholesky (1875-1918) fu un matematico francese. Fu ufficiale ingegnere e morì alla fine della prima guerra mon<strong>di</strong>ale.99


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI7.6 <strong>Esercizi</strong><strong>Esercizi</strong>o 7.6.1 ⎛ Sia data ⎞ la matrice1 0 2A = ⎝0 4 8 ⎠2 8 29Provare che verifica le con<strong>di</strong>zioni del teorema LDU e trovare i fattori L e L T tali che A = LL T .( ) 1 0Svolgimento La matrice A è simmetrica e sod<strong>di</strong>sfa le ipotesi del teorema LDU ( infatti |a 11 | = 1, det =0 44 e det(A) = 116 − 16 − 64 = 36) per cui è possibile scrivere la matrice A come A = LL T . Si ha, quin<strong>di</strong>:⎛⎞⎛⎞ ⎛l 11 0 0 l 11 l 21 l 31 l 2 ⎞11l 11 l 21 l 11 l 31⎝l 21 l 22 0 ⎠⎝0 l 22 l 32⎠ = ⎝l 21 l 11 l21 2 + l 22 2 l 21 l 31 + l 22 l 32⎠l 31 l 32 l 33 0 0 l 33 l 31 l 11 l 31 l 21 + l 32 l 22 l31 2 + l 32 2 + l 332Devono quin<strong>di</strong> valere le relazioni:l 2 11 = 1 → l 11 = 1l 21 l 11 = 0 → l 21 = 0l 31 l 11 = 2 → l 31 = 2l 2 21 + l 2 22 = 4 → l 22 = 4 − 0 = 2l 21 l 31 + l 22 l 32 = 8 → l 32 = 8/2 = 4√l31 2 + l 32 2 + l 33 2 = 29 → l 33 = 29 − 2 2 − 4 2 = 29 − 4 − 16 = 9 = 3La matrice L è dunque⎛1 0⎞0⎝0 2 0⎠2 4 3<strong>Esercizi</strong>o 7.6.2 ⎛ Data la matrice ⎞0.2 1 0.2A = ⎝ 1 6.5 1.75⎠0 2 2.25(a) verificare che A sod<strong>di</strong>sfa le con<strong>di</strong>zioni del teorema LDU ;(b) fattorizzare secondo Crout A = LU (prendendo u i i = 1);(c) usare la fattorizzazione per calcolare det(A −2 );(d) usare la fattorizzazione per risolvere il sistema Ax = b, con b T = (2.8 19.25 10.75) T .Svolgimento(a) La matrice verifica le con<strong>di</strong>zioni del teorema LDU in quanto i minori principali costruiti a partiredall’angolo superiore sinistro hanno tutti determinante <strong>di</strong>verso da zero:a 11 = 0.2 ≠ 0( ) 0.2 1det = 0.3 ≠ 0 det A = 0.375 ≠ 01 6.5100


7.6. <strong>Esercizi</strong>(b) La fattorizzazione <strong>di</strong> A come A = LU si costruisce imponendo:⎛⎞ ⎛⎞⎛⎞0.2 1 0.2l 11 0 0 1 u 12 u 13A = ⎝ 1 6.5 1.75⎠ = LU = ⎝l 21 l 22 0 ⎠⎝0 1 u 23⎠0 2 2.25l 31 l 32 l 33 0 0 1Usando le formule <strong>di</strong> pag. 96, si ottienel 11 = 0.20.2u 12 = 1 =⇒ u 12 = 50.2u 13 = 0.2 =⇒ u 13 = 1l 21 = 11 · 5 + l 22 = 6.5 =⇒ l 22 = 1.51 · 1 + 1.5u 23 = 1.75 =⇒ u 23 = 0.5l 31 = 00 · 5 + l 32 = 2 =⇒ l 32 = 20 · 1 + 2 · 0.5 + l 33 = 2.25 =⇒ l 33 = 1.25Le matrici L e U sono:⎛0.2 0 0⎞⎛1 5⎞1L = ⎝ 1 1.5 0 ⎠ U = ⎝0 1 0.5⎠0 2 1.250 0 1(c) Si ha det A = detLU = detL detU = detL = 0.375. Quin<strong>di</strong> det(A −2 ) = det(A) −2 = 0.375 −2 = 7.11111111.(d) Da Ax = b si ha LU x = b.Si pone U x = y e si hanno i due sistemi da risolvere per sostituzione in avanti e all’in<strong>di</strong>etro: Ly = b eU x = y.⎛⎞⎛⎞ ⎛ ⎞ ⎧0.2 0 0 y 1 2.8 ⎪⎨ y 1 = 2.8/0.2 = 14⎝ 1 1.5 0 ⎠⎝y 2⎠ = ⎝19.25⎠ =⇒ y 2 = (19.25 − 14)/1.5 = 3.50 2 1.25 y 3 10.75⎪⎩y 3 = (10.75 − 2 · 3.5)1.25 = 3⎛ ⎞⎛⎞ ⎛ ⎞ ⎧1 5 1 x 1 14 ⎪⎨ x 3 = 3⎝0 1 0.5⎠⎝x 2⎠ = ⎝3.5⎠ =⇒ x 2 = 3.5 − 3 · 0.5 = 20 0 1 x 3 3⎪⎩x 1 = 14 − 3 − 5 · 2 = 1Quin<strong>di</strong> x = (1, 2, 3) T .<strong>Esercizi</strong>o 7.6.3 ⎛ È dato il sistema ⎞ lineare ⎛ Ax = ⎞ b dove:16 −8 420A = ⎝−8 20 4 ⎠ b = ⎝ 28 ⎠4 4 12.2528.25(a) Provare che la matrice è definita positiva.(b) Fattorizzare la matrice secondo Cholesky: A = LL T .(c) Usare la fattorizzazione per risolvere il sistema Ax = b e per calcolare det(A 3 ).Soluzione101


7. METODI DIRETTI PER LA SOLUZIONE DI SISTEMI LINEARI(a) La matrice è simmetrica, definita positiva in quanto gli elementi della <strong>di</strong>agonale principale sono tuttipositivi e la matrice è <strong>di</strong>agonalmente dominante in senso stretto:16 > | − 8| + |4| = 1220 > | − 8| + |4| = 1212.25 > |4| + |4| = 8(b) Ponendo A = LL T si ricava:l 2 11 = 16 → l 11 = 4l 21 l 11 = −8 → l 21 = −2l 31 l 11 = 4 → l 31 = 1l 2 21 + l 2 22 = 20 → l 22 = 20 − 4 = 4l 21 l 31 + l 22 l 32 = 4 → l 32 = (4 + 2)/4 = 1.5l 2 31 + l 2 32 + l 2 33 = 12.25 → l 33 = 12.25 − 1 − 2.25 = 9 = 3La matrice L è dunque⎛4 0⎞0L = ⎝−2 4 0⎠1 1.5 3(c) Per risolvere il sistema Ax = b, adoperiamo il metodo <strong>di</strong> sostituzione in avanti e all’in<strong>di</strong>etro risolvendoi sistemi: Ly = b e poi L T x = y.Il primo sistema dà:⎛⎞⎛⎞ ⎛ ⎞4 0 0 y 1 20⎝−2 4 0⎠⎝y 2⎠ = ⎝ 28 ⎠1 1.5 3 y 3 28.25e otteniamo y 1 = 20/4 = 5, y 2 = (28 + 10)/4 = 9.5, y 3 = (28.25 − 5 − 14.25)/3 = 3.Nel risolvere il sistema L T x = y si ha⎛⎞⎛⎞ ⎛ ⎞4 −2 1 x 1 5⎝0 4 1.5⎠⎝x 2⎠ = ⎝9.5⎠0 0 3 x 3 3da cui x 3 = 1, x 2 = (9.5 − 1.5)/4 = 2, x 1 = (5 − 1 + 4)/4 = 2, quin<strong>di</strong> x = (2, 2, 1).Inoltre, da det(A) = det(LL T ) = det(L) 2 = (4 · 4 · 3) 2 = 48 2 = 2304 e da det(A 3 ) = (det(A)) 3 si hadet(A 3 ) = 2304 3 = 12230590464.102


C A P I T O L O8METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARIMi spiace ammettere che la materiache mi è piaciuta <strong>di</strong> meno è stata lamatematica. Ci ho pensato su, ecredo che la ragione sia che lamatematica non lascia spazio alle<strong>di</strong>scussioni. Se fai un errore, nonpuoi scamparla.Malcom X8.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1038.2 Meto<strong>di</strong> iterativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048.3 Norme <strong>di</strong> vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048.4 Norme <strong>di</strong> matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068.5 Autovalori e autovettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068.6 Meto<strong>di</strong> classici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088.6.1 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088.6.2 Controllo della convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1108.6.3 I meto<strong>di</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118.6.4 Convergenza dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamento . . . . . . . . . . . . . . . . 1158.7 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1178.1 IntroduzioneL’equazione che governa la conduzione del calore in una piastra metallica piana, omogenea e isotropaprende il nome <strong>di</strong> equazione <strong>di</strong> Poisson e si scrive come∂ 2 T∂x 2 + ∂2 T f (x, y)=∂y2ρcK HSi tratta <strong>di</strong> un’equazione alle derivate parziali dove T [ o C ] è la temperatura, K H [m 2 /s] è il coefficiente <strong>di</strong> <strong>di</strong>ffusivitàtermica, ρ [K g /m 2 ] è la densità della piastra, c [C al/K g o C ] è il calore specifico, f (x, y) [C al/m 2 s] è ilcalore aggiunto o sottratto alla piastra per unità <strong>di</strong> tempo e <strong>di</strong> area. In letteratura <strong>di</strong>verse tecniche numerichepermettono <strong>di</strong> risolvere il problema (ricor<strong>di</strong>amo i meto<strong>di</strong> alle <strong>di</strong>fferenze finite e i meto<strong>di</strong> agli elementi finiti),103


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARIin determinati punti (detti no<strong>di</strong>) della piastra. Qualunque sia il metodo utilizzato, si arriva ad un sistema <strong>di</strong>equazioni lineari del tipoHT = qdove H rappresenta la matrice <strong>di</strong> <strong>di</strong>scretizzazione del metodo, T rappresenta il vettore delle temperature neino<strong>di</strong> e q è il vettore dei termini noti che deriva dal metodo applicato.La matrice H puó avere una <strong>di</strong>mensione molto elevata ma ha la caratteristica <strong>di</strong> essere sparsa, cioè <strong>di</strong>avere pochi elementi <strong>di</strong>versi da zero per ogni riga.Per risolvere sistemi lineari <strong>di</strong> questo tipo, si preferisce usare meto<strong>di</strong> iterativi piuttosto che <strong>di</strong>retti. Inquesto Capitolo presentiamo alcuni dei meto<strong>di</strong> iterativi per la risoluzione <strong>di</strong> sistemi lineari.8.2 Meto<strong>di</strong> iterativiPer risolvere un sistema <strong>di</strong> equazioni lineari Ax = b, applicando un metodo <strong>di</strong>retto, e trascurando glierrori <strong>di</strong> arrotondamento, si ottiene la soluzione esatta del problema in un numero finito (e noto a priori)<strong>di</strong> operazioni. Nei meto<strong>di</strong> iterativi, invece, si parte da un’approssimazione iniziale che viene migliorata,me<strong>di</strong>ante un proce<strong>di</strong>mento iterativo, fino ad ottenere una approssimazione sufficientemente accurata dellasoluzione. L’idea <strong>di</strong> risolvere sistemi lineri con meto<strong>di</strong> iterativi risale ai tempi <strong>di</strong> Gauss (1823), ma solo conl’avvento dei computers (negli anni cinquanta) si può osservare il loro sviluppo, visto che <strong>di</strong>venta possibilerisolvere sistemi lineari dove la matrice A è sparsa e <strong>di</strong> gran<strong>di</strong> <strong>di</strong>mensioni – un particolare tipo <strong>di</strong> problemaimproponibile per i meto<strong>di</strong> <strong>di</strong>retti. Difatti, nei meto<strong>di</strong> <strong>di</strong>retti, il processo <strong>di</strong> eliminazione <strong>di</strong> Gauss (o ladecomposizione della matrice <strong>di</strong> partenza nel prodotto LU con L triangolare inferiore e U triangolare superiore)porta all’introduzione del cosiddetto fill-in, cioè a matrici L e U con elementi <strong>di</strong>versi da zero là dovela matrice <strong>di</strong> partenza A ha elementi nulli. I meto<strong>di</strong> <strong>di</strong>retti <strong>di</strong>ventano quin<strong>di</strong> proibitivi perchè troppo costosiper quanto riguarda il numero <strong>di</strong> operazioni aritmetiche e l’occupazione <strong>di</strong> dati che devono essere salvati perl’implementazione numerica del metodo stesso. I meto<strong>di</strong> iterativi, al contrario, lavorano <strong>di</strong>rettamente sullamatrice A e, dal momento che A viene coinvolta solo in termini <strong>di</strong> prodotti matrice-vettore, non c’è neanchebisogno <strong>di</strong> memorizzare tutta la matrice (in genere, quando la matrice è sparsa, si lavora su memorizzazioniin forma compatta delle matrici, memorizzando solo gli elementi non nulli che servono per il prodottomatrice-vettore).Quando abbiamo stu<strong>di</strong>ato gli zeri <strong>di</strong> funzione nel Capitolo 4, data un’approssimazione iniziale, si procedevanell’algoritmo iterativo fino a quando lo scarto tra due approssimazioni successive non <strong>di</strong>ventavaminore <strong>di</strong> una prefissata tolleranza.Nel caso dei sistemi lineari, l’approccio è simile. Si parte da un vettore iniziale che approssima la soluzionedel sistema e, me<strong>di</strong>ante un certo proce<strong>di</strong>mento ricorsivo, si calcola una nuova approssimazione (unvettore). Dobbiamo dunque essere capaci <strong>di</strong> misurare lo scarto tra due vettori in modo da capire quando lasuccessione dei vettori generati dall’algoritmo tende al vettore soluzione del sistema lineare.A tal fine abbiamo bisogno <strong>di</strong> definire le norme <strong>di</strong> vettori e <strong>di</strong> matrici. Tratteremo solo norme <strong>di</strong> matrici evettori definite nello spazio dei numeri reali (e non complessi).NormaNorme 1, ∞,8.3 Norme <strong>di</strong> vettoriIl concetto <strong>di</strong> norma generalizza quello <strong>di</strong> valore assoluto (o modulo) <strong>di</strong> un numero reale (o complesso).Sia R n lo spazio dei vettori colonna <strong>di</strong> lunghezza n. La norma <strong>di</strong> un vettore x ∈ R n è una funzione, ‖ · ‖,definita in R n e a valori in R, che gode delle seguenti proprietà:‖x‖ > 0 per ogni x ≠ 0‖x‖ = 0 se e solo se x = 0‖αx‖ = |α|‖x‖ dove α è un reale (o complesso) arbitrarioG ‖x + y‖ ≤ ‖x‖ + ‖y‖Le principali norme vettoriali sono:2G Norma assoluta (o norma l 1 ), in<strong>di</strong>cata con ‖ · ‖ 1 : ‖x‖ 1 = ∑ ni=1 |x i |G Norma massima (o norma infinito, l ∞ ), in<strong>di</strong>cata con ‖ · ‖ ∞ : ‖x‖ ∞ = max 1≤i≤n |x i |104


8.3. Norme <strong>di</strong> vettoriFigura 8.1: Vettori in R 2 con norma unitaria nelle norme 1, ∞ e 2.G Norma euclidea (o norma l 2 ), in<strong>di</strong>cata con ‖ · ‖ 2 : ‖x‖ 2 = √ ∑nx T x =i=1 |x i | 2Tra le norme 1, ∞ e 2 valgono le seguenti relazioni (che pongono un’equivalenza tra esse). Dato un vettorex ∈ R n :‖x‖ ∞ ≤ ‖x‖ 2 ≤ n‖x‖ ∞‖x‖ ∞ ≤ ‖x‖ 1 ≤ n‖x‖ ∞Esempio 8.3.1 Il vettore x = (1,5,−20) T ha norme:‖x‖ 1 = |1| + |5| + | − 20| = 26‖x‖ ∞ = max(|1|,|5|,| − 20|) = 20√‖x‖ 2 = (1 2 + 5 2 + (−20) 2 ) = 426 = 20.639767441Per la norma euclidea vale la <strong>di</strong>seguaglianza <strong>di</strong> Cauchy-Schwarz:Diseguaglianza<strong>di</strong> Cauchy-Schwarzx T y ≤ ‖x‖ 2 ‖y‖ 2Dati due vettori x e y ∈ R n , si definisce <strong>di</strong>stanza tra i due vettori la norma della <strong>di</strong>fferenza tra i vettori.Quin<strong>di</strong>:Distanza travettori‖x − y‖ 1 =n∑|x i − y i |i=1‖x − y‖ ∞ = max |x i − y i |1≤i≤n√ n∑‖x − y‖ 2 = |x i − y i | 2i=1Il concetto <strong>di</strong> <strong>di</strong>stanza serve per definire il limite <strong>di</strong> una successione <strong>di</strong> vettori.Data una successione <strong>di</strong> vettori in R n , x (k) , per k = 1,2,...,∞, si <strong>di</strong>ce che la successione converge ad unvettore x <strong>di</strong> R n e si scrive lim k→∞ x (k) = x se, per ogni ɛ > 0, esiste un intero m tale che‖x (k) − x‖ < ɛ per tutti gli in<strong>di</strong>ci k ≥ mLimite <strong>di</strong> unasuccessione<strong>di</strong> vettori105


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI8.4 Norme <strong>di</strong> matriciNormacompatibileNormanaturaletraccia <strong>di</strong> unamatriceAnalogamente alla definizione <strong>di</strong> norma vettoriale, la norma <strong>di</strong> matrici quadrate <strong>di</strong> <strong>di</strong>mensione n è unafunzione, che in<strong>di</strong>chiamo con ‖ · ‖ che, per tutte le matrici A e B <strong>di</strong> <strong>di</strong>mensione n e per tutti i numeri reali (ocomplessi) α, sod<strong>di</strong>sfa le seguenti proprietà:‖A‖ > 0 per ogni A ≠ 0‖A‖ = 0 se e solo se A = 0‖αA‖ = |α|‖A‖‖A + B‖ ≤ ‖A‖ + ‖B‖G ‖AB‖ ≤ ‖A‖‖B‖Una proprietà importante che si richiede alle norme su matrici è che siano compatibili con norme vettoriali:la norma ‖A‖ <strong>di</strong> una matrice A si <strong>di</strong>ce compatibile con la norma ‖x‖ <strong>di</strong> un vettore x se vale larelazione‖Ax‖ ≤ ‖A‖‖x‖Alcune norme su matrici sono generate da norme su vettori: si parla allora <strong>di</strong> norma naturale o indottadalla norma <strong>di</strong> vettori. In particolare, se ‖ · ‖ è una norma su vettori in R n , allora ‖A‖ = max ‖x‖=1 ‖Ax‖ è lanorma naturale o indotta dalla norma ‖ · ‖ su vettori.Le norme <strong>di</strong> matrici indotte dalla norma 1 e dalla norma infinito su vettori sono:G Norma 1: ‖A‖ 1 = max j∑ ni=1 |a i j | (data dal massimo sulla somma delle colonne)G Norma infinito: ‖A‖ ∞ = max i∑ nj =1 |a i j | (data dal massimo sulla somma delle righe)La norma <strong>di</strong> matrice indotta dalla norma 2 è più complicata e vedremo in seguito come è definita.È facile vedere che le norme naturali sono norme compatibili con la norma <strong>di</strong> vettori da cui sono costruite.Una norma <strong>di</strong> matrici, che non è indotta, ma compatibile con la norma 2 è la cosiddetta norma euclidea(o <strong>di</strong> Frobenius). Tenendo presente che, data una matrice A, si chiama traccia della matrice o tr (A) la somma<strong>degli</strong> elementi della <strong>di</strong>agonale principale <strong>di</strong> A, la norma euclidea è data daG N (A) = √ tr (A T A) = √ √ ∑ntr (A A T ) =i=1|a i j | 2 .j =18.5 Autovalori e autovettoriData una matrice quadrata A <strong>di</strong> or<strong>di</strong>ne n, se esiste un numero (reale o complesso) λ e un vettore x ≠ 0 talicheAx = λxAutovalore eautovettoreallora λ è un autovalore e x il corrispondente autovettore della matrice A.Scritta in maniera equivalente, la relazione definisce il sistema lineare(A − λI )x = 0Poichè x ≠ 0 e il termine noto del sistema è il vettore <strong>di</strong> tutti zeri, il determinante della matrice del sistemadeve necessariamente essere uguale a zero, cioè det(A − λI ) = 0.Lo sviluppo del determinante porta a un polinomio <strong>di</strong> grado n nell’incognita λ:λ n − tr (A)λ n−1 + ... + (−1) n det A = 0Polinomio Questo polinomio si chiama polinomio caratteristico. Le sue n ra<strong>di</strong>ci, che chiamiamo λ 1 ,λ 2 ,...,λ n , sono glicaratteristico n autovalori della matrice A.Per le proprietà dei polinomi vale:106n∑λ i = tr (A) = a 11 + a 22 + ... + a nni=1en∏λ i = det AAlcune proprietà sugli autovalori e autovettori sono le seguenti:i=1


8.5. Autovalori e autovettoriFigura 8.2: Autovalori e autovettoriG Se λ è autovalore della matrice A, allora λ k è autovalore della matrice potenza A k (cioè A · A ··· A kvolte).G Gli autovalori <strong>di</strong> una matrice A e della sua trasposta A T sono gli stessi (ma gli autovettori sono, ingenere, <strong>di</strong>versi).G Se A e B sono due matrici arbitrarie regolari, allora gli autovalori <strong>di</strong> AB sono gli stessi <strong>di</strong> B A.Se x è un autovettore associato alla matrice A, allora Ax = λx: la matrice A trasforma il vettore x in unvettore le cui componenti sono moltiplicate per λ: se λ > 1, allora A ha l’effetto <strong>di</strong> allungare x <strong>di</strong> un fattore λ;se invece 0 < λ < 1, allora x si restringe <strong>di</strong> un fattore λ; gli effetti sono simili, ma il verso del vettore risultanteAx è opposto, quando λ < 0. I quattro casi che si possono presentare sono illustrati in Figura 8.2.Altre proprietà da tenere presenti sono le seguenti:G Se tutti gli n autovalori <strong>di</strong> una matrice A sono <strong>di</strong>stinti, allora gli n autovettori u (1) , u (2) ,...u (n) sonolinearmente in<strong>di</strong>pendenti 1G Se A è una matrice simmetrica reale definita positiva, allora i suoi autovalori sono tutti reali e positivi.Introduciamo ora il raggio spettrale <strong>di</strong> una matrice A .Definizione 8.5.1 Il raggio spettrale ρ(A) <strong>di</strong> una matrice A è definito daρ(A) = max |λ|λ autovalore <strong>di</strong> AQuin<strong>di</strong> il raggio spettrale è il massimo, in modulo, <strong>degli</strong> autovalori <strong>di</strong> A (ricor<strong>di</strong>amo che se λ è uncomplesso, λ = α + iβ, con i = −1, si ha |λ| = √ α 2 + β 2 ).Possiamo ora definire la norma 2 su matrici indotta dalla norma 2 su vettori. Si può, infatti, provare che√G ‖A‖ 2 = ρ(A T A).Inoltre, per ogni norma naturale, vale il risultatoρ(A) ≤ ‖A‖Nello stu<strong>di</strong>are i meto<strong>di</strong> iterativi per risolvere i sistemi lineari, sarà <strong>di</strong> particolare importanza sapere quandole potenze <strong>di</strong> una matrice tendono alla matrice nulla. Matrici A, per cui (A k ) i j → 0 per k → ∞, qualunquesia i , j = 1,2,...,n, (consideriamo A · A ··· A k volte e gli elementi della matrice risultante tendono a zero perk → ∞) si <strong>di</strong>cono matrici convergenti. Diciamo che una matrice A <strong>di</strong> <strong>di</strong>mensione n è convergente selimk→∞ (Ak ) i j = 0, i , j = 1,2,...,nSi ha il seguente teorema.RaggiospettraleNorma 2 sumatriciMatriceconvergenteTeorema 8.5.1 Data una matrice A <strong>di</strong> <strong>di</strong>mensione n, sono equivalenti le seguenti proposizioni1. A è una matrice convergente.2. lim k→∞ ‖A k ‖ = 0, per qualche norma naturale.3. lim k→∞ ‖A k ‖ = 0, per tutte le norme naturali.4. ρ(A) < 1.5. lim k→∞ A k x = 0, qualunque sia il vettore x.1 Dati n vettori linearmente in<strong>di</strong>pendenti <strong>di</strong> R n , u (1) , u (2) ,...u (n) , ogni vettore <strong>di</strong> R n si può scrivere come una loro combinazionelineare. Quin<strong>di</strong> esistono n coefficienti α 1 ,α 2 ,...,α n per cui x = α 1 u (1) +α 2 u (2) +...+α n u (n) . Inoltre, per vettori linearmente in<strong>di</strong>pendentivale il risultato: α 1 u (1) + α 2 u (2) + ... + α n u (n) = 0 se e solo se tutti i coefficienti α i sono uguali a zero, per i = 1,2,...,n.107


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI8.6 Meto<strong>di</strong> classiciI meto<strong>di</strong> iterativi classici per la risoluzione <strong>di</strong> un sistema <strong>di</strong> equazioni lineari del tipo Ax = b si basano suun’idea molto semplice.G Si parte da un’approssimazione iniziale x (0) , commettendo un’errore e (0) = x − x (0) . L’errore e (0) è soluzionedel sistema Ae (0) = b − Ax (0) = r (0) , dove r (0) è il residuo (ciò che resta fuori, ci <strong>di</strong>ce <strong>di</strong> quanto ilvettore Ax (0) si <strong>di</strong>scosta da b).G Successivamente si definisce il passo x (1) come x (1) = x (0) + p (0) , dove ora p (0) è soluzione del sistemaMp (0) = r 0 , in cui la matrice M sia più semplice della A e, allo stesso tempo, M −1 approssimi in qualchemodo A −1 .G Il proce<strong>di</strong>mento viene iterato fino a convergenza.Da queste richieste tra loro contrad<strong>di</strong>torie, si sviluppa una strategia che ci porta alla soluzione esatta x comelimite della successione dei valori approssimati x (k) .Il processo iterativo si legge, infatti, come:x (k+1) = x (k) + M −1 (b − Ax (k) ) k = 0,1,....O, equivalentemente,x (k+1) = (I − M −1 A)x (k) + M −1 b k = 0,1,...Notiamo che, ad ogni passo, non dobbiamo calcolare esplicitamente M −1 , perchè risolviamo problemi deltipo Mp (k) = r (k) = b − Ax (k) in modo da porre x (k+1) = x (k) + p (k) . La matrice E = I − M −1 A è detta matrice <strong>di</strong>iterazione del metodo. Nel seguito, per semplicità, poniamo q = M −1 b.Lo schema iterativo appena descritto è un metodo stazionario (cioè non <strong>di</strong>pende dall’iterazione k) epuò essere visto come caso particolare <strong>di</strong> uno schema <strong>di</strong> punto fisso per equazioni nonlineari: la funzioneg tale che x (k+1) = g (x (k) ) converga alla soluzione del sistema Ax = b, è data da g (x) = x + M −1 (b − Ax) oequivalentemente da g (x) = Ex (k) + q.8.6.1 ConvergenzaPer stu<strong>di</strong>are la convergenza <strong>di</strong> un metodo iterativo, consideriamo, per ogni vettore x (k) , il residuo r (k) =b − Ax (k) e l’errore e (k) = x − x (k) . Osserviamo che si ha la relazione r (k) = Ae (k) . InfattiAe (k) = A(x − x (k) ) = Ax − Ax (k) = b − Ax (k) = r (k)Lo schema converge quando la successione x (k) converge alla soluzione x per k → ∞, ovvero quandolim k→∞ e (k) = 0 qualunque sia il vettore iniziale x (0) .Consideriamo lo schema iterativo x (k+1) = Ex (k) + q.È facile vedere che per la soluzione esatta x vale la relazione x = Ex + q.Consideriamo x − x (k) . Si hax = Ex + qx (k) = Ex k−1 + qe sottraendo si ricavae (k) = Ee (k−1)La relazione appena trovata vale, alla stessa maniera, tra l’errore e (k−1) e l’errore e (k−2) per cui possiamoscrivere e (k−1) = Ee (k−2) .Scriviamo queste relazioni dall’iterazione k fino ad arrivare all’iterazione 0.108


8.6. Meto<strong>di</strong> classicie (k) = Ee (k−1)e (k−1) = Ee (k−2)e (k−2) = Ee (k−3). = . . .e (2) = Ee (1)e (1) = Ee (0)Partendo, ora, dalla prima relazione e, andando a sostituire, ogni volta, a secondo membro, la relazionesuccessiva, si ha:e (k) = Ee (k−1) = E(Ee (k−2) ) = E 2 e (k−2) = E 2 (Ee (k−3) ) = E 3 e (k−3) = ... = E k e (0)Osserviamo che E k rappresenta la potenza k della matrice E, cioè la E · E ···E k volte.Il metodo converge se e (k) → 0 per k → ∞. Poichè l’errore iniziale è arbitrario, si ha che lim k→∞ e (k) =lim k→∞ E k e (0) = 0 se e solo se lim k→∞ E k = 0.Per il teorema sulla convergenza <strong>di</strong> matrici (si veda pag. 107), questo si ha se e solo se ρ(E) < 1. Si puòdunque stabilire il seguente teorema.Teorema 8.6.1 Lo schema iterativox (k+1) = Ex (k) + q k ≥ 0converge qualunque sia il vettore iniziale x 0 al vettore x = Ex + q = A −1 b se e solo se ρ(E) < 1.Questo risultato lo si può provare facilmente, nel caso in cui la matrice <strong>di</strong> iterazione E abbia n autovalori<strong>di</strong>stinti e, quin<strong>di</strong>, possieda n autovettori linearmente in<strong>di</strong>pendenti, per cui l’errore iniziale e (0) si può scriverecome e (0) = α 1 u (1) + α 2 u (2) + ... + α n u (n) , dove α 1 ,α 2 ,...,α n sono delle costanti, mentre u (1) , u (2) ...u (n) sonogli autovettori associati, rispettivamente, a λ 1 , λ 2 ,...,λ n . Supponiamo che gli autovalori siano in or<strong>di</strong>ne decrescentein modulo, cioè: |λ 1 | > |λ 2 | > ... > |λ n |, per cui ρ(E) = |λ 1 |. In tal caso si può scrivere (ricordandoche, se λ è un autovalore associato alla matrice A, con u un autovettore ad esso associato, si ha A k u = λ k u)e (k) = E k e (0) = E k (α 1 u (1) + α 2 u (2) + ... + α n u (n) )= α 1 E k u (1) + α 2 E k u (2) + ... + α n E k u (n)= α 1 λ k 1 u(1) + α 2 λ k 2 u(2) + ... + α n λ k n u(n)mettiamo in evidenza λ k 1(= λ k 1α 1 u (1) + α 2λ k 2λ k 1)u (2) λ k n+ ... + α nλ k u (n)1per k → ∞ si ha λk iλ k → 0 per i = 2,3,...,n1≈ λ k 1 α 1u (1)Perciò lim k→∞ e (k) = lim k→∞ λ k 1 α 1u (1) = 0 se e solo se λ k 1 → 0 e questo si ha se e solo se |λ 1| < 0. Ma |λ 1 | = ρ(E):ritroviamo il risultato visto prima.109


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARI8.6.2 Controllo della convergenzaOltre a sapere che lo schema iterativo converge, è importante conoscere quanto velocemente lo schemaconverge. A tal proposito osserviamo che, in con<strong>di</strong>zioni asintotiche (per k → +∞) vale il seguente risultato 2‖e (k) ‖ ≈ ρ(E) k ‖e (0) ‖ (8.1)Scrivendo l’equazione (8.1) per l’iterazione k − 1 e facendo il rapporto tra le norme <strong>degli</strong> errori a due passisuccessivi si ha:‖e (k) ‖‖e (k−1) ‖ ≈ ρ(E)Ricaviamo, quin<strong>di</strong>, che il metodo iterativo ha convergenza lineare con costante asintotica uguale al raggiospettrale della matrice <strong>di</strong> iterazione.Ci chie<strong>di</strong>amo se è possibile stabilire a priori quante iterazioni occorrono per ridurre la norma dell’erroreiniziale <strong>di</strong> un certo fattore, ad esempio 10 (il che vuol <strong>di</strong>re ridurre l’errore <strong>di</strong> un or<strong>di</strong>ne <strong>di</strong> grandezza). Vogliamodunque capire quale deve essere il valore <strong>di</strong> k per cui ‖e (k) ‖ = ‖e(0) ‖10 . Ma ‖e(k) ‖ ≈ ρ(E) k ‖e (0) ‖ da cui‖e (0) ‖10 ≈ ρ(E)k ‖e (0) ‖ =⇒ 110 ≈ ρ(E)kApplicando il logaritmo in base 10 ad ambo i membri si ha1−1 ≈ k log 10 (ρ(E)) =⇒ k ≈ −log 10 (ρ(E))Velocitàasintotica <strong>di</strong>convergenzacioè occorrono k iterazioni con k dato dal più piccolo intero che sod<strong>di</strong>sfa la relazione appena scritta. Menoiterazioni occorrono fare, più veloce è il metodo.Si definisce perciò velocità asintotica <strong>di</strong> convergenzaR = −log 10 (ρ(E)) = −log 10 (ρ(E k ))kOsserviamo che, essendo ρ(E) < 1, nelle ipotesi in cui il metodo converge, log 10 (ρ(E)) < 0 e, <strong>di</strong> conseguenza,R > 0. Se vogliamo ridurre l’errore iniziale <strong>di</strong> una certa quantità ɛ, rifacendo i conti come prima, da una partevogliamo che sia ‖e (k) ‖ ≤ ɛ‖e (0) ‖, dall’altra sappiamo che ‖e (k) ‖ ≈ ρ(E) k ‖e (0) ‖. Uguagliando i termini abbiamoρ(E) k ‖e (0) ‖ ≤ ɛ‖e (0) ‖ =⇒ ρ(E) k ≤ ɛPassando ai logaritmi (<strong>di</strong> quantità minori <strong>di</strong> uno) si hak log 10 (ρ(E)) ≤ log 10 (ɛ) =⇒ −k log 10 (ρ(E)) ≥ −log 10 (ɛ) =⇒ k ≥ −log 10 (ɛ)RTroviamo in questo modo quante iterazioni (il primo intero k che verifica la relazione precedente) occorrefare per poter ridurre l’errore iniziale <strong>di</strong> ɛ.Se si traccia un grafico semilogaritmico del profilo <strong>di</strong> convergenza dello schema iterativo, ponendo sull’assedelle ascisse il numero delle iterazioni e sull’asse delle or<strong>di</strong>nate la norma dell’errore, si può vedere chela velocità asintotica <strong>di</strong> convergenza è legata alla pendenza della retta. Infatti, riconducendoci, per semplicità,al caso in cui la matrice <strong>di</strong> iterazione abbia n autovalori <strong>di</strong>stinti tra loro e or<strong>di</strong>nati in senso crescente, dallarelazione (vista a pag. 109)e (k) ≈ λ k 1 α 1u (1)2 Questa relazione vale anche per matrici con autovalori non <strong>di</strong>stinti tra loro.110


8.6. Meto<strong>di</strong> classiciFigura 8.3: La matrice A come somma delle matrici L, D e U .passando alle norme e ai logaritmi in base 10 si halog 10 ‖e (k) ‖ ≈ k log 10 |λ 1 | + costanteLa pendenza del grafico è l’opposto della velocità asintotica <strong>di</strong> convergenza R.Nel caso in cui non è nota la soluzione esatta x, poichè ‖e (k) ‖ ≈ ‖x (k) − x (k−1) ‖ = ‖d (k) ‖ (valgono le stesseconsiderazioni viste per gli schemi iterativi per funzioni non lineari a pag. 53), ritroviamo lo stesso risultatosul profilo <strong>di</strong> convergenza semilogaritmico in cui si pone sull’asse delle ascisse il numero delle iterazioni esull’asse delle or<strong>di</strong>nate la norma <strong>degli</strong> scarti.8.6.3 I meto<strong>di</strong>Si scriva la matrice A come somma della matrice che ha i soli elementi <strong>di</strong>agonali <strong>di</strong> A (che chiamiamoD), della matrice costituita dai soli elementi della parte triangolare bassa <strong>di</strong> A (che chiamiamo L) e dai solielementi della parte triangolare alta <strong>di</strong> A (che denotiamo con U ),A = L + D +UIn questo modo è facile ricavare i meto<strong>di</strong> iterativi <strong>di</strong> Jacobi, Gauss-Seidel e <strong>di</strong> rilassamento, che sono i meto<strong>di</strong>iterativi classici per la soluzione <strong>di</strong> sistemi lineari.Il metodo <strong>di</strong> JacobiIl metodo <strong>di</strong> Jacobi 3 (o <strong>degli</strong> spostamenti simultanei - o rilassamento simultaneo) si ha ponendo M = Dda cui la matrice <strong>di</strong> iterazione <strong>di</strong>venta E J = I − D −1 A = I − D −1 (L + D +U ) = −D −1 (L +U ).Scrivendo lo schema iterativo per Jacobi, si ha, in forma matriciale:x (k+1) = E J x (k) + D −1 bx (k+1) = −D −1 (L +U )x (k) + D −1 bComponente per componente, lo stesso metodo si scrive, per i = 1,2,...,n, comex (k+1)i=(D −1 ) i i1a i i⇑o, equivalentemente,⎡⎢⎣ b i −((L+U )x (k) ) in∑j =1,j ≠i⇑⎤a i j x (k)⎥j ⎦3 Carl Gustav Jacob Jacobi (1804-1851) fu un grande matematico tedesco. Tra i suoi numerosi stu<strong>di</strong> ricor<strong>di</strong>amo quelli sulle funzioniellittiche, sulla teoria dei numeri e sulla meccanica celeste.111


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARIx (k+1)i=(D −1 ) i i1a i i⇑⎡⎢⎣ b i −(Lx (k) ) ii−1∑j =1a i j x (k)j⇑−n∑(U x (k) ) ij =i+1⇑⎤a i j x (k)⎥j ⎦per i = 1,...,nLa formula la si può ricavare <strong>di</strong>rettamente, scrivendo, equazione per equazione, il sistema da risolvereAx = b:a 11 x 1 + a 12 x 2 + a 13 x 3 + ... + a 1n x n = b 1a 21 x 1 + a 22 x 2 + a 23 x 3 + ... + a 2n x n = b 2. = . . .a i 1 x 1 + a i 2 x 2 + a i 3 x 3 + ... + a i n x n = b i. = . . .a n1 x 1 + a n2 x 2 + a n3 x 3 + ... + a nn x n = b nDalla prima equazione “isoliamo” la prima incognita rispetto a tutte le altre; dalla seconda equazione“isoliamo” la seconda incognita e così via per le altre equazioni, ottenendo:a 11 x 1 = b 1 − (a 12 x 2 + a 13 x 3 + ... + a 1n x n )a 22 x 2 = b 2 − (a 21 x 1 + a 23 x 3 + ... + a 2n x n ). = . . .a i i x i = b i − (a i 1 x 1 + a i 2 x 2 + ... + a i i−1 x i−1 + a i i+1 x i+1 + ... + a i n x n ). = . . .a nn x n = b n − (a n1 x 1 + a n2 x 2 + a n3 x 3 + ... + a nn−1 x n−1 )Dividendo l’i -sima equazione per il coefficiente a i i , per i = 1,2,...,n, ricaviamox 1 = 1 [b 1 − (a 12 x 2 + a 13 x 3 + ... + a 1n x n )]a 11x 2 = 1 [b 2 − (a 21 x 1 + a 23 x 3 + ... + a 2n x n )]a 22 . = . .x i = 1 [b i − (a i 1 x 1 + a i 2 x 2 + ... + a i i−1 x i−1 + a i i+1 x i+1 + ... + a i n x n )]a i i . = . .x n = 1a nn[b n − (a n1 x 1 + a n2 x 2 + a n3 x 3 + ... + a nn−1 x n−1 )]Se pensiamo <strong>di</strong> partire da un vettore inziale x (0) , il vettore x (1) si ottiene dalle equazioni precedenti, ponendoa secondo membro <strong>di</strong> ciascuna equazione le componenti del vettore x (0) . Si ricava, in tal modo, laformula ricorsiva dello schema <strong>di</strong> Jacobi:112


8.6. Meto<strong>di</strong> classicix (k+1)1= 1 [ ()]b 1 − a 12 x (k)2+ a 13 x (k)3+ ... + a 1n x n(k)a 11)]x (k+1)2= 1a 22[b 2 −. = . . .x (k+1)i= 1a i i[b i −. = . . .x (k+1)n = 1a nn[b n −(a 21 x (k)1+ a 23 x (k)3+ ... + a 2n x n(k)()]a i 1 x (k)1+ a i 2 x (k)2+ ... + a i i−1 x (k)i−1 + a i i+1x (k)i+1 + ... + a i n x n(k)()]a n1 x (k)1+ a n2 x (k)2+ a n3 x (k)3+ ... + a nn−1 x (k)n−1Ritroviamo, dunque, la formula scritta prima in forma compatta.La formula in funzione del residuo r (k) = b − Ax (k) è data invece da x (k+1) = x (k) + D −1 r (k) .Il Metodo <strong>di</strong> Gauss-SeidelNell’algoritmo <strong>di</strong> Gauss-Seidel 4 si pone M = D + L ottenendo la matrice E S = I − (D + L) −1 A = I − (D +L) −1 (L + D +U ) = −(D + L) −1 U . Lo schema iterativo è:x (k+1) = E S x (k) + (D + L) −1 bMoltiplicando ambo i membri per (D + L) si hada cui(D + L)x (k+1) = b −U x (k)Dx (k+1) = b − Lx (k+1) −U x (k)x (k+1) = D −1 ( b − Lx (k+1) −U x (k))Componente per componente si ha[x (k+1) = 1ia i ii−1 ∑b i −j =1a i j x (k+1)j−n∑j =i+1a i j x (k)j]per i = 1,...,nIl metodo è detto anche <strong>degli</strong> spostamenti successivi, in quanto il calcolo delle componenti del vettorex (k+1) è fatto utilizzando le componenti già calcolate del vettore stesso. Infatti, per i > 1, è ragionevole pensareche i valori già calcolati x (k+1)1, x (k+1)2,..., x (k+1) possano essere utilizzati per dare una migliore approssimazionedel valore x (k+1) . Dalle equazioni del sistema, ragionando come per il metodo <strong>di</strong> Jacobi, possiamo quin<strong>di</strong>i−1i4 Philipp Ludwig von Seidel (1821-1896) fu un matematico tedesco. Il suo lavoro più importante riguarda le aberrazioni ottiche.113


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARIscrivere:()a 11 x (k+1)1= b 1 − a 12 x (k)2+ a 13 x (k)3+ ... + a 1n x n(k)()a 22 x (k+1)2= b 2 − a 21 x (k+1)1+ a 23 x (k)3+ ... + a 2n x n(k). = . . .a i i x (k+1) = bii −. = . . .a nn x n(k+1) = b n −(a i 1 x (k+1)1+ a i 2 x (k+1)2+ ... + a i i−1 x (k+1)i−1)+ a i i+1 x (k)i+1 + ... + a i n x n(k)()a n1 x (k+1)1+ a n2 x (k+1)2+ a n3 x (k+1)3+ ... + a nn−1 x (k+1)n−1Dividendo ambo i membri dell’equazione i -sima per a i i (per i = 1,2,...,n) si ha:x (k+1)1= 1 [ ()]b 1 − a 12 x (k)2+ a 13 x (k)3+ ... + a 1n x n(k)a 11x (k+1)2= 1a 22[b 2 −. = . . .x (k+1)i= 1a i i[b i −. = . . .x (k+1)n = 1a nn[b n −(a 21 x (k+1)1+ a 23 x (k)3+ ... + a 2n x n(k)(a i 1 x (k+1)1+ a i 2 x (k+1))]2+ ... a i i−1 x (k+1)i−1)]+ a i i+1 x (k)i+1 + ... + a i n x n(k)()]a n1 x (k+1)1+ a n2 x (k+1)2+ a n3 x (k+1)3+ ... + a nn−1 x (k+1)n−1Usando il residuo, lo schema <strong>di</strong> Gauss-Seidel si scrive comex (k+1) = x (k) + (D + L) −1 r (k)Il metodo <strong>di</strong> rilassamentoCiascuno dei meto<strong>di</strong> <strong>di</strong> Jacobi e Gauss-Seidel può essere anche rilassato tramite un fattore ω scrivendox (k+1) = x (k) + ω(x (k+1)nonr i l − x(k) ) o, in maniera del tutto equivalente, x (k+1) = ωx (k+1)nonr i l + (1 − ω)x(k) , dove x (k+1)nonr i lè l’approssimazione del vettore x ottenuta tramite il metodo <strong>di</strong> Jacobi o <strong>di</strong> Gauss-Seidel.A <strong>di</strong>fferenza del metodo <strong>di</strong> Jacobi rilassato, che non produce effettivi miglioramenti rispetto al metodonon rilassato, il metodo <strong>di</strong> Gauss-Seidel rilassato può produrre un metodo molto più veloce in termini <strong>di</strong>convergenza e, quin<strong>di</strong>, preferibile rispetto al metodo senza rilassamento. Come metodo <strong>di</strong> rilassamento,dunque, consideriamo il metodo <strong>di</strong> rilassamento ottenuto da Gauss-Seidel. Per scelte <strong>di</strong> ω nell’intervallo]0,1[ si parla <strong>di</strong> metodo Sotto-Rilassato, o Under-Relaxation (e in genere è usato per ottenere convergenzanella soluzione <strong>di</strong> sistemi che non convergono con il metodo <strong>di</strong> Gauss-Seidel). Per valori <strong>di</strong> ω nell’intervallo[1,2[ si ha, invece, il metodo noto come metodo <strong>di</strong> sovra-rilassamento o SOR (Successive Over-Relaxation) –usato per accelerare la convergenza in sistemi che sono convergenti con il metodo <strong>di</strong> Gauss-Seidel.Lo schema <strong>di</strong> rilassamento, è dato dax (k+1) = (1 − ω)x (k)i+ ω i−1 ∑[bi i −a i ij =1a i j x (k+1)j−n∑j =i+1a i j x (k)j]per i = 1,...,n114


8.6. Meto<strong>di</strong> classiciLa matrice <strong>di</strong> iterazione del metodo <strong>di</strong> rilassamento si ricava scrivendo in forma matriciale l’algoritmoappena descrittox (k+1) = (1 − ω)x (k) + ωD −1 ( b − Lx (k+1) −U x (k))x (k+1) = [ (1 − ω)I − ωD −1 U ] x (k) − ωD −1 Lx (k+1) + ωD −1 b(I + ωD −1 L)x (k+1) = [ (1 − ω)I − ωD −1 U ] x (k) + ωD −1 bMoltiplicando ambo i membri per D, si ricavaLa matrice <strong>di</strong> iterazione del metodo è dunqueE = (D + ωL) −1 [(1 − ω)D − ωU ]E = (D + ωL) −1 [(1 − ω)D − ω(A − D − L)]E = (D + ωL) −1 [(D + ωL) − ωA]E = [ I − ω(D + ωL) −1 A ](D + ωL)x (k+1) = [(1 − ω)D − ωU ] x (k) + ωbA questo punto, ci si può chiedere quale sia l’ω ottimale nel metodo <strong>di</strong> rilassamento. L’ω ottimale è quelloche fa sì che il metodo <strong>di</strong> rilassamento converga nel minor numero <strong>di</strong> iterazioni (quin<strong>di</strong>, l’ω ottimale rendeminimo il raggio spettrale della matrice <strong>di</strong> iterazione). Vedremo, per particolari matrici A, quando è possibilestabilire a priori quale sia l’ω ottimale per risolvere il sistema lineare Ax = b.8.6.4 Convergenza dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamentoLe matrici <strong>di</strong> iterazione dei tre meto<strong>di</strong> appena descritti sono scritte in Tabella 8.6.4 Perchè ci siametodo matriceJacobi E J = I − D −1 A = −D −1 (L +U )Gauss-Seidel E S = I − (D + L) −1 A = −(D + L) −1 Urilassamento E ω = I − ω(D + ωL) −1 ATabella 8.1: Matrici <strong>di</strong> iterazione dei meto<strong>di</strong> <strong>di</strong> Jacobi, Gauss-Seidel, rilassamentoconvergenza, il raggio spettrale della matrice <strong>di</strong> iterazione deve essere minore <strong>di</strong> uno.Per i meto<strong>di</strong> <strong>di</strong> Jacobi e <strong>di</strong> Gauss-Seidel si può provare la convergenza del metodo, se la matrice A ha unadelle seguenti caratteristiche:G A è <strong>di</strong>agonalmente dominante in senso strettoG A è a <strong>di</strong>agonalmente dominante (per righe o per colonne) ed è irriducibile 5 .Si ha inoltre, questo risultato:G se A è simmetrica non singolare con elementi principali reali e positivi, allora il metodo <strong>di</strong> Gauss-Seidelè convergente se e solo se A è definita positiva.Per quanto riguarda il metodo <strong>di</strong> rilassamento, con<strong>di</strong>zione necessaria per la convergenza è |ω − 1| < 1, cioèω deve appartenere all’intervallo [0,2] ( per 0 < ω < 1 si ha sotto-rilassamento e per 1 ≤ ω < 2 si ha sovrarilassamento).( )5 P Qcioè non può essere messa sotto la forma R115


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARIDifatti il determinante della matrice <strong>di</strong> iterazione del metodo <strong>di</strong> rilassamento vale 6 detE ω = (1 − ω) n e,poichè il prodotto <strong>degli</strong> autovalori <strong>di</strong> una matrice è uguale al determinante della matrice stessa, segue 7 cheil raggio spettrale della matrice sarà maggiore o uguale a |1 − ω| Quin<strong>di</strong>, se |1 − ω| > 1, sicuramente il metodo<strong>di</strong> rilassamento non convergerà. Perciò, con<strong>di</strong>zione necessaria per la convergenza è |1 − ω| < 1.Si ha questo importante teorema.Teorema 8.6.2 (Ostrowski-Reich) Se A è definita positiva e ω è un numero reale nell’intervallo ]0,2[, allora ilmetodo <strong>di</strong> rilassamento è convergente.G La convergenza del metodo <strong>di</strong> rilassamento si ha, inoltre, per A simmetrica con elementi <strong>di</strong>agonalipositivi ed elementi extra-<strong>di</strong>agonali negativi o nulli, se e solo se A è definita positiva.Un altro interessante teorema mette in relazione il metodo <strong>di</strong> rilassamento con i meto<strong>di</strong> <strong>di</strong> Jacobi e <strong>di</strong> Gauss-Seidel, sia per quanto riguarda la convergenza, sia per quanto riguarda il valore ottimale del parametro ω, incorrispondenza <strong>di</strong> matrici A che godono della cosidetta proprietà A e che siano coerentemente or<strong>di</strong>nate.Definizione 8.6.1 Una matrice A, <strong>di</strong> <strong>di</strong>mensione n, si <strong>di</strong>ce che ha proprietà A se esiste una matrice <strong>di</strong>permutazione P tale che la matrice PAP T abbia la forma( )PAP T D1 A 1=A 2 D 2dove D 1 e D 2 sono matrici <strong>di</strong>agonali.Una matrice con proprietà A si <strong>di</strong>ce biciclica.Equivalentemente, una matrice A, <strong>di</strong> <strong>di</strong>mensione n, ha proprietà A se l’insieme dei numeri naturali{1,2,...,n} può essere scomposto in due sottoinsiemi non vuoti e complementari 8 S e T in modo tale chei coefficienti non nulli a i j ≠ 0 si hanno per i = j oppure per i ∈ S e j ∈ T oppure per i ∈ T e j ∈ S.Esempio 8.6.1 La matrice tri<strong>di</strong>agonale⎛⎞2 −1 0 0A = ⎜−1 2 −1 0⎟⎝ 0 −1 2 −1⎠0 0 −1 2ha proprietà A (o è biciclica): permutando la prima e quarta riga e la prima e quarta colonna, me<strong>di</strong>ante la⎛⎞0 0 0 1matrice <strong>di</strong> permutazione P = ⎜0 1 0 0⎟⎝0 0 1 0⎠ si ha1 0 0 0⎛⎞2 0 −1 0( )PAP T = ⎜ 0 2 −1 −1⎟2 0⎝−1 −1 2 0 ⎠ =⇒ D 1 = D 2 =0 20 −1 0 2Possiamo scegliere S = {1,3} e T = {2,4}.6 Dalla definizione <strong>di</strong> E ω si ha detE ω = det[(D + ωL) −1 ((1 − ω)D − ωU )]. Poichè il determinante del prodotto <strong>di</strong> due matrici è ugualeal prodotto dei determinanti delle matrici stesse, si ha detE ω = det[(D + ωL) −1 ]det[(1 − ω)D − ωU )] = detD −1 (1 − ω) n detD. Si arrivaa questo risultato, tenendo presente il fatto che il determinante <strong>di</strong> una matrice triangolare è uguale al prodotto <strong>degli</strong> elementi della<strong>di</strong>agonale principale.7 Infatti, considerando λ i autovalore della matrice E ω , per i = 1,2,...,n e ρ(E ω ) il raggio spettrale, si ha detE ω = ∏ ni=1 λ i ≤∏ ni=1 ρ(E ω) = ρ(E ω ) n da cui segue (1 − ω) n ≤ ρ(E ω ) n , cioè ρ(E ω ) ≥ (1 − ω).8 Due insiemi S e T non vuoti si <strong>di</strong>cono complementari <strong>di</strong> V = {1,2,...,n} se S ≠ , T ≠ , S ∪ T = V e, inoltre, se i ∈ S,i ∉ T e,viceversa, se j ∈ T, j ∉ S116


8.7. <strong>Esercizi</strong>Definizione 8.6.2 Una matrice si <strong>di</strong>ce coerentemente or<strong>di</strong>nata in relazione ad un vettore <strong>di</strong> or<strong>di</strong>namento q, <strong>di</strong>lunghezza n, se per ogni coefficiente a i j non nullo, con i ≠ j , si verifica:G se j > i allora q j − q i = 1G se j < i allora q j − q i = −1Un’altra definizione <strong>di</strong> matrice con coerente or<strong>di</strong>namento considera la matrice A data non dalla scomposizioneA = L + D +U che abbiamo visto fino ad ora ma come A = D(L A + I +U A ), (osserviamo che, rispettoalla prima scomposizione, abbiamo messo in evidenza la matrice <strong>di</strong>agonale D e quin<strong>di</strong> le matrici triangolarisuperiore e inferiore sono L A = D −1 L e U A = D −1 U ). Sia D non singolare. Allora la matrice A è dettacoerentemente or<strong>di</strong>nata se gli autovalori della matrice J(α) = αL A + α −1 U A , con α ≠ 0 sono in<strong>di</strong>pendenti dalparametro α.( )D1 A 1Le matrici con proprietà A (o bicicliche) nella forma A =(P = I nella definizione <strong>di</strong> proprietàA 2 D 2A) sono coerentemente or<strong>di</strong>nate.Le matrici tri<strong>di</strong>agonali sono un esempio <strong>di</strong> matrici bicicliche e coerentemente or<strong>di</strong>nate.Per il metodo <strong>di</strong> rilassamento si può provare il seguente risultato.Teorema 8.6.3 (Young) Se A è una matrice con proprietà A e coerente or<strong>di</strong>namento e 0 < ω < 2, allora:G se µ è autovalore <strong>di</strong> E J , ogni λ che verifica la relazione (λ + ω − 1) 2 = λω 2 µ 2 è autovalore <strong>di</strong> E ωG se λ è autovalore non nullo <strong>di</strong> E ω , allora ogni µ che verifica la relazione precedente è autovalore <strong>di</strong> E JG se gli autovalori <strong>di</strong> E J sono reali e il metodo <strong>di</strong> Jacobi converge (ρ(E J ) < 1), esiste uno ed uno solo ω optche rende ottimale il metodo <strong>di</strong> rilassamento, tale cioè che ρ(ω opt ) = min 0


8. METODI ITERATIVI PER LA SOLUZIONE DI SISTEMI LINEARIQuin<strong>di</strong> se proviamo che lo schema <strong>di</strong> Jacobi converge, cioè che l’autovalore <strong>di</strong> massimo modulo dellamatrice <strong>di</strong> Jacobi è reale e in modulo minore <strong>di</strong> 1, allora, poichè per matrici bicicliche e coerentementeor<strong>di</strong>nate vale µ 2 = λ, dove λ è l’autovalore <strong>di</strong> massimo modulo della matrice <strong>di</strong> Gauss-Seidel, alloraanche il metodo <strong>di</strong> Gauss-Seidel convergerà alla soluzione (da µ < 1 segue µ 2 < 1). La matrice <strong>di</strong> Jacobiè E J = I − D −1 A cioè⎛⎞ ⎛⎞0 −2/8 −6/8 0 −1/4 −3/4E J = ⎝det(E J − µI ) = 0.−7/5 0 0−1/5 0 0⎠ = ⎝−7/5 0 0−1/5 0 0−µ −1/4 −3/4−7/5 −µ 0∣−1/5 0 −µ ∣ = −µ3 + 3 4 · 15 µ + 1 4 · 75 µ = 0Si ha: 0 = det(E J − µI ) = −µ 3 + ( 320 + 720 )µ,Una ra<strong>di</strong>ce è µ = 0, e le altre due sono µ = ± 1/2 = ± 0.5 = 0.707106781.Gli autovalori sono tutti reali e quello <strong>di</strong> massimo modulo è µ = 0.707106781 < 1.C’è, dunque, convergenza per i meto<strong>di</strong> <strong>di</strong> Jacobi e <strong>di</strong> Gauss-Seidel (λ = µ 2 = 0.5). Le velocità <strong>di</strong>convergenza valgonoR J = −log 10 (µ) = 0.1505149R S = −log 10 (λ) = 0.301029995 = −log 10 (µ 2 ) = 2R J⎠(b)Lo schema <strong>di</strong> Jacobi è:⎧x (k+1)1= 1 (30 − 2x(k)2− 6x (k)38 )⎪⎨⎪⎩3= 1 2 1.0 1.55 0.65(7 − x(k)15 Partendo dal vettore x (0) con componentitutte nulle, abbiamok x 1 (k)x 2 (k)x 3 (k)0 0 0 01 3.75 6.8 1.4x (k+1)2= 1 (34 − 7x(k)15 )x (k+1)Lo schema <strong>di</strong> Seidel è:⎧⎪⎨⎪⎩x (k+1)1= 1 (30 − 2x(k)2− 6x (k)38 )x (k+1)2= 1 (34 − 7x(k+1)1)5x (k+1)3= 1 5(7 − x(k+1)1)Partendo dal vettore x (0) con componentitutte nulle, abbiamok x (k)1x (k)2x (k)30 0 0 01 3.75 1.55 0.652 2.875 2.775 0.825<strong>Esercizi</strong>o 8.7.2 ⎛ Dato⎞il sistema Ax = b con5 0 10A = ⎝0 3 15⎠2 1 α(a) <strong>di</strong>re per quali valori <strong>di</strong> α il metodo <strong>di</strong> Jacobi converge.(b) trovare il valore <strong>di</strong> α in corrispondenza del quale il metodo SOR ha un valore <strong>di</strong> omega ottimo ω opt =3/2. Per tale valore trovare la velocità asintotica <strong>di</strong> convergenza del metodo SOR.118


8.7. <strong>Esercizi</strong>Svolgimento(a) La matrice <strong>di</strong>pende dal parametro α quin<strong>di</strong> a priori non possiamo <strong>di</strong>re se Jacobi converge o meno.Scriviamo la matrice <strong>di</strong> iterazione del metodo <strong>di</strong> Jacobi come⎛⎞⎛⎞ ⎛⎞1/5 0 0 0 0 10 0 0 −2E J = −D −1 (L +U ) = −⎝0 1/3 0 ⎠⎝0 0 15⎠ = ⎝ 0 0 −5⎠0 0 1/α 2 1 0 −2/α −1/α 0Gli autovalori si calcolano imponendo det(E J − µI ) = 0, vale a <strong>di</strong>re−µ 0 −20 −µ −5∣−2/α −1/α −µ ∣ = 0 vale a <strong>di</strong>re − µ3 + 9µ α = 0Ricaviamo gli autovalori µ = 0 e µ = ± 3 α.Perchè ci sia convergenza deve dunque essere 3 α< 1 ovvero 3 < α. Ricaviamo la relazione α > 9.(b) Dalla relazione dell’ω opt , ω opt =or<strong>di</strong>nata, si ha:√21+ 1−µ 2 J, valida perchè la matrice è biciclica e coerentemente21 + 1 − 9/α = 3 2 =⇒ 1 3 = 1 − 9/α =⇒ −89 = − 9 α =⇒ α = 81 8 = 10.125Da ω opt = 3 2 = 1.5 segue λ opt = ω opt − 1 = 0.5, da cui R = −log 10 (λ opt ) = 0.3010299957.119


C A P I T O L O9INTEGRAZIONE NUMERICADio non si preoccupa delle nostre<strong>di</strong>fficoltà matematiche. Lui integraempiricamente.Albert Einstein9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1219.2 Formula dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1229.3 Formule <strong>di</strong> Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1239.3.1 Formula <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1259.3.2 Sull’errore della formula <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . . . . . . . . 1279.4 Formule composte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1289.4.1 Formula composta dei trapezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1289.4.2 Confronti tra la formula dei trapezi e <strong>di</strong> Cavalieri-Simpson . . . . . . . . . . . . . . . . . . 1329.5 Estrapolazione <strong>di</strong> Richardson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1349.6 Approssimazione <strong>di</strong> Romberg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1359.7 Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369.7.1 Proprietà delle formule <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1389.7.2 Formule <strong>di</strong> Gauss-Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1399.7.3 Altre formule <strong>di</strong> Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1399.7.4 Applicazione delle formule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1409.7.5 Sulla funzione peso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1419.8 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1419.1 IntroduzioneUn’automobile effettua il giro <strong>di</strong> una pista in 84 secon<strong>di</strong>. La velocità dell’auto viene misurata ogni 6 secon<strong>di</strong>usando un’apparecchiatura radar per il controllo della velocità, e si hanno i valori messi in Tabella 9.1In base ai dati in possesso, quanto è lunga la pista?Sapendo che la velocità v si può scrivere come v(t) = d s (dove s rappresenta lo spostamento e t il tempo),d tper calcolare la lunghezza della pista (lo spostamento effettuato dall’auto), dobbiamo integrare tra il tempo121


9. INTEGRAZIONE NUMERICATempo 0 6 12 18 24 30 36 42 48 54 60 66 72 78 84Velocità 38 41 45 48 45 41 37 33 30 26 24 27 32 35 37Tabella 9.1: Dati della velocità misurati ogni 6 secon<strong>di</strong>. Il tempo è espresso in secon<strong>di</strong> e la velocità è data inmetri al secondo.iniziale e quello finale la velocità.∫ 840∫ s(84)∫d s s(84)v(t)d t =s(0) d t d t = d ss(0)Essendo s(0) = 0 e s(84) = L la lunghezza della pista, si ha∫ 840v(t)d t =∫ s(84)s(0)d s = LQuin<strong>di</strong>, se riusciamo a risolvere l’integrale in cui la funzione integranda è la velocità, per le uguaglianzedate, sapremo <strong>di</strong>re quanto vale L, essendo∫ 840v(t)d t = LSfruttando i dati della velocità misurati ogni 6 secon<strong>di</strong>, dobbiamo essere in grado <strong>di</strong> poter risolverenumericamente questo integrale.In questo Capitolo stu<strong>di</strong>eremo come fare. Ci occuperemo, infatti, <strong>di</strong> approssimare l’integrale definito∫ bI = f (x)d xadove f è una funzione definita nell’intervallo [a,b] (e f può essere nota oppure data su determinati puntidell’intervallo, come nell’esempio appena visto).Una formula <strong>di</strong> integrazione numerica (detta anche formula <strong>di</strong> quadratura numerica) approssimal’integrale esatto I = ∫ ba f (x)d x me<strong>di</strong>ante ∑ nj =0 a j f (x j ):∫ bI =af (x)d x ≈n∑a j f (x j )j =0dove x j , j = 0,...,n sono le ascisse o punti <strong>di</strong> appoggio della formula <strong>di</strong> quadratura e a j sono i pesi dellaformula.9.2 Formula dei trapeziConsideriamo la retta che interpola la f negli estremi dell’intervallo <strong>di</strong> integrazione.seguiamo l’approccio <strong>di</strong> interpolazione me<strong>di</strong>ante la tabella delle <strong>di</strong>fferenze <strong>di</strong>vise:Per semplicità,abf (a)f (b)f (b) − f (a)Il polinomio <strong>di</strong> interpolazione (retta) che interpola la f in a e in b (gli estremi dell’intervallo <strong>di</strong> integrazione)è dato daf (b) − f (a)p(x) = f (a) + (x − a)b − ab − a122


9.3. Formule <strong>di</strong> Newton-CotesL’errore <strong>di</strong> interpolazione, utilizzando l’espressione del resto <strong>di</strong> Lagrange è dato daE(x) = f ′′ (ξ x )(x − a)(x − b)2dove ξ x è un punto dell’intervallo [a,b]. Per quanto abbiamo stu<strong>di</strong>ato sull’interpolazione, sappiamo che lafunzione f (x) si può scrivere come somma del polinomio e dell’errore: f (x) = p(x) + E(x). Nel nostro caso,abbiamof (b) − f (a)f (x) = f (a) + (x − a) + f ′′ (ξ x )(x − a)(x − b)b − a2Dovendo integrare la f tra a e b e valendo l’uguaglianza precedente, integrando ambo i membri,otteniamo:∫ b∫ b() ∫f (b) − f (a)bf (x)d x = f (a) + (x − a) d x + (x − a)(x − b) f ′′ (ξ x )d xb − a2aovvero∫ baaf (a) + f (b)f (x)d x = (b − a) + 1 2 2∫ baa(x − a)(x − b)f ′′ (ξ x ))d xPoichè il prodotto (x −a)(x −b) ha segno costante in [a,b], per il teorema del Valor Me<strong>di</strong>o del calcolo integrale(si veda il Teorema 2.5.3) si ha12∫ ba(x − a)(x − b)f ′′ (ξ x ))d x = 1 2 f ′′ (ξ)∫ ba(x − a)(x − b)d x = − 1 2 f ′′ (b − a)3(ξ)3!dove ξ è un punto interno all’intervallo [a,b].La quantità E i nt = − 1 2 f ′′ (b − a)3(ξ) = − 13! 12 f ′′ (ξ)(b − a) 3 rappresenta l’errore che si commette approssimandol’integrale <strong>di</strong> f in [a,b] me<strong>di</strong>ante l’integrale della retta passante per f (a) e f (b), vale a <strong>di</strong>re, me<strong>di</strong>antel’area del trapezio sottesa dalla corda passante per f (a) e f (b).In<strong>di</strong>cando con M = max a≤x≤b |f ′′ (x)| possiamo maggiorare l’errore con la relazione(b − a)3|E i nt | ≤ M12La formula dei trapezi approssima l’integrale <strong>di</strong> f in [a,b] come I tr ap dato daI tr ap = b − a [f (a) + f (b)]29.3 Formule <strong>di</strong> Newton-CotesSe, al posto <strong>di</strong> una retta, pren<strong>di</strong>amo come funzione interpolante la f un polinomio <strong>di</strong> grado più elevato,otterremo altre formule <strong>di</strong> quadrature.Supponiamo <strong>di</strong> poter valutare la f in n + 1 punti x 0 , x 1 ,..., x n e costruiamo il polinomio interpolatore <strong>di</strong>grado n utilizzando la formula <strong>di</strong> Lagrange.Avremo p n (x) = ∑ ni=0 f (x i )L i (x), dove i polinomi <strong>di</strong> Lagrange sono dati dalla nota formulaL i (x) =n∏j =0j ≠ix − x jx i − x j123


9. INTEGRAZIONE NUMERICAFigura 9.1: Formula dei trapezi: l’integrale della funzione f (zona tratteggiata in blu) viene approssimatame<strong>di</strong>ante l’area del trapezio sotteso alla retta <strong>di</strong> interpolazione per f (a) e f (b) (zona verde).Se i no<strong>di</strong> sono equi<strong>di</strong>stanti con passo h, possiamo scrivere x j = x 0 + j h, con j = 0,1,...,n e per un genericopunto x compreso tra x 0 e x n vale x = x 0 + sh con 0 ≤ s ≤ n, s numero reale.Quin<strong>di</strong> x − x j = x 0 + sh − (x 0 + j h) = (s − j )h e x i − x j = (i − j )h, da cui il polinomio <strong>di</strong> Lagrange si puòscrivere comeL i (x) =n∏ s − ji − j = L i (s)j =0j ≠iDa f (x) = p n (x) + E(x) dove E(x) è l’errore della formula <strong>di</strong> interpolazione, passando all’integrale,abbiamo∫ baf (x)d x =∫ bap n (x)d x +∫ baE(x)d xIl primo integrale rappresenta la formula che approssima l’integrale della f mentre il secondo integralerappresenta l’errore della formula <strong>di</strong> quadratura.La formula <strong>di</strong> quadratura è quin<strong>di</strong> data dal valore dell’integrale <strong>di</strong> p n :∫ b∫ b n∑n∑I = f (x)d x ≈ f (x i )L i (x)d x = f (x i )aai=0i=0∫ baL i (x)d xLa formula <strong>di</strong> quadratura ha dunque come no<strong>di</strong> i punti x i e come pesi gli integrali ∫ ba L i (x)d x.Sia x 0 = a e x n = b, tenendo presente che L i (x) = L i (s) con x = x 0 + sh, da cui d x = hd s abbiamo∫ ba∫ xnL i (x)d x = L i (x)d x =x 0Allora∫ bn∑I = f (x)d x ≈ h f (x i )ai=0∫ n0∫ n0L i (s)hd s = hL i (s)d s∫ n0L i (s)d s124


9.3. Formule <strong>di</strong> Newton-CotesDefiniamo i coefficienti <strong>di</strong> Newton-Cotes 1 le espressioniC (n) = 1 in∫ n0L i (s)d si = 0,1,...,nLa formula precedente si scrive, quin<strong>di</strong>, come∫ bI =an∑n∑f (x)d x ≈ nh f (x i )C (n) = (xi n − x 0 )i=0L’errore della formula <strong>di</strong> quadratura è dato daE i nt =∫ ba∫ bE(x)d x =ai=0f (n+1) (ξ x )(x − x 0 )(x − x 1 )···(x − x n )d x(n + 1)!f (x i )C (n)i(9.1)Dato un polinomio <strong>di</strong> interpolazione <strong>di</strong> grado n me<strong>di</strong>ante il proce<strong>di</strong>mento <strong>di</strong> Lagrange è possibile ricavareuna formula <strong>di</strong> quadratura numerica che prende il nome <strong>di</strong> formula <strong>di</strong> Newton-Cotes. Per quantoriguarda l’errore si può osservare che le formule ottenute con un valore n <strong>di</strong>spari (cui corrisponde un numeron + 1 pari <strong>di</strong> punti <strong>di</strong> appoggio) è solo leggermente inferiore alle formule <strong>di</strong> or<strong>di</strong>ne pari che le precedonoimme<strong>di</strong>atamente (cui corrisponde un numero <strong>di</strong>spari <strong>di</strong> punti <strong>di</strong> appoggio).Per questo motivo le formule <strong>di</strong> or<strong>di</strong>ne pari sono le più usate.Osserviamo che per f (x) ≡ 1, qualunque sia il grado del polinomio utilizzato nelle formule <strong>di</strong> Newton-Cotes, l’errore <strong>di</strong> integrazione sarà zero. Nell’intervallo [a,b] ≡ [0,1], applicando l’equazione (9.1) si ha1 =∫ 10d x =n∑i=0C (n)iTroviamo che la somma dei coefficienti <strong>di</strong> Newton-Cotes vale 1.Per n = 1 (si hanno quin<strong>di</strong> due punti <strong>di</strong> appoggio, x 0 e x 1 ) i coefficienti <strong>di</strong> Cotes sono quelli già ricavatidella formula dei trapeziFormula deitrapeziC (1)0= 1 1C (1)1= 1 1∫ 10∫ 10∫ 1L 0 (s)d s =L 1 (s)d s =0∫ 10(s − 1)−1 d s = 1 2s1 d s = 1 2e la formula <strong>di</strong> integrazione <strong>di</strong>venta∫ bI =af (x)d x ≈ h1∑i=09.3.1 Formula <strong>di</strong> Cavalieri-Simpsonf (x i )C (1)i= (x 1 − x 0 ) f (x 0) + f (x 1 )2Considerando n = 2 (quin<strong>di</strong> 3 punti <strong>di</strong> appoggio nell’intervallo [a,b], x 0 = a, x 1 = a + b e x 2 = b, i due2estremi dell’intervallo e il punto centrale) la formula <strong>di</strong> quadratura prende il nome <strong>di</strong> formula <strong>di</strong> Cavalieri-Simpson 21 Roger Cotes (1682-1716) fu un matematico inglese che lavorò molto con Isaac Newton, in particolare per la correzione del suofamoso libro Principia. Egli inventò le formule <strong>di</strong> quadratura che prendono il suo nome e per primo introdussse quella che oggiconosciamo come formula <strong>di</strong> Eulero, per cui e x = cos(x) + i sin(x) nel campo complesso.2 Bonaventura Francesco Cavalieri (1598-1647) fu un matematico italiano. Stu<strong>di</strong>ò teologia e geometria. Lavorò su problemi <strong>di</strong> otticae <strong>di</strong> cinematica. È famoso soprattutto per il cosiddetto principio <strong>di</strong> Cavalieri.Thomas Simpson (1710-1761) fu un matematico britannico, inventore della formula <strong>di</strong> quadratura per il calcolo <strong>di</strong> integrali definiti,sebbene questa formula fosse stata già scoperta 200 anni prima da Keplero e pare fosse usata anche da Cavalieri nel 1639 e poi riscopertada James Gregory. I suoi stu<strong>di</strong> riguardano anche l’astrologia.125


9. INTEGRAZIONE NUMERICAFigura 9.2: Formula <strong>di</strong> Cavalieri-Simpson: l’integrale della funzione f (zona tratteggiata in blu) vieneapprossimata me<strong>di</strong>ante l’area della regione sottesa alla parabola passante per f (a), f (c) e f (b) (zona verde).C (2)0= 1 2C (2)1= 1 2C (2)2= 1 2∫ 20∫ 20∫ 20L 0 (s)d s = 1 2L 1 (s)d s = 1 2L 2 (s)d s = 1 2∫ 20∫ 20∫ 20(s − 1)(s − 2)d s = 1 (−1)(−2) 6(s)(s − 2)(1)(−1) d s = 4 6(s)(s − 1)d s = 1 (2)(1) 6La formula <strong>di</strong> Cavalieri-Simpson approssima l’integrale della f considerando come no<strong>di</strong> x 0 =a, x 1 = c = a + b e x 2 = b e come pesi i coefficienti <strong>di</strong> Cotes C (2)0= 1 26 , C (2)1= 4 6 , C (2)2= 1 6 , ottenendo:∫ bI =af (x)d x ≈ (x 2 − x 0 )2∑i=0f (x i )C (2)i= b − a (f (a) + 4f (c) + f (b))6= (b − a)( f (a)64f (c)+ + f (b)6 6 )Con la formula <strong>di</strong> Cavalieri-Simpson, dunque, l’integrale della f viene approssimato con l’integrale dellaparabola passante per i due estremi a e b e per il punto centrale dell’intervallo.Per quanto riguarda l’errore che si commette approssimando l’integrale della f con la formula <strong>di</strong>Cavalieri-Simpson, consideriamo, seguendo l’approccio visto per la formula dei trapezi, l’integrale dell’erroredel polinomio <strong>di</strong> interpolazione <strong>di</strong> Lagrange.Per il polinomio <strong>di</strong> secondo grado p 2 che abbiamo considerato per interpolare la f , l’errore è dato daE(x) = f ′′′ (ξ x )(x − a)(x − c)(x − b).3!126


9.3. Formule <strong>di</strong> Newton-CotesQuando facciamo l’integrale, l’errore nell’approssimare l’integrale esatto con la formula <strong>di</strong> Cavalieri-Simpson è dunque dato da∫ bE i nt =af ′′′ (ξ x )(x − a)(x − c)(x − b)d x3!Questa volta, la funzione (x − a)(x − c)(x − b) cambia segno all’interno dell’intervallo [a,b] e non possiamopiù applicare il teorema del valor me<strong>di</strong>o come nella formula dei trapezi. In maniera più laboriosa, tuttavia, siricava per l’errore la seguente formula:E i nt = − f IV (u)90( ) b − a 5= − f IV (u)(b − a)52 2880dove u è un opportuno punto dell’intervallo ]a,b[.Osservando i valori dei coefficienti <strong>di</strong> Newton-Cotes per n = 1 e per n = 2 si può vedere come i coefficientisiano simmetrici e la loro somma vale 1. Questo risultato si può generalizzare per ogni n.9.3.2 Sull’errore della formula <strong>di</strong> Cavalieri-SimpsonPer capire l’errore che si ha nella formula <strong>di</strong> Cavalieri-Simpson, deduciamo la stessa formula seguendoun’altra strada.Per semplificare il <strong>di</strong>scorso, scegliamo l’intervallo [a,b] simmetrico rispetto all’origine, quin<strong>di</strong> del tipo[−t, t] con t ∈ R, sapendo che, se non fosse così, basta applicare una traslazione dell’asse x per ricondursi aquesto caso. Scriviamo il polinomio <strong>di</strong> interpolazione che passa per i punti −t, 0 e t e che interpola anche laderivata prima della f in 0.Me<strong>di</strong>ante la tabella delle <strong>di</strong>fferenza <strong>di</strong>vise, il punto c va contato due volte e si ha:−t f (−t)f (0) − f (−t)0 f (0)tf ′ f (0) − f (−t)(0) −0 f (0) f ′ (0)t= t f ′ (0) − f (0) + f (−t)tt 2f (t) − f (0)− ff (t) − f (0)′ (0)t f (t)t= f (t) − f (0) − t f ′ (0) f (t) − 2t f ′ (0) − f (−t)ttt 22t 3Il polinomio <strong>di</strong> interpolazione è, dunquef (0) − f (−t)p(x) = f (−t) + (x + t) + t f ′ (0) − f (0) + f (−t)tt 2 (x + t)x + f (t) − 2t f ′ (0) − f (−t)2t 3 (x + t)x 2L’errore <strong>di</strong> interpolazione per questo polinomio <strong>di</strong> grado 3 valeE(x) = f (IV ) (ξ x )(x + t)x 2 (x − t)4!Quin<strong>di</strong> da f (x) = p(x) + E(x), andando a integrare tra −t e t si ha:∫ t−t−t∫ t∫ tf (x)d x = p(x)d x + E(x)d x−t−tNell’integrazione del polinomio p(x) è facile vedere che i termini che <strong>di</strong>pendono da f ′ (0) portano uncontributo nullo. Infatti∫ t( f ′ (0)(x + t)x − f ′ ) ∫(0)ttt 2 (x + t)x 2 f ′ )(0)d x =(x 2 + t x − x3tt − x2 d x−t= f ′ (0)t[t x22 − x44t] t−t= 0127


9. INTEGRAZIONE NUMERICAGli integrali <strong>degli</strong> altri termini del polinomio p(x) portano alla formula <strong>di</strong> Cavalieri-Simpson.(omettendo i passaggi matematici) si haInfatti∫ t−t(f (−t) +f (0) − f (−t) f (−t) − f (0)(x + t) +tt 2 (x + t)x += 2t (f (−t) + 4f (0) + f (t))6f (t) − f (−t)2t 3 (x + t)x 2 )d x =Allora l’errore della formula <strong>di</strong> Cavalieri-Simpson coincide con l’integrale <strong>di</strong> E(x).Quin<strong>di</strong> E i nt = ∫ t f (IV ) (ξ x )−t(x + t)x 2 (x − t)d x4!La funzione (x + t)x 2 (x − t) = (x 2 − t 2 )x 2 non cambia mai segno all’interno dell’intervallo [−t, t], quin<strong>di</strong> sipuò applicare il teorema del Valore Me<strong>di</strong>o del calcolo integrale, per cuiE i nt = f (IV ) (ξ)24∫ t−t(x 2 − t 2 )x 2 d x = f (IV ) [(ξ) x5] t24 5 − t 2 x33 −tConsiderando che l’ampiezza dell’intervallo è h = 2t si haE i nt = − f (IV ) (ξ)( h 90 2 )5 = − f (IV ) (ξ)2880 h5Troviamo la formula dell’errore per Cavalieri-Simpson.= − f (IV ) (ξ)t 5909.4 Formule composteLe formule <strong>di</strong> Newton-Cotes non vanno bene su intervalli molto ampi perchè per avere risultati più accuratidovremmo utilizzare formule <strong>di</strong> grado elevato (in modo da utilizzare un numero elevato <strong>di</strong> punti <strong>di</strong>appoggio). Ci sono vari motivi che sconsigliano questa procedura:G i valori dei coefficienti in formule <strong>di</strong> grado elevato sono <strong>di</strong>fficili da ottenere;G le formule <strong>di</strong> Newton-Cotes, essendo basate su polinomi <strong>di</strong> interpolazione con no<strong>di</strong> equi<strong>di</strong>stanti dannorisultati inaccurati su intervalli ampi a causa della natura oscillatoria dei polinomi <strong>di</strong> grado elevato.Conviene dunque utilizzare formule <strong>di</strong> grado basso ma scomponendo l’intervallo <strong>di</strong> integrazione in piùsottointervalli e, in ciascuno <strong>di</strong> essi, applicare la stessa formula.Sfruttiamo il fatto che se l’intervallo [a,b] viene <strong>di</strong>viso in n sottointervalli in modo che [a,b] = [a, x 1 ] ∪[x 1 , x 2 ] ∪ [x 2 , x 3 ] ∪ ... ∪ [x n−1 ,b], allora∫ ba∫ x1∫ x2∫ x3∫ bf (x)d x = f (x)d x + f (x)d x + f (x)d x + ... + f (x)d xax 1 x 2 x nSu ciascuno intervallo [x i−1 , x i ] per i = 1,2,...,n, approssimiamo l’integrale della f me<strong>di</strong>ante una formula<strong>di</strong> quadratura più semplice, utilizzando pochi punti.9.4.1 Formula composta dei trapeziSud<strong>di</strong>vi<strong>di</strong>amo l’intervallo [a,b] in n sottointervalli definiti dai punti d’appoggio x 0 , x 1 ,..., x n (per semplicitàsupponiamo i punti equi<strong>di</strong>stanti con passo h = b − an , in modo che x 0 = a e x n = b, x i = x 0 + i h,i = 0,...,n).L’integrale su [a,b] si può dunque ottenere come somma <strong>degli</strong> integrali su tali sottointervalli:∫ baf (x)d x =n∑i=1∫ xix i−1f (x)d x128


9.4. Formule composteFigura 9.3: Formula composta dei trapezi, utilizzando 3 sottointervalli (4 punti).Ciascuno <strong>degli</strong> integrali su [x i−1 , x i ] viene approssimato utilizzando la formula dei trapezi:n∑i=1∫ xix i−1f (x)d x ≈In forma estesa abbiamon∑i=1x i − x i−12[f (x i−1 ) + f (x i )] =n∑i=1I ≈ h 2 [f (x 0) + 2f (x 1 ) + 2f (x 2 ) + ... + 2f (x n−1 ) + f (x n )]f (a) + f (b)= h[ + f (x 1 ) + f (x 2 ) + ... f (x n−1 )]2h2 [f (x i−1) + f (x i )]L’errore che si commette è dato dalla somma <strong>degli</strong> errori commessi sui singoli sottointervalliE i nt =n∑i=1−f ′′ (ξ i ) h312Supponendo che la derivata seconda della f sia continua e limitata in [a,b] e chiamando con m e Mrispettivamente il minimo e il massimo <strong>di</strong> f ′′ in [a,b], si ha:m ≤ f ′′ (ξ i ) ≤ Mi = 1,...,nQuin<strong>di</strong>nm ≤∑n∑nf ′′ i=1(ξ i ) ≤ nM =⇒ m ≤f ′′ (ξ i )≤ Mni=1Per il teorema del Valor Interme<strong>di</strong>o (teorema 2.5.5),qualche punto u <strong>di</strong> [a,b].Applicando la relazione h = b − a , l’errore <strong>di</strong>ventann∑E i nt =i=1∑ ni=1 f ′′ (ξ i )è un valore assunto dalla funzione inn−f ′′ (ξ i ) h312 = −n f ′′ (ξ) h312 = − f ′′ (ξ)12 (b − a)h2 = − f ′′ (ξ)12(b − a) 3n 2 129


9. INTEGRAZIONE NUMERICAQuin<strong>di</strong> per n → ∞ l’errore tende a zero come h 2 o, equivalentemente, come 1 n 2 .Formula composta <strong>di</strong> Cavalieri-SimpsonSud<strong>di</strong>vi<strong>di</strong>amo l’intervallo [a,b] in n sottointervalli <strong>di</strong> ampiezza costante uguale a h e su ciascuno <strong>di</strong> questisottointervalli applichiamo la formula <strong>di</strong> Cavalieri-Simpson. Abbiamo, in questo modo, la formula composta<strong>di</strong> Cavalieri-Simpson.Su ogni intervallino, quin<strong>di</strong>, dobbiamo considerare gli estremi dell’intervallino e il punto centrale <strong>di</strong> esso.Siano a i e b i gli estremi <strong>di</strong> ciascuna sud<strong>di</strong>visione e sia c i = a i + b iil punto me<strong>di</strong>o <strong>di</strong> ciascuna sud<strong>di</strong>visione2(quin<strong>di</strong> per i = 1,...,n). L’estremo superiore b i <strong>di</strong> ciascun intervallino, con i = 1,n − 1 coincide con l’estremoinferiore dell’intervallino successivo: b i = a i+1 . In tal modo, seguendo lo stesso ragionamento fatto per itrapezi si ha:∫ ba∫ b1∫ b2∫ bnf (x)d x = f (x)d x + f (x)d x + ... + f (x)d xa 1 a 2 a nApplicando la formula <strong>di</strong> Cavalieri-Simpson su ciascun intervallino risulta:∫ bia iIn tal modo∫ baf (x)d x ≈ b i − a i6f (x)d x ≈(f (ai ) + 4f (c i ) + f (b i ) ) = h 6n∑ h (f (ai ) + 4f (c i ) + f (b i ) )i=16Si ha la formula composta <strong>di</strong> Cavalieri-Simpson.(f (ai ) + 4f (c i ) + f (b i ) )Figura 9.4: Formula composta <strong>di</strong> Cavalieri-Simpson, utilizzando 3 sottointervalli (7 punti).130


9.4. Formule compostePossiamo vedere la formula composta <strong>di</strong> Cavalieri-Simpson anche in una forma compatta.Considerando che, su ogni sottointervallo, dobbiamo prendere il punto me<strong>di</strong>o, facciamouna numerazione progressiva dei punti <strong>di</strong> integrazione nel modo seguente:x 0 = ax 2i = x 0 + i hi = 0,...n no<strong>di</strong> estremi dei sottointervallix 2i+1 = x 0 + (i + 1 2 )hi = 0,...,n − 1 no<strong>di</strong> centrali dei sottointervalliQuin<strong>di</strong> i no<strong>di</strong> pari corrispondono agli estremi dei sottointervalli, mentre i no<strong>di</strong> <strong>di</strong>spari sonoi punti centrali <strong>di</strong> ogni sottointervallo. Per la formula <strong>di</strong> quadratura otteniamo∫ bn−1 ∑∫ x2i+2I = f (x)d x =f (x)d xai=0i=0x 2in−1 ∑ h≈6 [f (x 2i ) + 4f (x 2i+1 ) + f (x 2i+2 )]= h 6 [f (x 0) + 4f (x 1 ) + 2f (x 2 ) + 4f (x 3 ) + ... + 2f (x 2n−2 ) + 4f (x 2n−1 ) + f (x 2n )]= h n−16 [f (x ∑n−1 ∑0) + 4 f (x 2i+1 ) + 2 f (x 2i ) + f (x 2n )]i=0i=0Per quanto riguarda l’errore, facendo la somma <strong>degli</strong> errori <strong>di</strong> integrazione sugli n sottointervalli,nell’ipotesi che la derivata quarta sia continua e limitata, si ha 3 :E i nt = − 1 ( ) h 5(f IV (ξ 1 ) + f IV (ξ 2 ) + ... + f IV (ξ n ))90 2= − h5 n−1 ∑f IV (b − a)5n−1 ∑(ξ i ) = −28802880n 5 f IV (ξ i )i=0i=0Si considera quin<strong>di</strong> il punto ξ tale che 4f IV (ξ) = 1 nn∑f IV (ξ i )i=1(b − a)5E i nt = −2880n 4 f IV (b − a)h4(ξ) = − f IV (ξ)2880Quin<strong>di</strong> per n → ∞ l’errore tende a zero come1 n 4 o, equivalentemente, come h4 . Nella formula dei trapezil’errore invece decresce come1 . Ci aspettiamo quin<strong>di</strong> che il maggiore sforzo computazionale <strong>di</strong>a unan2 maggiore accuratezza nei risultati quando si applica la formula <strong>di</strong> Cavalieri-Simpson rispetto alla formula deitrapezi.3 Ricor<strong>di</strong>amo che h = b − an .4 Si ripete lo stesso ragionamento fatto sulla derivata seconda nella formula composta dei trapezi, questa volta però sulla derivataquarta. Per esercizio, si consiglia <strong>di</strong> ripetere tutti i passaggi per arrivare al risultato.131


9. INTEGRAZIONE NUMERICA9.4.2 Confronti tra la formula dei trapezi e <strong>di</strong> Cavalieri-SimpsonEsempio 9.4.1 Consideriamo f (x) = e x . Sia a = 0 e b = 1.Allora, per l’integrale esatto e per le formule dei trapezi e <strong>di</strong> Cavalieri-Simpson, si ha, rispettivamente:I =∫ 10e x d x = [ e x] 10 = e − 1 = 1.718281828I tr ap = 1 (1 + e) = 1.8591409142I C−S = 1 6 (1 + 4e1/2 + e) = 1 (1 + 6.594885083 + 2.718281828) = 1.7188611526La formula <strong>di</strong> Cavalieri-Simpson dà il risultato migliore.Sia ancora f (x) = e x ma gli estremi <strong>di</strong> integrazione siano a = 0.9 e b = 1. AlloraI =∫ 10.9e x d x = e − e 0.9 = 0.2586787173I − I tr ap = I − 0.12 (e0.9 + e) = −2.2 × 10 −4I − I C−S = I − 0.16 (e0.9 + 4e 0.95 + e) = −9.0 × 10 −9Ora la formula <strong>di</strong> Cavalieri-Simpson si rivela particolarmente accurata. Ciò non deve sorprendere se si vaa vedere la formula dell’errore, con l’ampiezza dell’intervallo che da 1 si è ridotta a 0.1, per cui (b − a) 5 da 1vale ora 10 −5 .Considerato che f ′′ = f e f IV = f , queste derivate possono essere maggiorate dal valore assunto nell’estremosuperiore dell’intervallo, cioè e. Quin<strong>di</strong> gli errori delle formule dei trapezi e <strong>di</strong> Cavalieri-Simpson sonomaggiorate da|E tr ap | ≤ e12 (b − a)3 = 2.265 × 10 −1 (b − a) 3|E C−S | ≤ e2880 (b − a)5 = 9.438 × 10 −4 (b − a) 5Perciò per a = 0 e b = 1 gli errori sono maggiorati da|E tr ap | = 2.265 × 10 −1|E C−S | = 9.438 × 10 −4Invece per a = 0.9 e b = 1, poichè b − a = 0.1 = 10 −1 , abbiamo|E tr ap | = 2.265 × 10 −1 · 10 −3 = 2.265 × 10 −4|E C−S | = 9.438 × 10 −4 · 10 −5 = 9.438 × 10 −9Esempio 9.4.2 Si voglia approssimare l’integrale a∫ 10e −x2 d x ≈ 0.746824.a È un integrale che non può essere risolto analiticamente. Se si vuole calcolare una sua approssimazione senzafare uso <strong>di</strong> formule <strong>di</strong> quadrature, possiamo, ad esempio, pensare <strong>di</strong> applicare la definizione <strong>di</strong> integrale ∫ ba f (x)d x =∑lim n n→∞ f (a + i h(n)) · h(n), con h(n) = (b − a)/n, e considerare come approssimazione dell’integrale la somma parziale∑ i=0ni=0 f (a + i h(n)) · h(n) con un valore <strong>di</strong> n molto grande. Per esempio, con n = 107 otteniamo il valore 0.74682420125254.132


9.4. Formule composteSud<strong>di</strong>vi<strong>di</strong>amo l’intervallo [0,1] in 4 sottointervalli. Sia h = 1/4 = 0.25. Per la formula composta dei trapeziabbiamoI tr ap = h 2 [e0 + 2e −h2 + 2e −(2h)2 + 2e −(3h)2 + e −(4h)2 ]= 0.125[1 + 2e −0.1252 + 2e −0.52 + 2e −0.752 + e −1 ]= 0.742984Applichiamo ora la formula <strong>di</strong> Cavalieri-Simpson su soli 2 sottointervalli, in modo da valutare la funzionenegli stessi punti precedenti. L’ampiezza <strong>di</strong> ciascun sottointervallo è dunque h = 0.5.I C−S = h 6 [e0 + 4e −(h/2)2 + 2e −(h)2 + 4e −( 3 2 h)2 + e −(2h)2 ]= 0.253 [1 + 4e−0.1252 + 2e −0.52 + 4e −0.752 + e −1 ]= 0.746855A parità <strong>di</strong> punti (e non <strong>di</strong> sottointervalli) la formula <strong>di</strong> Cavalieri-Simpson è più accurata <strong>di</strong> quella deitrapezi.Invece considerando 4 sottointervalli nella formula <strong>di</strong> Cavalieri-Simpson dobbiamo considerare anche ipunti interni <strong>di</strong> ascisse 0.125, 0.375, 0.625, 0.875 e il risultato che otteniamo è 0.746826, evidentementemaggiormente accurato.Esempio 9.4.3 Ripren<strong>di</strong>amo l’esempio visto all’inizio del Capitolo, in cui è misurata la velocità <strong>di</strong>un’automobile ogni 6 secon<strong>di</strong> e si vuole calcolare la lunghezza percorsa dalla macchina.In base ai dati in possesso, possiamo applicare la formula composta dei trapezi su 14 intervalli <strong>di</strong> ampiezzah = 6 secon<strong>di</strong>. Abbiamo (ponendo v 1 = v(0), v 2 = v(6), . . . , v 13 = v(78), v 14 = v(84)):( v1 + v) 14L = 6 + v 2 + v 3 + ... + v 13 = 3009 metri2Possiamo anche applicare la formula <strong>di</strong> Cavalieri-Simpson, considerando ora 7 intervalli <strong>di</strong> ampiezza paria h = 12 secon<strong>di</strong>. In tal caso, otteniamo:L = 2(v 1 + 4v 2 + 2v 3 + 4v 4 + 2v 5 + ... + 2v 12 + 4v 13 + v 14 ) = 3010 metriIn questo caso entrambi i risultati sono accettabili.Se la funzione integranda ha le derivate che sono facili da determinare e da maggiorare, la formula dell’errorepuò essere utile per determinare il numero <strong>di</strong> sottointervalli su cui applicare una formula composta<strong>di</strong> quadratura in modo da ottenere un’approssimazione con un errore minore <strong>di</strong> una tolleranza prefissata.Esempio 9.4.4 Consideriamo ∫ 10 e−x2 d x. In quanti sottointervalli bisogna sud<strong>di</strong>videre l’intervallo <strong>di</strong> integrazioneper applicare la formula dei trapezi e <strong>di</strong> Cavalieri-Simpson e ottenere un errore che sia minore <strong>di</strong>una tolleranza ɛ = 10 −5 ?Per i trapezi, l’errore è maggiorato da|E tr ap | ≤ max 0≤x≤1 |f ′′ (x)| (b − a) 312n 2Per Cavalieri-Simpson si ha|E C−S | ≤ max 0≤x≤1 |f IV (x)| (b − a) 52880n 4 133


9. INTEGRAZIONE NUMERICADa f (x) = e −x2 abbiamo, per le derivate:f ′ (x) = −2xe −x2f ′′ (x) = (−2 + 4x 2 )e −x2f ′′′ (x) = (12x − 8x 3 )e −x2f IV (x) = (12 − 48x 2 + 16x 4 )e −x2Si trova che il massimo <strong>di</strong> |f ′′ | e |f IV | in [0,1] è dato dal loro valore in x = 0, quin<strong>di</strong> abbiamo:|E tr ap | ≤ 212n 2 = 16n 2 |E C−S | ≤ 122880n 4 = 1240n 4La richiesta dell’accuratezza per l’errore <strong>di</strong>venta:|E tr ap | ≤ 10 −5 |E C−S | ≤ 10 −5vale a <strong>di</strong>re, rispettivamente,16n 2 ≤ 10−5 1240n 4 ≤ 10−5Per i trapezi, il primo intero n che verifica la <strong>di</strong>suguaglianza è n = 130, per Cavalieri-Simpson si ha, invece,n = 5.Applicando le formule su 130 intervalli per i trapezi e su 5 intervalli per Cavalieri-Simpson, otteniamo irisultati:I tr ap = 0.74682050480289 I C−S = 0.74682494825449.5 Estrapolazione <strong>di</strong> RichardsonApplichiamo la formula <strong>di</strong> Cavalieri-Simpson sull’intero intervallo [a,b]. L’errore che si commette, comesappiamo, valeE 1 = − f IV (ξ 1 )90( ) b − a 5= − f IV (ξ 1 )(b − a)52 2880Sud<strong>di</strong>vi<strong>di</strong>amo ora l’intervallo [a,b] in due sottointervalli e applichiamo la formula composta <strong>di</strong> Cavalieri-Simpson. L’errore che otteniamo valeE 2 = − f IV (ξ 2 ) (b − a) 52880 2 4 ≈ E 116supponendo che le derivate quarte della f non siano molto <strong>di</strong>verse tra loro.L’errore, quin<strong>di</strong>, <strong>di</strong>venta 16 volte più piccolo passando dalla formula <strong>di</strong> Cavalieri-Simpson in un intervalloalla formula applicata in due sottointervalli.Sia I il valore esatto dell’integrale e Q 1 e Q 2 i due valori approssimati ottenuti considerando la formula<strong>di</strong> Cavalieri-Simpson con n = 1 e n = 2 sottointervalli. Sia ɛ l’errore, cambiato <strong>di</strong> segno, che si ha con n = 2,ɛ = −E 2 = −E 1 /16. Possiamo scrivereI + ɛ = Q 2 per n = 2I + 16ɛ = Q 1 per n = 1134


9.6. Approssimazione <strong>di</strong> RombergSi può ricavare ɛ dalle due relazioni ottenendoQuin<strong>di</strong>ɛ = Q 1 −Q 215I ≈ Q 2 + Q 2 −Q 115Utilizzando le due approssimazioni Q 1 e Q 2 possiamo approssimare l’integrale esatto con una maggiore accuratezzame<strong>di</strong>ante la formula appena scritta. Questo proce<strong>di</strong>mento prende il nome <strong>di</strong> estrapolazione <strong>di</strong>Richardson. Può essere utilizzato per migliorare l’approssimazione <strong>di</strong> un integrale ma è basato sull’ipotesiche le derivate quarte della funzione integranda siano circa uguali e, quin<strong>di</strong>, va usato con cautela.9.6 Approssimazione <strong>di</strong> RombergRipetendo lo stesso <strong>di</strong>scorso dell’estrapolazione <strong>di</strong> Richardson a partire dalla formula dei trapezi e inmaniera sistematica, si ha l’approssimazione <strong>di</strong> Romberg.Supponiamo l’uguaglianza delle derivate seconde della funzione integranda f e sia 2 m il numero <strong>di</strong>sottointervalli in cui sud<strong>di</strong>vi<strong>di</strong>amo il dominio <strong>di</strong> integrazione [a,b].Applicando la formula dei trapezi su 2 m−1 sottointervalli e, successivamente, su 2 m sottointervalli, l’errore<strong>di</strong>minuisce come 1/4. Chiamando con A m e A m−1 i risultati della formula dei trapezi rispettivamente su 2 me su 2 m−1 sottointervalli e chiamando con ɛ l’errore cambiato <strong>di</strong> segno commesso con 2 m sottointervalli,abbiamo:I + ɛ = A mI + 4ɛ = A m−1L’integrale può essere dunque migliorato con il valoreB m = A m + A m − A m−1.3Per m = 1 si ha:A 0 = b − a [f (a) + f (b)] si ha un unico intervallo2A 1 = b − a2 [ f (a)2 + f ( a + b2 ) + f (b) ] si hanno 2 sottointervalli2B 1 = (b − a)[ f (a) 4f ( a + b6 + 2 )6) + f (b)6 ]Si ha dunque che B 1 (e quin<strong>di</strong> ciascun B m ) corrisponde al valore ottenuto con la formula <strong>di</strong> Cavalieri-Simpson. L’errore ottenuto con B m è dunque proporzionale a 1/n 4 . Nel passo successivo, utilizzando i valoriB m , otteniamo la nuova approssimazione data daC m = B m + B m − B m−115per m ≥ 2Si può <strong>di</strong>mostrare che C m coincide con la formula <strong>di</strong> Newton-Cotes con n = 4, dove l’errore è proporzionalea 1/n 6 e alla derivata sesta <strong>di</strong> f.La nuova approssimazione è data da:D m = C m + C m −C m−163per m ≥ 3135


9. INTEGRAZIONE NUMERICAL’errore ora <strong>di</strong>venta proporzionale a 1/n 8 ma D m non è più un risultato delle formule <strong>di</strong> Newton-Cotes. Ilproce<strong>di</strong>mento può andare avanti per calcolare E m , F m , etc tenendo presente che al denominatore dobbiamomettere il valore 4(d + 1) − 1 dove d è il valore del denominatore della formula precedente.Il vantaggio dell’approssimazione <strong>di</strong> Romberg si vede solo ai primi livelli dell’applicazione (in particolarepassando da A m a B m ). Inoltre, a causa della precisione finita con cui sono eseguiti i calcoli, le formule <strong>di</strong>Romberg <strong>di</strong> or<strong>di</strong>ne elevato <strong>di</strong>ventano inefficaci se il risultato iniziale A m è già abbastanza accurato rispettoalla precisione numerica consentita.9.7 Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> GaussConsideriamo <strong>di</strong> voler approssimare l’integrale dato da∫ baf (x)w(x) d xdove [a,b] può essere finito o infinito (per esempio [−1,1], [0,+∞]). Abbiamo due funzioni, la f (x) e la w(x),e vogliamo integrare il prodotto <strong>di</strong> queste due funzioni. La funzione w(x), che chiamiamo funzione peso, siapositiva (w(x) ≥ 0).Vogliamo trovare dei coefficienti w i , i = 0,...n (detti pesi della formula <strong>di</strong> quadratura) e dei no<strong>di</strong> x i , i =0,...n (detti no<strong>di</strong> <strong>di</strong> quadratura) nell’intervallo [a,b] in modo da approssimare l’integrale me<strong>di</strong>ante∫ baf (x)w(x) d x ≈n∑w i f (x i )0=1Considerando anche l’errore <strong>di</strong> quadratura:∫ baf (x)w(x) d x =n∑w i f (x i ) + E i nt (f )i=0Diremo che la formula <strong>di</strong> quadratura ha un grado <strong>di</strong> precisione (o esattezza) polinomiale d se E i nt (f ) = 0per tutti i polinomi f fino al grado d (cioè se applichiamo la formula <strong>di</strong> quadratura per approssimare∫ baf (x)w(x) d x con f polinomio <strong>di</strong> grado d, l’errore è nullo). Osserviamo che ora non stiamo parlando <strong>di</strong>formule <strong>di</strong> quadratura composte quin<strong>di</strong> n non si riferisce a sud<strong>di</strong>visioni dell’intervallo [a,b]. Per le formule<strong>di</strong> Newton-Cotes, si ha w(x) ≡ 1 e si può provare che il grado <strong>di</strong> precisione d è:d = n per le formule ottenute da polinomi <strong>di</strong> interpolazione <strong>di</strong> grado n <strong>di</strong>spari (come nei Trapezi: n = 1)G d = n + 1 per le formule ottenute da polinomi <strong>di</strong> interpolazione <strong>di</strong> grado n pari (come in Cavalieri-Simpson: n = 2)Diremo che la formula <strong>di</strong> quadratura è interpolatoria se vale d = n . Le formule interpolatorie sono ottenuteper interpolazione, percorrendo la stessa strada che abbiamo visto per le formule <strong>di</strong> Newton-Cotes.Interpoliamo la funzione f me<strong>di</strong>ante un polinomio <strong>di</strong> grado n, utilizzando i polinomi <strong>di</strong> Lagrange. Nel costruirei pesi dobbiamo tenere conto anche della funzione w e quin<strong>di</strong> i pesi saranno w i = ∫ ba L i (x)w(x) d xdove L i (x) è l’i -simo polinomio <strong>di</strong> Lagrange.Con questo approccio la formula <strong>di</strong> quadratura che ricaviamo ha al più grado <strong>di</strong> precisione d = n (od = n + 1 quando w(x) ≡ 1 e per n pari, come abbiamo visto per le formule <strong>di</strong> Newton-Cotes).È possibile ricavare formule <strong>di</strong> quadratura che abbiano un grado <strong>di</strong> precisione d maggiore del grado delpolinomio interpolante? E se sì come?A tal fine consideriamo il polinomio dei no<strong>di</strong> F (x) = ∏ ni=0 (x − x i ), <strong>di</strong> grado n + 1, lo stesso che abbiamointrodotto nel Capitolo sull’interpolazione.Vale il seguente teorema.Teorema 9.7.1 (<strong>di</strong> W. Gautschi) Dato un intero k con 0 < k ≤ n + 1, la formula <strong>di</strong> quadratura∫ baf (x)w(x) d x =n∑w i f (x i ) + E i nt (f )i=0ha grado <strong>di</strong> precisione (esattezza) d = n + k se e solo se sono sod<strong>di</strong>sfatte entrambe le con<strong>di</strong>zioni (a) e (b):136


9.7. Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> Gauss(a) la formula è interpolatoria;(b) il polinomio dei no<strong>di</strong> F (x) sod<strong>di</strong>sfa la relazione ∫ baF (x)p(x)w(x) d x = 0 per ogni polinomio p <strong>di</strong> grado≤ k − 1.Osserviamo che la con<strong>di</strong>zione in (b):G impone k con<strong>di</strong>zioni sui no<strong>di</strong> x 0 , x 1 , x 2 ,... x n . Se fosse k = 0 non ci sarebbero con<strong>di</strong>zioni in più daconsiderare e avremmo d = n (cioè esattezza d = n);G fornisce una relazione <strong>di</strong> ortogonalità: il polinomio F è ortogonale ai polinomi <strong>di</strong> grado ≤ k −1 rispettoalla funzione peso w. 5Nel caso specifico, il punto (b) <strong>di</strong>ce che:∫ ba∫ ba∫ ba∫ baF (x)w(x) d x = 0xF (x)w(x) d x = 0x 2 F (x)w(x) d x = 0.x k−1 F (x)w(x) d x = 0G fa sì che k non possa essere maggiore o uguale a n + 2. Se fosse infatti k = n + 2, il punto (b) sarebbe:(b) il polinomio dei no<strong>di</strong> F (x) sod<strong>di</strong>sfa la relazione ∫ baF (x)p(x)w(x)d x = 0 per ogni polinomio p <strong>di</strong>grado ≤ k − 1 = n + 1.Allora, si potrebbe prendere come polinomio p(x) esattamente F (x) (che ha grado n + 1) e, per la(b) sarebbe ∫ ba (F (x))2 w(x)d x = 0: ma questo è un assurdo perchè l’integrale <strong>di</strong> una funzione positivanon può essere nullo, e, nel nostro caso, w(x) è positiva e (F (x)) 2 , essendo il quadrato <strong>di</strong> un polinomio,è pure essa una funzione positiva.Il caso ottimale (il più alto grado <strong>di</strong> precisione che si può ottenere), si ha per k uguale al valore massimo chepuò assumere, vale a <strong>di</strong>re k = n + 1. In tal caso d = n + k = n + n + 1 = 2n + 1. Si hanno le cosiddette formule<strong>di</strong> Gauss.A seconda della scelta della funzione peso w e dell’intervallo [a,b] abbiamo <strong>di</strong>verse formule <strong>di</strong> Gauss.Dimostrazione.[del teorema <strong>di</strong> W. Gautschi]Dimostriamo che se d = n + k allora sono vere la (a) e la (b) (necessità). Essendo d = n + kla formula è esatta anche per polinomi <strong>di</strong> grado n: abbiamo <strong>di</strong>mostrato il punto (a).Se p è un polinomio <strong>di</strong> grado al più k − 1, allora F (x)p(x) è un polinomio (perchè prodotto<strong>di</strong> due polinomi) <strong>di</strong> grado al più n + 1 + k − 1 = n + k. Applichiamo a questo polinomioprodotto la formula <strong>di</strong> quadratura (che è esatta valendo l’ipotesi che d = n + k, quin<strong>di</strong>E i nt (F (x)p(x)) = 0). Quin<strong>di</strong>∫ bn∑F (x)p(x)w(x) d x = F (x i )p(x i )w i .ai=0Ma F (x i ) = 0 essendo F il polinomio dei no<strong>di</strong>. Perciò ∑ ni=0 F (x i )p(x i )w i = 05 Per definizione, infatti, due funzioni u e v si <strong>di</strong>cono ortogonali rispetto alla funzione peso w (positiva), se ∫ ba u(x)v(x)w(x) d x = 0.137


9. INTEGRAZIONE NUMERICADi conseguenza ∫ ba F (x)p(x)w(x) d x = ∑ ni=0 F (x i )p(x i )w i = 0 e quin<strong>di</strong> il punto (b) è provato.Supponiamo ora che siano vere le con<strong>di</strong>zioni (a) e (b) e <strong>di</strong>mostriamo che d = n + k (sufficienza). Sia p unpolinomio <strong>di</strong> grado n +k. Dobbiamo provare che E i nt (p) = 0. Divi<strong>di</strong>amo il polinomio p per il polinomio F :possiamo scrivere p(x) = F (x)q(x)+r (x) dove q(x) (quoziente) è un polinomio <strong>di</strong> grado k −1 e r (x) (resto) èun polinomio <strong>di</strong> grado n. Nel fare l’integrale, abbiamo∫ bap(x)w(x) d x =∫ baq(x)F (x)w(x) d x +∫ bar (x)w(x) d xIl primo integrale a secondo membro vale zero a motivo dell’ipotesi (b) (q(x) è un polinomio <strong>di</strong> grado k − 1e quin<strong>di</strong> quell’integrale è zero). Il secondo integrale, invece, per la (a) può essere calcolato esattamenteandando ad applicare la formula <strong>di</strong> quadratura (essendo r <strong>di</strong> grado n ed essendo la formula interpolatoriasi ha E i nt (r ) = 0 ). Si ha∫ b∫ bn∑p(x)w(x) d x = r (x)w(x) d x = r (x i )w iaaMa r (x i ) = p(x i ) − q(x i )F (x i ) = p(x i ) (essendo F (x i ) = 0). Quin<strong>di</strong>∫ b∫ bn∑p(x)w(x) d x = r (x)w(x) d x = p(x i )w iaai=0i=1L’errore è dunque zero e la <strong>di</strong>mostrazione è completata. ✔Da un punto <strong>di</strong> vista teorico la con<strong>di</strong>zione (a) del teorema permette <strong>di</strong> calcolare i pesi delle formule <strong>di</strong> Gauss:essendo la formula interpolatoria si ha w i = ∫ ba L i (x)w(x) d x.La con<strong>di</strong>zione (b) permette <strong>di</strong> calcolare i no<strong>di</strong> x i della formula (imponendo l’ortogonalità tra F (x) e ipolinomi <strong>di</strong> grado k = 0,1,2,...,n si ricava un sistema <strong>di</strong> n + 1 equazioni nelle incognite dei coefficientidel polinomio F (x). Una volta trovato il polinomio F (x) ricaviamo le ra<strong>di</strong>ci, che sono appunti i no<strong>di</strong> <strong>di</strong>integrazione 6 .9.7.1 Proprietà delle formule <strong>di</strong> GaussScriviamo le formule <strong>di</strong> Gauss con la notazione∫ baf (x)w(x) d x =n∑w i f (x i ) + E G i nt (f )i=0Si ha E G (f ) ≡ 0 per f polinomio <strong>di</strong> grado ≤ 2n + 1i ntI no<strong>di</strong> x i sono reali, <strong>di</strong>stinti e contenuti nell’intervallo aperto ]a,b[.I pesi w i sono tutti positivi.Infatti, per j = 0,1,...n 0 < ∫ ba (L j (x)) 2 w(x) d x = ∑ ni=0 w i (L j (x i )) 2(l’errore è nullo perchè (L j (x)) 2 è un polinomio <strong>di</strong> grado 2n). Ma L j (x i ) = 0 se i ≠ j e L j (x i ) = 1 se i = j .Quin<strong>di</strong> ∑ ni=0 w i (L j (x i )) 2 = w j . Abbiamo provato che i pesi sono positivi.Le formule <strong>di</strong> Gauss si possono ricavare me<strong>di</strong>ante interpolazione (detta <strong>di</strong> Hermite) sui no<strong>di</strong> x i contaticiascuno come nodo doppio nel senso che su ciascun nodo imponiamo la con<strong>di</strong>zione <strong>di</strong> interpolazione nonsolo sulla f ma anche sulla derivata prima della f . Una volta che abbiamo ricavato il polinomio <strong>di</strong> interpolazionep(x) (che interpola quin<strong>di</strong> per ogni nodo sia la f sia la f ′ ) e approssimato ∫ bf (x)w(x) d x me<strong>di</strong>ante∫ bap(x)w(x) d x, dalla formula che ricaviamo imponiamo che i termini che contengono la derivata primasiano uguali a zero (questa osservazione è dovuta a Markov, matematico russo, nel 1885).La formula che otteniamo (considerando che il polinomio interpola la f e la f ′ ) avrà termini del tipo:∫ ba f (x)w(x) d x = ∑ ni=0 w i f (x i ) + ∑ ni=0 C i f ′ (x i ) + E G i nt (x)6 Ricor<strong>di</strong>amo che un polinomio <strong>di</strong> grado n + 1 lo possiamo scrivere come a n+1 x n+1 + a n x n + ··· + a 0 ma possiamo anche <strong>di</strong>videreper il coefficiente <strong>di</strong> grado massimo e scriverlo in forma cosiddetta monica x n+1 + b n x n + b n−1 x n−1 + ... + b 0 , e avere quin<strong>di</strong> solo n + 1coefficienti (b 0 , b 1 , . . . , b n ) : le ra<strong>di</strong>ci dei due polinomi non cambiano.a138


9.7. Introduzione alle formule <strong>di</strong> quadratura <strong>di</strong> GaussImponendo C i = 0 i = 0,1,2,...n, otteniamo n + 1 con<strong>di</strong>zioni che ci permettono <strong>di</strong> ricavare i valori <strong>di</strong> x i (ino<strong>di</strong> <strong>di</strong> integrazione della formula). Possiamo poi ricavare il valore dei pesi w i (che <strong>di</strong>pendono a loro volta daino<strong>di</strong>). Nel procedere con l’interpolazione sui valori della f e della f ′ , l’errore del polinomio <strong>di</strong> interpolazionesi può scrivere come E = (F (x)) 2 f (2(n+1)) (ξ x )(poichè ogni nodo è contato due volte, e supponendo che la f(2(n + 1))!sia derivabile 2(n + 1) volte e sia continua).Di conseguenza, l’errore nella formula <strong>di</strong> integrazione (applicando il teorema del Valor Me<strong>di</strong>o in quanto(F (x)) 2 w(x) non cambia segno nell’intervallo <strong>di</strong> integrazione) si può scrivere come E G i ntE G i nt (x) = f (2(n+1)) (ξ)(2(n + 1))!∫ ba(F (x)) 2 w(x) d x9.7.2 Formule <strong>di</strong> Gauss-LegendreA seconda della funzione peso, si ha una particolare formula <strong>di</strong> Gauss.In genere i no<strong>di</strong> <strong>di</strong> integrazione sono calcolati su intervalli “canonici” (spetta a noi fare il cambio <strong>di</strong>variabili se l’integrale è da farsi su altri intervalli)..Per w(x) ≡ 1 e [a,b] ≡ [−1,1] si ha la formula <strong>di</strong> Gauss-Legendre.I no<strong>di</strong> della formula <strong>di</strong> quadratura, sono le ra<strong>di</strong>ci dei cosiddetti polinomi <strong>di</strong> Legendre.n + 1 no<strong>di</strong> pesi2 x 0,1 = ±0.57735026918962576 w 0 = w 1 = 1.03 x 0 = −0.77459666924148338 w 0 = 5/9 = 0.5555555556x 1 = 0 w 1 = 8/9 = 0.8888888889x 2 = 0.77459666924148338 w 2 = 5/9 = 0.55555555564 x 0 = −0.86113631159405257 w 0 = 0.3478548451374538x 1 = −0.33998104358485626 w 1 = 0.6521451548625461x 2 = 0.33998104358485626 w 2 = 0.6521451548625461x 3 = 0.86113631159405257 w 3 = 0.3478548451374538I polinomi <strong>di</strong> Legendre (e, come essi, anche tutti gli altri polinomi le cui ra<strong>di</strong>ci sono i no<strong>di</strong> delle altreformule <strong>di</strong> Gauss) hanno la caratteristica <strong>di</strong> essere polinomi mutuamente ortogonali (nel senso che presidue polinomi <strong>di</strong> Legendre, che chiamiamo ω n (x) e ω m (x), rispettivamente <strong>di</strong> grado n e m, con n ≠ m, si ha∫ ba ω n(x)ω m (x)w(x) d x = 0).I polinomi <strong>di</strong> Legendre (e, come essi, i polinomi delle altre formule <strong>di</strong> Gauss), si ricavano me<strong>di</strong>ante formulericorsive, cioè ogni polinomio <strong>di</strong> Legendre <strong>di</strong> grado n è legato (me<strong>di</strong>ante una relazione opportuna) aipolinomi <strong>di</strong> Legendre <strong>di</strong> grado n − 1 e n − 2.9.7.3 Altre formule <strong>di</strong> Gauss1G Con w(x) = √ e [a,b] = [−1,1] si hanno le formule <strong>di</strong> Gauss-Chebychev (prima specie) in(1 − x 2 )quanto i no<strong>di</strong> <strong>di</strong> integrazione sono le ra<strong>di</strong>ci dei cosiddetti polinomi <strong>di</strong> Chebychev <strong>di</strong> prima specie.G Con w(x) = √ (1 − x 2 ) e [a,b] = [−1,1] si hanno le formule <strong>di</strong> Gauss-Chebychev (seconda specie) inquanto i no<strong>di</strong> <strong>di</strong> integrazione sono le ra<strong>di</strong>ci dei cosiddetti polinomi <strong>di</strong> Chebychev <strong>di</strong> seconda specie.G Con w(x) = (1 − x) α (1 + x) β (per α > −1 e β > −1) e [a,b] = [−1,1] si hanno le formule <strong>di</strong> Gauss-Jacobi.G Con w(x) = x α e −x (per α > −1) e [a,b] = [0,+∞] si hanno le formule <strong>di</strong> Gauss-Laguerre.G Con w(x) = e −x2 e [a,b] = [−∞,+∞] si hanno le formule <strong>di</strong> Gauss-Hermite.139


9. INTEGRAZIONE NUMERICAFigura 9.5: Funzioni peso per le formule <strong>di</strong> quadratura <strong>di</strong> Gauss-Chebycev <strong>di</strong> prima e seconda specie (asinistra e a destra rispettivamente)Figura 9.6: Funzioni peso per le formule <strong>di</strong> quadratura <strong>di</strong> Gauss-Jacobi (con α = 2 e β = 4) e <strong>di</strong> Gauss-Laguerre(con α = 2) (a sinistra e a destra rispettivamente)Figura 9.7: Funzione peso per le formula <strong>di</strong> quadratura <strong>di</strong> Gauss-Hermite.9.7.4 Applicazione delle formuleSupponiamo <strong>di</strong> voler approssimare un integrale utilizzando le formule <strong>di</strong> Gauss-Legendre, ma in unintervallo <strong>di</strong>verso da [−1,1].Dobbiamo fare un cambio <strong>di</strong> variabili. Da ∫ ba f (x) d x dobbiamo passare a ∫ 1−1f (t) d t.Poniamo x = b − a2 t + b + a2Per t = −1 si ha x = b − a2 (−1) + b + a = −b + a + b + a = 2a = a. Quin<strong>di</strong> per t = −1, si ha x = a (il primo222estremo <strong>di</strong> un intervallo viene trasformato nel primo estremo dell’altro intervallo).Per t = 1 si ha x = b − a2 (1) + b + a = b − a + b + a = 2b 22 2 = b.Perciò, per t = 1, si ha x = b.Inoltre d x = b − a d t. Con la trasformazione <strong>di</strong> variabili si ha:2∫ b∫ 1( b − af (x) d x = fa−1 2 t + b + a ) b − ad t2 2140


9.8. <strong>Esercizi</strong>Applicando la formula <strong>di</strong> Gauss-Legendre∫ baf (x) d x ≈ b − a2n∑w G ii=0f ( b − a2 x i + b + a2 )9.7.5 Sulla funzione pesoSupponiamo <strong>di</strong> voler integrare una funzione g (x) in [a,b] (intervallo finito). Supponiamo che la funzioneintegranda g abbia una singolarità algebrica agli estremi (con una certa molteplicità), possiamo scrivereg (x) = f (x)(b − x) α (x − a) βAdesso, facciamo un cambiamento <strong>di</strong> variabile, da [a,b] a [−1,1], considerando la trasformazione x =b − a2 t + b + a2 .Si ha (b − x) = b − ab − a(1 − t) e (x − a) = (1 + t).2 2Allora∫ ba g (x) d x = b − a∫ 1−1 f ( b − a) α ( ) b − a β(1 − t) α (1 + t) β d t222 t + b + a ( b − a2 ) 2( ) b − a α+β+1∫ 1=−12f ( b − a2 t + b + a2 )(1 − t)α (1 + t) β d tPosso applicare le formule <strong>di</strong> Gauss-Jacobi e “scaricare” sulla funzione peso le singolarità della funzione<strong>di</strong> partenza.Sia dato l’integrale ∫ 10 f (x)(1 − x)p d x con f regolare e p intero elevato: allora (1 − x) p è una funzione cheha valori vicini a zero. La funzione da integrare è quasi <strong>di</strong>scontinua e le formule classiche (Trapezi o Cavalieri-Simpson) non danno buoni risultati. Si può pensare a questo integrale come ad un integrale <strong>di</strong> tipo Jacobi (sucui applicare la formula <strong>di</strong> Gauss-Jacobi) con α = p e β = 0. Si fa l’opportuno passaggio <strong>di</strong> variabili in mododa integrare sull’intervallo [−1,1]. La formula <strong>di</strong> Gauss incorpora nella funzione peso la parte che riguarda(1 − x) p .9.8 <strong>Esercizi</strong><strong>Esercizi</strong>o 9.8.1 Sia dato l’integrale I =∫ 0−2e −x (x + 1) dx.(a) Approssimare il valore dell’integrale applicando la formula dei trapezi con n = 5 sud<strong>di</strong>visioni in partiuguali dell’intervallo <strong>di</strong> integrazione.(b) Trovare una maggiorazione dell’errore commesso e, dopo aver calcolato analiticamente l’integraleesatto, confrontare tale stima con l’errore esatto.Svolgimento(a) Applichiamo la formula dei trapezi con n = 5 sud<strong>di</strong>visioni dell’intervallo dato. Vale, dunque, h = 0.4. Ipunti da considerare e il valore della f (x) = e −x (x + 1), sono:i x i f (x i )0 -2 -7.38905611 -1.6 -2.971819452 -1.2 -0.6640233853 -0.8 0.4451081864 -0.4 0.8950948195 0 1141


9. INTEGRAZIONE NUMERICALa formula dei trapezi èI tr ap = h( f (x 0) + f (x 5 )+ f (x 1 ) + f (x 2 ) + f (x 3 ) + f (x 4 )) = −2.196067152(b) Per calcolare una maggiorazione dell’errore commesso, dobbiamo calcolare la derivata seconda dellaf .Da f (x) = e −x (x + 1) segue f ′ (x) = −e −x (x + 1) + e −x = −e −x x e f ′′ (x) = e −x x − e −x = e −x (x − 1).Poichè f ′′ (x) è sempre negativa nell’intervallo <strong>di</strong> integrazione e a noi interessa la funzione valoreassoluto della f ′′ (x), stu<strong>di</strong>amo la funzione g (x) = |f ′′ (x)| = e −x (1 − x). Si ha che g ′ (x) = e −x (x − 2) < 0in [−2,0], quin<strong>di</strong> g è decrescente e ha valore massimo per x = −2. Si ha dunque che M = max|f ′′ (x)| =|f ′′ (−2)| = 22.1671682968Quin<strong>di</strong> |E tr ap | ≤ M |(b − a)3 |12 · 5 2 = 0.591124488Analiticamente, è facile calcolare l’integrale esatto (per parti):∫ 0∫ 0I = f (x) dx = −e −x (x + 1)| 0 −2 + e −x dx = −e −x (x + 2)| 0 −2 = −2−2−2Quin<strong>di</strong> l’errore esatto è: |I − I tr ap | = 0.196067154, un valore minore della maggiorazione trovataprima.<strong>Esercizi</strong>o 9.8.2 Sia dato l’integrale∫ 220 x − 4 d x(a) Dare una sua approssimazione con la formula dei trapezi e n = 4 sud<strong>di</strong>visioni in parti ugualidell’intervallo <strong>di</strong> integrazione.(b) Trovare una maggiorazione dell’errore commesso.(c) Confrontare l’errore esatto con la stima precedentemente trovata.(d) Dire in quanti sottointervalli occorre sud<strong>di</strong>videre l’intervallo <strong>di</strong> integrazione per ottenere unamaggiorazione dell’errore minore della tolleranza ɛ = 10 −5 .Svolgimento(a) Sud<strong>di</strong>videndo l’intervallo <strong>di</strong> integrazione [0,2] in n = 4 parti si trova un passo h = 2/4 = 1/2 = 0.5.La formula dei trapezi è:I T = b − a f (a) + f (b)( + f (x 1 ) + f (x 2 ) + f (x 3 ))n 2f (0) + f (2)= 0.5( + f (0.5) + f (1) + f (1.5))2= 0.5( −0.5 − 1 − 0.571428571 − 0.666666667 − 0.8)2= −1.39404762(b) Consideriamo la formula dell’errore: E = − f ′′ (ξ) (b − a) 312 n 2Da f (x) = 2x − 4 segue f ′ (x) =−2(x − 4) 2 e f ′′ 4(x) =(x − 4) 3 .Per maggiorare l’errore dobbiamo considerare che vale|E| ≤ max 0≤x≤2 |f ′′ (x)| (b − a) 312n 2 , da cui dobbiamo calcolare M = max 0≤x≤2 |f ′′ (x)|.142


9.8. <strong>Esercizi</strong>La funzione (x −4) 3 4è continua, crescente e sempre negativa nell’intervallo [0,2]. Quin<strong>di</strong> |(x − 4) 3 | =4(4 − x) 3 : osserviamo il cambiamento al denominatore. Poniamo g (x) = 4(4 − x) 3 . Risulta g ′ (x) =12(4 − x) 4 > in [0,2], quin<strong>di</strong> la g è crescente e ha valore massimo per x = 2. Perciò M = max 0≤x≤2 |f ′′ (x)| =|f ′′ (2)| = 4 2 3 = 1/2 = 0.5. Si ha allora la maggiorazione dell’errore |E| ≤ M 12(c) L’integrale esatto si calcola facilmente:2 34 2 = 148 = 0.0208333333∫ 2I =02x − 4 d x = 2ln(|x − 4|)|2 0 = 2ln(| − 2|) − 2ln(| − 4|) = 2ln(1/2) = ln(1/4) − 1.386294361L’errore esatto commesso con la formula dei trapezi è |I − I T | = 0.00775325793(d) Perchè la maggiorazione dell’errore sia minore della tolleranza ɛ = 10 −5 deve essere |E| ≤ M 12 n 2 ≤ 10−5cioè n 2 ≥ M 12 23 10 5 = 105 = 33333.333333. Quin<strong>di</strong> n > 182.574186, vale a <strong>di</strong>re n = 183.32 3<strong>Esercizi</strong>o 9.8.3 Dato l’integrale∫ 0.51I = d x1 − x20(a) si approssimi I con i valori Q 1 e Q 2 ottenuti applicando il metodo <strong>di</strong> Cavalieri-Simpson prima a tuttol’intervallo e poi sud<strong>di</strong>videndo l’intervallo in due parti uguali;(b) si approssimi I usando la formula <strong>di</strong> estrapolazione <strong>di</strong> Richardson;(c) dopo aver calcolato analiticamente il valore esatto <strong>di</strong> I , determinare l’errore esatto commesso conl’estrapolazione <strong>di</strong> Richardson.Svolgimento(a) Applichiamo la formula <strong>di</strong> Cavalieri-Simpson su tutto l’intervallo, considerando che l’ampiezzadell’intervallo è b − a = 0.5 e h = 0.25Q 1 = 0.25 (f (0) + 4f (0.25) + f (0.5)) = 0.5238235653Si ha, infatti, f (0) = 1, f (0.25) = 1.03279556 e f (0.5) = 1.15470054.Sud<strong>di</strong>videndo l’intervallo in due parti uguali, abbiamo h = 0.125, da cui i punti: x 0 = a = 0, x 1 =0.125, x 2 = 0.25, x 3 = 0.375, e x 4 = b = 0.5.Q 2 = h 3 (f (x 0) + 4(f (x 1 ) + 4f (x 3 )) + 2f (x 2 ) + f (x 4 )) = 0.523616326dove f (0.125) = 1.00790526, f (0.375) = 1.07871978 (essendo già in possesso <strong>degli</strong> altri valori, calcolatiper Q 1 )(b) La formula <strong>di</strong> estrapolazione <strong>di</strong> Richardson è: Q 3 = Q 2 + Q 2 −Q 1da cui ricaviamo Q 3 = 0.523602510115(c) Analiticamente l’integrale esatto è:∫ 0.51I = d x =0 1 − x2 arcsin(x)|0.5 0 = π/6 − 0 = 0.523598775L’errore esatto commesso con l’estrapolazione <strong>di</strong> Richardson è: |I −Q 3 | = 3.7351 · 10 −6 .143


9. INTEGRAZIONE NUMERICA<strong>Esercizi</strong>o 9.8.4 Si calcoli I = ∫ 52 sin( x) d x utilizzando il metodo <strong>di</strong> Gauss-Legendre con 3 punti <strong>di</strong>appoggio (x 1 = − (3/5), x 2 = 0, x 3 = (3/5); w 1 = w 3 = 5/9, w 1 = 8/9).SvolgimentoApplichiamo la formula, ricordandoci che dobbiamo utilizzarla non in [2,5] ma in [−1,1]. Considerandoche la trasformazione dall’intervallo [2,5] all’intervallo [−1,1] porta al cambiamento <strong>di</strong> variabili x = b − a2 t +b + a= 5 − 22 2 t + 5 + 2 = 3 2 2 t + 7 2 si ha d x = 3 d t. La formula <strong>di</strong> Gauss-Legendre deve essere applicata sui no<strong>di</strong>2trasformati dati da 3 2 x i + 7 . Perciò abbiamo2I G = 3 (w 1 f ( 3 2 2 x 1 + 7 2 ) + w 2 f ( 3 2 x 2 + 7 2 ) + w 3 f ( 3 2 x 3 + 7 )2 )= 1.5 ( (5/9)f (−1.161895004 + 3.5) + (8/9)f (3.5) + (5/9)f (1.161895004 + 3.5) )= 1.5(0.5550723689 + 0.8491794877 + 0.4621443545) = 2.799594317144


C A P I T O L O10EQUAZIONI ALLE DERIVATE ORDINARIEL’universo è un’equazione<strong>di</strong>fferenziale.Jules Henri Poincarè10.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14610.2 Sulle equazioni <strong>di</strong>fferenziali or<strong>di</strong>narie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14610.3 Metodo <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14710.4 Metodo <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14910.5 Metodo <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15210.6 Stu<strong>di</strong>o dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15310.7 Errori <strong>di</strong> troncamento locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15310.8 Convergenza e stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15410.8.1 Convergenza <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15410.8.2 Stabilità <strong>di</strong> Eulero esplicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15510.8.3 Convergenza <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15510.8.4 Stabilità <strong>di</strong> Eulero implicito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15610.8.5 Convergenza <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15610.8.6 Stabilità <strong>di</strong> Crank-Nicolson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15710.8.7 Sulla stabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15710.9 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158145


10. EQUAZIONI ALLE DERIVATE ORDINARIE10.1 IntroduzioneAll’inizio del ’900, van der Pol 1 stu<strong>di</strong>ò fenomeni non lineari e propose l’equazione <strong>di</strong>fferenzialey ′′ (t) + ɛ(y 2 (t) − 1)y ′ (t) + y(t) = 0Questa equazione governa l’intensità <strong>di</strong> corrente in un circuito oscillante a triodo e viene utilizzata nellostu<strong>di</strong>o <strong>di</strong> circuiti che contengano valvole termoioniche, i cosiddetti tubi a vuoto, come il tubo cato<strong>di</strong>co deltelevisore o il magnetron nei forni a micro-onde. La quantità ɛ in<strong>di</strong>ca l’intensità dello smorzamento nonlineare: quanto più ɛ è elevato tanto più il sistema perde energia rapidamente.L’equazione <strong>di</strong>fferenziale del secondo or<strong>di</strong>ne si può ricondurre ad un sistema <strong>di</strong> equazioni <strong>di</strong>fferenzialidel primo or<strong>di</strong>ne. Ponendo u = (u 1 ,u 2 ) = (y, y ′ ) si ha( u′1u ′ 2) ()u 2=−ɛ((u 1 ) 2 − 1)u 2 − u 1Come si risolve numericamente un sistema <strong>di</strong> equazioni <strong>di</strong>fferenziali come quello appena scritto? Inquesto Capitolo, daremo una piccola introduzione a meto<strong>di</strong> numerici che permettono <strong>di</strong> risolvere equazioni<strong>di</strong>fferenziali del primo or<strong>di</strong>ne.10.2 Sulle equazioni <strong>di</strong>fferenziali or<strong>di</strong>narieVogliamo trovare una funzione y(t) che sod<strong>di</strong>sfi la seguente equazione <strong>di</strong>fferenziale or<strong>di</strong>naria ( ODE:Or<strong>di</strong>nary Differential Equation) (del primo or<strong>di</strong>ne):dy= f (t, y),dt a≤ t ≤ bLa funzione f (t, y) è assegnata. Ci riferiamo a t come alla variabile in<strong>di</strong>pendente. Allora y = y(t) è tale chey ′ = y ′ (t) = dy(t) è esattamente la f (t, y(t)).dtEsempio 10.2.1 Sia f (t, y) = −y + t definita per t ≥ 0 e per qualunque y reale. Si hay ′ = −y + t, t ≥ 0Si verifica che, per qualunque scalare α la funzione y(t) = t − 1 + αe −t sod<strong>di</strong>sfa la ODE.Se, inoltre, è assegnato un valore iniziale, per esempio y(0) = 1, allora, dovendo essere −1 + α = y(0) = 1,risulta α = 2. Assegnare una soluzione iniziale determina un’unica soluzione all’ODE. Si parla <strong>di</strong> problemaa valori iniziali (IVP).Nel caso in cui y(0) = 1 si ricava l’unica soluzione y(t) = t − 1 + 2e −t .Problemi in cui abbiamo equazioni alle derivate or<strong>di</strong>narie <strong>di</strong> or<strong>di</strong>ne più elevato possono essere trasformatiin sistemi equivalenti <strong>di</strong> equazioni del primo or<strong>di</strong>ne.1 Balthasar van der Pol (1889-1959) fu un fisico e matematico olandese. Nel 1916 lavorò per un anno con l’ingegnere John AmbroseFleming a Londra (Fleming aveva già inventato il <strong>di</strong>odo nel 1904). Si trasferì successivamente a Cambridge e iniziò una collaborazionecon John Joseph Thomson al Caven<strong>di</strong>sh Laboratory (Thomson aveva scoperto l’elettrone nel 1897). Qui <strong>di</strong>venne amico <strong>di</strong> Edward Appletonche, nel 1947, ricevette il premio Nobel per la fisica per i suoi contributi alla conoscenza della ionosfera – stu<strong>di</strong> fatti insieme avan der Pol. La loro collaborazione riguardò anche lo stu<strong>di</strong>o <strong>di</strong> fenomeni non lineari usando circuiti trio<strong>di</strong> per verificare le loro teorie.Quando van del Pol rientrò in Olanda, continuò a occuparsi <strong>di</strong> ottica, elettromagnetismo, onde ra<strong>di</strong>o e fisica atomica. Il nome <strong>di</strong> vander Pol è associato con l’equazione <strong>di</strong>fferenziale che porta il suo nome. Questa equazione apparve per la prima volta sul suo articolo Onrelaxation oscillation pubblicato sulla rivista Philosophical Magazine nel 1926.146


10.3. Metodo <strong>di</strong> Eulero esplicitoEsempio 10.2.2 La seconda legge del moto <strong>di</strong> Newton F = ma è una ODE del secondo or<strong>di</strong>ne in quantoa = y ′′ (dove y è la coor<strong>di</strong>nata della posizione).Allora la ODE ha la formay ′′ = F /mcon F forza e m la massa. Definendo u 1 = y e u 2 = y ′ si ha il sistema (equivalente all’equazione <strong>di</strong> prima)<strong>di</strong> due equazioni del primo or<strong>di</strong>ne <strong>di</strong> ODE:( u′) ( )1u2u2′ =F /mPossiamo ora usare meto<strong>di</strong> che risolvono equazioni del primo or<strong>di</strong>ne per risolvere questo sistema. La primacomponente della soluzione u 1 ci dà il valore y dell’equazione da cui siamo partiti. La seconda componenteu 2 ci dà la velocità y ′ .Sistemi del primo or<strong>di</strong>ne <strong>di</strong> ODE hanno la formaSistemi <strong>di</strong>ODEy ′ (t) = f(t,y)dove y : R −→ R n con y = (y 1 y 2 ... y n ), f : R n+1 −→ R n e y ′ (t) = dy/d t denota la derivata rispetto a t (percui la i -sima componente del vettore derivata è data da y ′ i (t) = d y i (t)/d t). La funzione f è assegnata e noivogliamo determinare il vettore <strong>di</strong> funzioni y che sod<strong>di</strong>sfa l’ODE.Per semplicità noi stu<strong>di</strong>eremo il caso <strong>di</strong> una singola equazione scalare, n = 1. Ma l’approccio è del tuttosimile nel caso <strong>di</strong> sistemi <strong>di</strong> equazioni del primo or<strong>di</strong>ne.Sia data l’ODEy ′ = f (t, y(t))a ≤ t ≤ bcon valore inizialey(a) = y a .Per risolvere questa ODE <strong>di</strong>scretizziamo l’intervallo [a,b] in n + 1 punti equi<strong>di</strong>stanti (per semplicità): t i =a + i h, h = 0,1,...,n, con h = (b − a)/n.Il passo <strong>di</strong> <strong>di</strong>scretizzazione (temporale se t assume il significato della variabile temporale) è dunque h.Nelle applicazioni pratiche, il passo h è variabile (cioè i punti non sono equi<strong>di</strong>stanti), tuttavia, per capiremeglio come funzionano i meto<strong>di</strong>, noi useremo sempre un passo h costante.Sia y(t) la soluzione esatta del nostro problema a valori iniziali. Allora y(t i ) è il valore esatto dellasoluzione calcolata nel punto t i .In<strong>di</strong>chiamo invece con y i il valore approssimato al tempo t i che ricaviamo applicando un metodonumerico che risolve il problema proposto.10.3 Metodo <strong>di</strong> Eulero esplicitoCon il metodo <strong>di</strong> Eulero 2 esplicito approssimiamo la derivata y ′ me<strong>di</strong>ante la formula <strong>di</strong> Taylor (delsecondo or<strong>di</strong>ne) applicata al punto t i :y(t) = y(t i ) + (t − t i )y ′ (t i ) + (t − t i ) 2y ′′ (ξ i )22 Leonhard Euler (1707-1783) fu un matematico svizzero. Fu studente <strong>di</strong> Johann Bernoulli che comprese le sue gran<strong>di</strong> potenzialitàe favorì i suoi stu<strong>di</strong>. Eulero è noto soprattutto per i suoi contributi nel campo della geometria, della teoria dei numeri, delle equazioni<strong>di</strong>fferenziali, del calcolo delle variazioni. È lui che introdusse il simbolo f (x) per in<strong>di</strong>care le funzioni, e per la base naturale, i per lara<strong>di</strong>ce quadrata <strong>di</strong> −1, <strong>di</strong> π, il simbolo <strong>di</strong> sommatoria ∑ e altri ancora.147


10. EQUAZIONI ALLE DERIVATE ORDINARIELa quantità (t − t i ) 2y ′′ (ξ i ) è il resto della formula <strong>di</strong> Taylor con ξ i un punto opportuno nel segmento <strong>di</strong>2estremi t e t i .Pren<strong>di</strong>amo come t il valore t i + h vale a <strong>di</strong>re t i+1 , da cui si ha t − t i = t i+1 − t i = h. Sostituendo si ottiene:y(t i+1 ) = y(t i ) + hy ′ (t i ) + h22 y′′ (ξ i )Esplicitando y ′ (t i ) rispetto agli altri termini si ha:y ′ (t i ) = y(t i+1) − y(t i )− h h 2 y′′ (ξ i )Ora si sostituisce il valore trovato per y ′ (t i ) nella ODE y ′ = f (t, y(t)) per t = t i :y(t i+1 ) − y(t i )− h h 2 y′′ (ξ i ) = f (t i , y(t i ))Trascurando il termine h 2 y′′ (ξ i ) non abbiamo più i valori della soluzione esatta, ma otterremo i valori dellasoluzione approssimata. Scriviamo dunque:y i+1 − y ih= f (t i , y i )La formula <strong>di</strong> Eulero esplicito è: y i+1 = y i + h f (t i , y i ).La formula è <strong>di</strong> tipo esplicito perchè per passare dal livello i al livello i + 1 sfruttiamo i dati che giàconosciamo del livello i , dati che sono tutti espliciti.Si parte infatti da y 0 = y(t 0 ) = y(a) = y a e si ricava:y 1 = y 0 + f (t 0 , y 0 )y 2 = y 1 + f (t 1 , y 1 ). = . . .Un altroapproccioSi arriva alla stessa formula integrando l’ODE e approssimando l’integrale della f me<strong>di</strong>ante il valore inf (t 0 , y(t 0 )): da y ′ = f (t, y(t)) integrando ambo i membri da t 0 a t, otteniamo∫ tt 0∫d ytd t d t =t 0f (t, y(t)) d t =⇒∫ y(t)y 0d y =∫ tt 0f (t, y(t)) d tAl secondo membro, approssiamo ∫ tt 0f (t, y(t)) d t me<strong>di</strong>ante il valore (t − t 0 )f (t 0 , y(t 0 )) (approssimiamo la fme<strong>di</strong>ante la retta f (t 0 , y(t 0 ))).Abbiamo:y(t) = y 0 + (t − t 0 )f (t 0 , y 0 )) + errore della formula <strong>di</strong> quadratura.Per t = t 1 , numericamente: y 1 = y 0 + h f (t 0 , y 0 )).Ai passi successivi: y i+1 = y i + h f (t i , y i ))Esempio 10.3.1 Supponiamo <strong>di</strong> applicare il metodo <strong>di</strong> Eulero esplicito alla ODE y ′ = −y con passo h apartire dal punto iniziale t 0 = 0 e avanziamo al tempo t 1 = t 0 + hy 1 = y 0 + h f (t 0 , y 0 ) = y 0 − hy 0 = (1 − h)y 0Il valore che ottienamo y 1 è affetto da errore: y 1 ≠ y(t 1 ) Per esempio, se per t 0 si ha y 0 = 1, la soluzione esattaè y(t) = e −t . Per h = 0.5, si ha y 1 = 0.5 mentre y(0.5) = e −0.5 ≈ 0.60653148


10.4. Metodo <strong>di</strong> Eulero implicitoDa un punto <strong>di</strong> vista geometrico (si veda la Figura 10.1), il valore in t i+1 è approssimato utilizzando il valoredella retta la cui pendenza è data da f (t i , y i ): è come se ad ogni passo cercassimo <strong>di</strong> risolvere il problema avalori iniziali:Interpretazionegeometricay ′ (t) = f (t, y(t))y(t i ) = y iper cui il valore che otteniamo per il tempo t i+1 è tangente alla traiettoria della soluzione <strong>di</strong> questo IVP.Figura 10.1: Interpretazione geometrica del metodo <strong>di</strong> Eulero esplicito. Si è considerato il problema y ′ = −ycon y(0) = 1 la cui soluzione esatta è y(t) = e −t . I valori numerici ottenuti dal metodo <strong>di</strong> Eulero esplicito sonocerchiati e si trovano sulla linea spezzata che li interpola. La linea spezzata è tangente, all’inizio <strong>di</strong> ogni passo,alla traiettoria che passa per il corrispondente punto, soluzione del problema y ′ = −y con y(t i ) = y i .10.4 Metodo <strong>di</strong> Eulero implicitoSe applichiamo la formula <strong>di</strong> Taylor <strong>di</strong> punto iniziale t i+1 , abbiamoy(t) = y(t i+1 ) + (t − t i+1 )y ′ (t i+1 ) + (t − t i+1) 2y ′′ (ξ i )2Per t = t i , si ha t − t i+1 = t i − t i+1 = t i − (t i + h) = −h. Sostituendo, abbiamo:y(t i ) = y(t i+1 ) − hy ′ (t i+1 ) + h22 y′′ (ξ i )Otteniamo quin<strong>di</strong>y ′ (t i+1 ) = y(t i+1) − y(t i )+ h h 2 y′′ (ξ i )149


10. EQUAZIONI ALLE DERIVATE ORDINARIEAndando a sostituire nella ODE al tempo t i+1 , si ha :y(t i+1 ) − y(t i )+ h h 2 y′′ (ξ i ) = f (t i+1 , y(t i+1 ))Trascurando il termine del resto <strong>di</strong> Taylor h 2 y′′ (ξ i ) abbiamo:y i+1 − y ih= f (t i+1 , y i+1 ))La formula <strong>di</strong> Eulero implicito vale y i+1 = y i + h f (t i+1 , y i+1 )).La <strong>di</strong>fferenza rispetto alla formula esplicita è che la f è valutata non più al tempo t i ma al tempo t i+1 Quin<strong>di</strong>il calcolo <strong>di</strong> y i+1 <strong>di</strong>pende implicitamente da y i+1 stesso! La valutazione <strong>di</strong> y i+1 <strong>di</strong>venta quin<strong>di</strong> più laboriosae complicata (se si ha un’equazione non lineare in y i+1 , la si risolve tramite un metodo <strong>di</strong> punto fisso o <strong>di</strong>Newton-Raphson). In termini <strong>di</strong> accuratezza si hanno risultati migliori.Esempio 10.4.1 Consideriamo sempre y ′ = −y con y(0) = 1 (soluzione esatta y(t) = e −t ).Il metodo <strong>di</strong> Eulero implicito <strong>di</strong>venta: y i+1 = y i − hy i+1 ovvero (1 + h)y i+1 = y iLa soluzione numerica è y i+1 =y i(1 + h) .Per h = 0.5 ricaviamo y 1 = 0.66667 contro un valore esatto y(1) ≈ 0.60653.Esempio 10.4.2 Si abbia l’equazione y ′ = −y 3 con con<strong>di</strong>zione iniziale y(0) = 1. Usando il metodo <strong>di</strong> Euleroimplicito con passo h = 0.5, per ricavare y 1 otteniamo l’equazione implicitay 1 = y 0 + h f (t 1 , y 1 ) = 1 − 0.5y 3 1Questa equazione non lineare in y 1 può essere risolta me<strong>di</strong>ante metodo <strong>di</strong> punto fisso (x = g (x) = 1−0.5x 3 )oppure utilizzando il metodo <strong>di</strong> Newton-Raphson per F (x) = 0 con F (x) = x −1+0.5x 3 ) . L’approssimazioneiniziale per ottenere y 1 può essere o la soluzione al passo precedente, y 0 , oppure usare il metodo <strong>di</strong> Euleroesplicito, che dà y 1 = y 0 − 0.5y 3 0 = 0.5. Otteniamo, come y 1 il valore finale y 1 ≈ 0.7709.Esempio 10.4.3 Vogliamo <strong>di</strong>scretizzare il problema <strong>di</strong> Cauchyy ′ = −y 2y(0) = 1con passo h = 0.1 applicando il metodo <strong>di</strong> Eulero esplicito per ricavare y 1 e y 2 .Il metodo <strong>di</strong> Eulero esplicito è:y i+1 = y i + h f (t i , y i ) = y i + h(−y 2 i ) = y i − hy 2 iPartendo da y 0 = 1 si ricava:y 1 = 1 − 0.1(1 2 ) = 0.9y 2 = 0.9 − 0.1(0.9 2 ) = 0.819150


10.4. Metodo <strong>di</strong> Eulero implicitoPer confronto, calcoliamo la soluzione esatta y(t) = 1t + 1 , ottenendo:y(t 1 ) = y(0.1) = 1/(0.1 + 1) = 0.9090909090y(t 2 ) = y(0.2) = 1/(0.2 + 1) = 0.8333333333Applichiamo ora il metodo <strong>di</strong> Eulero implicito con lo stesso passo h = 0.1.y i+1 = y i + h f (t i+1 , y i+1 ) = y i − hy 2 i+1Per ricavare y 1 la formula <strong>di</strong>venta:y 1 = y 0 + h f (t 1 , y 1 ) = 1 − 0.1(y 2 1 )Abbiamo un’equazione non lineare in y 1 . Per trovare y 1 , possiamo pensare <strong>di</strong> applicare lo schema <strong>di</strong> puntofisso alla funzione g (y) = 1 − 0.1(y 2 ) partendo da y (0) = y 0 = 1, in quanto y 1 = g (y 1 ) è punto fisso per lafunzione g . Applichiamo tre passi dello schema <strong>di</strong> punto fisso:y (1) = g (y (0) ) = 1 − 0.1(1 2 ) = 0.9y (2) = g (y (1) ) = 1 − 0.1(0.9 2 ) = 0.919y (3) = g (y (2) ) = 1 − 0.1(0.919 2 ) = 0.9155439Se pren<strong>di</strong>amo y (3) come approssimazione <strong>di</strong> y 1 ricaviamo y 1 = 0.9155439 (per confronto, il valore esatto è0.90909090).Calcoliamo ora y 2 :y 2 = y 1 + h f (t 2 , y 2 ) = 0.9155439 − 0.1(y 2 2 )Ora la funzione <strong>di</strong> punto fisso <strong>di</strong>venta g (y) = 0.9155439 − 0.1(y 2 ). Applichiamo lo schema <strong>di</strong> punto fissopartendo da y (0) = y 1 = 0.9155439.y (1) = g (y (0) ) = 0.9155439 − 0.1(0.9155439 2 ) = 0.8317218367y (2) = g (y (1) ) = 0.9155439 − 0.1(0.8317218367 2 ) = 0.8463677786y (3) = g (y (2) ) = 0.9155439 − 0.1(0.8463677786 2 ) = 0.8439100583Troviamo quin<strong>di</strong> y 2 = 0.8439100583 (valore esatto 0.8333333333).Ve<strong>di</strong>amo cosa accade in Eulero implicito se il punto iniziale del metodo <strong>di</strong> punto fisso è dato da un passodel metodo <strong>di</strong> Eulero esplicito.Per ricavare y 1 , considero come y (0) = y 0 + h f (t 0 , y 0 ) = 1 − 0.1 = 0.9In tal caso, l’approssimazione iniziale è quella che, nel caso <strong>di</strong> prima, era il valore y (1) .Applichiamo tre volte lo schema <strong>di</strong> punto fisso:y (1) = g (y (0) ) = 1 − 0.1(0.9 2 ) = 0.919y (2) = g (y (1) ) = 1 − 0.1(0.919 2 ) = 0.9155439y (3) = g (y (2) ) = 1 − 0.1(0.9155439 2 ) = 0.9161779367Quin<strong>di</strong> y 1 = 0.9161779367.Al secondo passo, lo schema <strong>di</strong> punto fisso è dato dalla funzione g (y) = y 1 − h(y 2 ) = 0.9161779367 − 0.1y 2 .Come approssimazione iniziale pren<strong>di</strong>amo y (0) = y 1 + h f (t 1 , y 1 ) = g (y 1 ) = 0.8322397355. Si ha:y (1) = g (y (0) ) = 0.9161779367 − 0.1(0.8322397355 2 ) = 0.8469156390y (2) = g (y (1) ) = 0.9161779367 − 0.1(0.8469156390 2 ) = 0.8444513267y (3) = g (y (2) ) = 0.9161779367 − 0.1(0.84445132672) = 0.8448681324Ricaviamo y 2 = 0.8448681324.151


10. EQUAZIONI ALLE DERIVATE ORDINARIE10.5 Metodo <strong>di</strong> Crank-NicolsonPartiamo dall’ODE 3 y ′ = f (t, y(t)). Integriamo ambo i membri dell’equazione sull’intervallo [t i , t i+1 ]:∫ y(ti+1 )y(t i )dy =∫ ti+1t if (t, y(t)) dt =⇒ y(t i+1 ) − y(t i ) =∫ ti+1t if (t, y(t)) dtA secondo membro, applichiamo la formula dei trapezi trascurando l’errore <strong>di</strong> integrazione:y i+1 − y i = h 2 [f (t i , y i ) + f (t i+1 , y i+1 )]Si ha la formula <strong>di</strong> Crank-Nicolson: y i+1 = y i + h 2 [f (t i , y i ) + f (t i+1 , y i+1 )]AltroapproccioLa stessa formula la si può ricavare prendendo la me<strong>di</strong>a aritmetica delle formule <strong>di</strong> Eulero esplicito eimplicito:y i+1 − y i = h f (t i , y i )y i+1 − y i = h f (t i+1 , y i+1 )sommando e <strong>di</strong>videndo per 2:y i+1 − y i = h 2 [f (t i , y i ) + f (t i+1 , y i+1 )] =⇒ y i+1 = y i + h 2 [f (t i , y i ) + f (t i+1 , y i+1 )]Esempio 10.5.1 Lo stesso esempio <strong>di</strong> prima (y ′ = −y con y(0) = 1) risolto con Crank-Nicolson dà: y i+1 =y i + h 2 [−y i − y i+1 )] cioè(1 + h 2 )y i+1 = (1 − h ( ) 2 − h2 )y i =⇒ (2 + h)y i+1 = (2 − h)y i =⇒ y i+1 = y i2 + hPer h = 0.5, confrontiamo i valori ottenuti dai meto<strong>di</strong> <strong>di</strong> Eulero esplicito, implicito e Crank-Nicolson, con lasoluzione esatta:t i y(t i ) y i Eul. Espl. y i Eul. Impl. y i C-N0.0 1.000000 1.0000000 1.000000 1.0000000.5 0.606531 0.5000000 0.666667 0.6000001.0 0.367879 0.2500000 0.444444 0.3600001.5 0.223130 0.1250000 0.296296 0.2160002.0 0.135335 0.0625000 0.197531 0.1296002.5 0.082085 0.0312500 0.131687 0.0777603.0 0.049787 0.0156250 0.087791 0.0466563.5 0.030197 0.0078125 0.058528 0.0279944.0 0.018316 0.0039062 0.039018 0.0167963 John Crank (1916-2006) è stato un matematico inglese che si è de<strong>di</strong>cato soprattutto allo stu<strong>di</strong>o <strong>di</strong> soluzioni numeriche <strong>di</strong> equazionialle derivate parziali, in particolare <strong>di</strong> problemi <strong>di</strong> conduzione del calore. È noto soprattutto per il lavoro svolto con Phyllis Nicolson.Phyllis Nicolson (1917-1968) è stata una matematica inglese. Negli anni della seconda guerra mon<strong>di</strong>ale lavorò sulla teoria delmagnetron. È nota, appunto, per il metodo <strong>di</strong> Crank-Nicolson.152


10.6. Stu<strong>di</strong>o dell’errore10.6 Stu<strong>di</strong>o dell’erroreNel costruire i meto<strong>di</strong> (<strong>di</strong> Eulero esplicito, implicito, Crank-Nicolson) abbiamo trascurato un termine (ilresto della formula <strong>di</strong> Taylor o l’errore della formula dei trapezi): questo termine che abbiamo trascuratorappresenta l’errore <strong>di</strong> troncamento locale. Nel caso <strong>di</strong> Eulero esplicito avevamo (usando la formula <strong>di</strong>Taylor):y ′ (t i+1 ) = y(t i+1) − y(t i )− h h 2 y′′ (ξ i ) = f (t i , y(t i ))Per costruire il metodo, abbiamo trascurato il termine del resto, vale a <strong>di</strong>re la quantitàd i = y(t i+1) − y(t i )− f (t i , y(t i )) = h h2 y′′ (ξ i ) = O (h)Questa quantità ci <strong>di</strong>ce <strong>di</strong> quanto la soluzione esatta “fallisce” nel sod<strong>di</strong>sfare la relazione della formula <strong>di</strong>Eulero esplicito e rappresenta l’errore <strong>di</strong> troncamento locale.Definizione 10.6.1 Si definisce errore totale <strong>di</strong> troncamento ε i la quantità:ε i = y(t i ) − y i .Ci aspettiamo che sia dello stesso or<strong>di</strong>ne <strong>di</strong> grandezza dell’errore <strong>di</strong> troncamento locale.Definizione 10.6.2 Per effetto dell’arrotondamento, al tempo t i al posto <strong>di</strong> y i otteniamo il valore arrotondatoy i . Si definisce errore totale <strong>di</strong> arrotondamento la quantità:ε i = y i − y iDefinizione 10.6.3 L’errore globale dello schema numerico è dato dal contributo dell’errore totale <strong>di</strong>troncamento e dell’errore totale <strong>di</strong> arrotondamentoɛ i = y(t i ) − y i = ε i + ε iGli errori <strong>di</strong> arrotondamento nell’approssimare la derivata prima <strong>di</strong> una funzione si comportano comeO ( 1 ) (si veda l’esempio fatto sulla propagazione <strong>degli</strong> errori a pag. 30). Tuttavia questo aspetto <strong>di</strong>venta secondarionella risoluzione delle ODE sia perchè il passo h nelle applicazioni non è mai troppo (esagerata-hmente) piccolo per ragioni <strong>di</strong> efficienza sia perchè è la y e non la y ′ la funzione che dobbiamo approssimare.Inoltre, nell’eseguire i calcoli in doppia precisione (come si fa nei moderni linguaggi <strong>di</strong> programmazione),l’aspetto dovuto all’arrotondamento si vede poco rispetto ad altri fenomeni che influenzano la propagazione<strong>degli</strong> errori.10.7 Errori <strong>di</strong> troncamento localeG Nel metodo <strong>di</strong> Eulero esplicito:G Nel metodo <strong>di</strong> Eulero implicito:d i = y(t i+1) − y(t i )− f (t i , y(t i )) = h h2 y′′ (ξ i ) = O (h)d i = y(t i+1) − y(t i )− f (t i , y(t i+1 )) = − h h2 y′′ (ξ i ) = O (h)153


10. EQUAZIONI ALLE DERIVATE ORDINARIEG Nel metodo <strong>di</strong> Crank-Nicolson (derivando la formula dai trapezi e includendo il termine dell’errore):y(t i+1 ) − y(t i ) = h 2 [f (t i , y(t i )) + f (t i+1 , y(t i+1 ))] − f ′′ (τ i ,ξ i )h 312dove τ i e ξ i sono opportuni punti. Ma f = y ′ da cui f ′ = y ′′ e f ′′ = y ′′′ .Perciòy(t i+1 ) − y(t i ) = h 2 [f (t i , y(t i )) + f (t i+1 , y(t i+1 ))] − y′′′ (ξ i )h 312d i = y(t i+1) − y(t i )h10.8 Convergenza e stabilitàDefinizione 10.8.1 Un metodo si <strong>di</strong>ce convergente se lim h→0− 1 2 [f (t i , y(t i )) + f (t i+1 , y(t i+1 ))] = − y′′′ (ξ i )h 2 = O (h 2 )12i→+∞ɛ i = 0 cioè se l’errore va a zero al tendere delpasso h a zero e <strong>di</strong> i all’infinito in modo che il prodotto i h si mantenga costante (così t 0 +i h tende ad un valore<strong>di</strong> t fissato: stu<strong>di</strong>amo l’errore fissato t).Esempio 10.8.1 Ve<strong>di</strong>amo come, fissato un certo istante t, possiamo fare tendere h a zero e far crescere iall’infinito in modo che t 0 + i h sia sempre uguale a t. Sia t 0 = 0 e t = 0.5:h i i h0.5 1 0.50.25 2 0.50.125 4 0.50.0625 8 0.5...2.4414e-4 2048 0.5Definizione 10.8.2 Un metodo si <strong>di</strong>ce stabile se l’errore iniziale si mantiene limitato al crescere <strong>di</strong> i (per i → ∞):con M costante positiva.|ɛ i | ≤ M|ɛ 0 |Stu<strong>di</strong>eremo la convergenza e la stabilità dei meto<strong>di</strong> <strong>di</strong> Eulero esplicito, implicito e Crank-Nicolsonapplicati all’equazione test y ′ = −λy (λ > 0 in modo che −λ < 0) con con<strong>di</strong>zione iniziale y(0) = y 0 .La soluzione esatta <strong>di</strong> questo IVP è y(t) = y 0 e −λt : tende a zero per valori <strong>di</strong> t crescenti. Ci aspettiamo cheanche la soluzione numerica si comporti in maniera simile.10.8.1 Convergenza <strong>di</strong> Eulero esplicitoPer semplicità, applichiamo la formula del metodo <strong>di</strong> Eulero esplicito all’equazione test con λ = 1.y 1 = y 0 + h f (t 0 , y 0 ) = y 0 − hy 0 = (1 − h)y 0y 2 = y 1 + h f (t 1 , y 1 ) = y 1 − hy 1 = (1 − h)y 1.y i = y i−1 + h f (t i−1 , y i−1 ) = y i−1 − hy i−1 = (1 − h)y i−1154


10.8. Convergenza e stabilitàAndando a ritroso troviamo una formula che lega y i <strong>di</strong>rettamente a y 0 .y 1 = (1 − h)y 0y 2 = (1 − h)y 1 = (1 − h) 2 y 0.y i = (1 − h)y i−1 = (1 − h) i y 0La soluzione numerica al tempo t i è data da y i = (1 − h) i y 0 . Fissato un tempo t = i h, ve<strong>di</strong>amo secioè selimh→0i→+∞y i = y(t).i h⎡1⎤Osserviamo che: (1 − h) i = (1 − h) h = ⎣(1 − h) h ⎦Ricor<strong>di</strong>amo la proprietà per la quale x α = e ln(xα) = e αln(x) .1ln(1 − h)tlimh→0i→+∞Perciò: (1 − h) h = e ln(1−h)( 1/h) = e hQuando facciamo il limite per h → 0 e per i → +∞ consideriamo che, per il teorema dell’ Hôpital, valeDi conseguenza lim h→0 e h ln(1−h) = e −1Alloralimh→0i→+∞1y i = limh→0i→+∞ln(1 − h) −1lim = limh→0 h h→0 1 − h = −1⎡y 0 (1 − h) i = lim y 0 h→0i→+∞1⎤t⎣(1 − h) h ⎦ = y 0 e −t = y(t)ɛ i = 0In questo modo abbiamo provato che il metodo converge. Il <strong>di</strong>scorso si ripete in maniera del tutto simile,per λ ≠ 1.10.8.2 Stabilità <strong>di</strong> Eulero esplicitoDobbiamo provare che l’errore si mantiene limitato. Sia λ > 0. Abbiamo y i+1 = y i −hλy i = (1−hλ)y i , valea <strong>di</strong>re y i+1 = (1−hλ) i+1 y 0 La soluzione esatta <strong>di</strong> questo problema è y(t) = y 0 e −λt e tende a zero per valori <strong>di</strong> tcrescenti. Vogliamo che tenda a zero anche la soluzione numerica (in modo da mantenere limitato l’errore).La soluzione numerica (fissato h e per i grande, cioè per valori <strong>di</strong> t crescente) tende a zero se |1−hλ| < 1 cioèper −1 < 1 − hλ < 1 ⇐⇒ 0 < hλ < 2 ⇐⇒ h < 2 λ .Il metodo <strong>di</strong> Eulero esplicito è stabile sotto con<strong>di</strong>zione.10.8.3 Convergenza <strong>di</strong> Eulero implicitoIl metodo <strong>di</strong> Eulero implicito applicato all’equazione test <strong>di</strong>venta:y i+1 =y i(1 + hλ)155


10. EQUAZIONI ALLE DERIVATE ORDINARIEQuin<strong>di</strong>y 0y 1 =(1 + hλ)y 1y 2 =(1 + hλ) = y 0(1 + hλ) 2y 2y 3 =(1 + hλ) = y 0(1 + hλ) 3.y i =y i−1(1 + hλ) = y 0(1 + hλ) iIn tal casolimh→0i→+∞y i = limh→0i→+∞y 0(1 + hλ) i = limh→0i→+∞⎡1⎤y 0 (1 + hλ) −i = y 0⎣(1 + hλ) h ⎦(i passaggi sono del tutto simili a quelli visti per Eulero esplicito).Abbiamo provato la convergenza.−i h= y 0 e −tλ10.8.4 Stabilità <strong>di</strong> Eulero implicitoy 0Per la stabilità, si vede che la soluzione è y i =(1 + λh) i1Per i → +∞, qualunque sia il valore <strong>di</strong> h, la soluzione tende a zero in quanto lim i→+∞(1 + λh) i = 0 Siparla <strong>di</strong> metodo incon<strong>di</strong>zionatamente stabile.10.8.5 Convergenza <strong>di</strong> Crank-NicolsonIl metodo <strong>di</strong> Crank-Nicolson applicato all’equazione test <strong>di</strong>venta: y i+1 = y i + hλ2 [−y i − y i+1 ] da cuiAndando a ritroso si ricava( ) 2 − hλy i+1 = y i2 + hλ( ) 2 − hλ i+1y i+1 = y 02 + hλPer verificare che il metodo converge stu<strong>di</strong>amo il limitelimh→0i→+∞⎡( ) 2 − hλ i ( ) 1 ⎤⎢ 2 − hλ= ⎣h ⎥⎦2 + hλ 2 + hλi hy i . Partiamo dalla relazione⎡( ) 1 ⎤t⎢ 2 − hλ= ⎣h ⎥⎦2 + hλMa( 2 − hλ2 + hλ) 1 1 2 − hλln(h = e h 2 + hλ )156


10.8. Convergenza e stabilitàNel fare il limite per h → 0 e i → +∞ della quantità che si trova all’esponente, applichiamo l’Hôpital ericor<strong>di</strong>amo che la derivata <strong>di</strong> 2 − hλ −λ(2 + hλ) − (2 − hλ)λvale2 + hλ (2 + hλ) 2 = −4λ(2 + hλ) 2 :Quin<strong>di</strong>limh→0i→+∞ln( 2 − hλ2 + hλ )limh→0i→+∞La convergenza è provata.hy i = limh→0i→+∞= limh→0i→+∞( 2 − hλy 02 + hλ2 + hλ −4λ2 − hλ (2 + hλ) 2 = lim −4λh→0 (2 + hλ)(2 − hλ) = −λ) i= limh→0i→+∞i→+∞⎡( ) 1 ⎤⎢ 2 − hλy 0 ⎣h ⎥⎦2 + hλi h= y 0 e −tλ10.8.6 Stabilità <strong>di</strong> Crank-Nicolson( ) 2 − λh iPer la stabilità, si vede che la soluzione numerica è y i = y 0 . Per i → +∞, qualunque sia il valore2 + λh( ) 2 − λh i<strong>di</strong> h, la soluzione tende a zero in quanto lim i→+∞ = 0. Il metodo è incon<strong>di</strong>zionatamente stabile.2 + λh10.8.7 Sulla stabilitàLa stabilità <strong>di</strong> questi meto<strong>di</strong> la si può verificare anche considerando <strong>di</strong>rettamente l’errore ɛ i , <strong>di</strong>mostrandoche gli errori al passo i e al passo i +1 verificano la stessa relazione che hanno y i+1 e y i e mostrando che l’errorerimane limitato sotto con<strong>di</strong>zione per Eulero esplicito mentre è incon<strong>di</strong>zionatamente stabile per gli altrimeto<strong>di</strong>. In Figura 10.2 si vede come il metodo <strong>di</strong> Eulero esplicito sia stabile sotto con<strong>di</strong>zione mentre i meto<strong>di</strong><strong>di</strong> Eulero implicito e Crank-Nicolson sono stabili qualunque passo <strong>di</strong> <strong>di</strong>scretizzazione venga utilizzato.Esempio 10.8.2 Consideriamo il metodo <strong>di</strong> Eulero esplicito e applichiamolo all’equazione test. Sappiamoche y i+1 = y i + hλy i .Per la soluzione esatta, sappiamo che vale y(t i+1 ) = y(t i ) + hλy(t i ) + hd i (con d i l’errore <strong>di</strong> troncamentolocale).Sottraendo la prima equazione dalla seconda abbiamoɛ i+1 = ɛ i + hλɛ i + hd iConsiderato che d i = h 2 y′′ (ξ i ) e che, per stu<strong>di</strong>are la stabilità, h è fissato mentre i tende a +∞, il termine hd inon influisce sull’andamento dell’errore e possiamo trascurarlo. Si ha allora la relazione:ɛ i+1 = ɛ i + hλɛ iRicaviamo ɛ i = ɛ 0 (1 + hλ) i .Il ragionamento da fare è lo stesso che abbiamo fatto in precedenza e troviamo gli stessi risultati. Dobbiamoinfatti verificare quando ɛ i tende a zero per i che tende a+∞. . .157


10. EQUAZIONI ALLE DERIVATE ORDINARIEFigura 10.2: Confronto dei meto<strong>di</strong> <strong>di</strong> Eulero esplicito, implicito e Crank-Nicolson sull’equazione test y ′ = −y,prendendo come h il valore h = 2 (a sinistra) e h = 0.5 (a destra).10.9 <strong>Esercizi</strong><strong>Esercizi</strong>o 10.9.1 Stu<strong>di</strong>are la stabilità del metodo <strong>di</strong> Eulero esplicito applicato all’equazione <strong>di</strong>fferenzialey ′ = −2y + 1, con y(0) = 1 (soluzione esatta y(t) = e−2t + 1)2SvolgimentoPer provare la stabilità del metodo dobbiamo verificare che l’errore iniziale si mantiene limitato per valoricrescenti del tempo.Il metodo <strong>di</strong> Eulero esplicito applicato all’ODE del problema <strong>di</strong>ventay i+1 = y i + h(−2y i + 1) = (1 − 2h)y i + hLa soluzione esatta sod<strong>di</strong>sfa un’equazione del tipoy(t i+1 ) = y(t i ) + h(−2y(t i ) + 1) + hd i = (1 − 2h)y(t i ) + h + hd iNel calcolare l’errore ɛ i+1 = y(t i+1 ) − y i+1 abbiamoɛ i+1 = (1 − 2h)ɛ i + hd iIl termine hd i (d i errore locale <strong>di</strong> troncamento) si può trascurare. Abbiamo allora ɛ i+1 = (1 − 2h)ɛ i .Possiamo trovare con facilità che ɛ i+1 = (1 − 2h) i+1 ɛ 0 o, ancora, ɛ i = (1 − 2h) i ɛ 0 .Se vogliamo che l’errore rimanga limitato per i → ∞ la quantità (1 − 2h) i non deve crescere.Quin<strong>di</strong> deve essere |1 − 2h| < 1, vale a <strong>di</strong>re −1 < 1 − 2h < 1 cioè 2h < 2, quin<strong>di</strong> h < 1: stabilità sottocon<strong>di</strong>zione.158


C A P I T O L O11INTRODUZIONE AL FORTRAN 77:–Almeno hai trovato i files?:– Non so nemmeno come... comesono fatti?:– Sono dentro il computer.:– Sono “dentro” il computer?.:– Com’è che i files non escono?Zoolander11.1 Introduzione alla programmazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16011.2 FORTRAN: FORmula TRANslator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16011.3 Problemi e Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16111.4 Elementi <strong>di</strong> un linguaggio <strong>di</strong> programmazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16211.5 Prime regole sul FORTRAN77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16211.6 Le variabili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16311.7 I tipi <strong>di</strong> dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16411.8 Espressioni aritmetiche e funzioni elementari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16411.9 I pre<strong>di</strong>cati elementari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16511.10 Struttura alternativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16711.11 Programma sul metodo <strong>di</strong> punto fisso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17011.12 I sottoprogrammi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17211.12.1 Le functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17211.12.2 Le subroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17411.13 Il formato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17511.14 Files <strong>di</strong> dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17711.15 Vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17811.16 Ciclo do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17811.16.1 I vettori nei sottoprogrammi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18011.16.2 Leggere i dati <strong>di</strong> input da file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18011.17 Matrici in FORTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18111.17.1 Le matrici nei sottoprogrammi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18211.17.2 Memorizzazione delle matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184159


11. INTRODUZIONE AL FORTRAN 7711.18 La formula dei trapezi in FORTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18511.19 <strong>Esercizi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18811.1 Introduzione alla programmazionePrendono il nome <strong>di</strong> software quei programmi che vengono fatti eseguire al calcolatore e consentonoall’hardware <strong>di</strong> svolgere il proprio compito.Esistono due categorie <strong>di</strong> linguaggi per scrivere programmi:G linguaggi <strong>di</strong> alto livello (come FORTRAN, C, C++)G linguaggi <strong>di</strong> basso livello (come assembler)Il linguaggio macchina, invece, è il linguaggio specifico dell’elaboratore e consiste <strong>di</strong> cifre binarie 0 e 1 cheidentificano istruzioni elementari. Ogni elaboratore ha il suo linguaggio macchina.I linguaggi <strong>di</strong> basso e alto livello si possono tradurre in un qualsiasi linguaggio macchina e possono essereutilizzati su qualsiasi elaboratore (sono portabili).Con i linguaggi <strong>di</strong> basso livello, i co<strong>di</strong>ci binari (fatti da 0 e 1) vengono sostituiti da opportune ”parolechiave” che permettono una corrispondenza uno-uno tra il linguaggio <strong>di</strong> basso livello e il linguaggiomacchina.Con i linguaggi <strong>di</strong> alto livello, una singola istruzione può tradurre più istruzioni <strong>di</strong> linguaggio macchina.Inoltre un linguaggio <strong>di</strong> alto livello è facile da capire (nella sua sintassi, nelle sue regole, nel suo modo <strong>di</strong>essere utilizzato) da chi programma.Perciò, quando si programma con un linguaggio <strong>di</strong> alto livello, il programmatore deve conoscere e saperebene la grammatica, la sintassi, il vocabolario del linguaggio stesso.Uno volta scritto il programma in modo corretto, occorre fare capire al computer che c’è un programma daeseguire: bisogna quin<strong>di</strong> tradurre in linguaggio macchina il programma scritto con il liguaggio <strong>di</strong> alto livello:questo passaggio lo si fa me<strong>di</strong>ante la compilazione. Useremo un comando (un’istruzione da scrivere nellafinestre <strong>di</strong> shell, nella stessa <strong>di</strong>rectory in cui si trova il programma che abbiamo scritto) che ci permetterà<strong>di</strong> tradurre il programma scritto nel linguaggio <strong>di</strong> alto livello (che chiamamo programma sorgente) in unprogramma equivalente scritto in linguaggio macchina e che potrà essere eseguito dal calcolatore, dettoprogramma eseguibile.Programma sorgentecompi l ator e−−−−−−−−−→ Programma eseguibile11.2 FORTRAN: FORmula TRANslatorFORTRAN è una sigla per FORMula TRANslator.Anche se il FORTRAN si è molto evoluto, ci soffermeremo in particolare sulla versione 77 perchè (a partealcuni punti ormai obsoleti) la sintassi e il modo <strong>di</strong> imparare a scrivere un programma è più semplice.Inoltre è possibile scaricare gratuitamente in rete compilatori del FORTRAN77 da poter installare sul propriocomputer (anche con sistema operativo Windows).Un programma FORTRAN va prima scritto me<strong>di</strong>ante un e<strong>di</strong>tor <strong>di</strong> testo, salvandolo con un nome che abbial’estensione .f, per esempio prova.f. Poi va tradotto in linguaggio macchina in modo da poterlo eseguireal calcolatore: questo passo viene fatto attraverso la compilazione. Un compilatore è il g77. Me<strong>di</strong>antel’istruzioneg77 -o prova prova.ftradurremo in linguaggio macchina il programma prova.f e il risultato sarà la creazione <strong>di</strong> un nuovo filechiamato prova che potremo eseguire.Possiamo scrivere ancheg77 -o prova.exe prova.f160


11.3. Problemi e AlgoritmiPossiamo mettere (o meno) un’estensione al file eseguibile.Per eseguire il programma prova, scriveremo (da shell) l’istruzioneprovaoppure./provaa seconda del calcolatore.Altri tipi <strong>di</strong> compilatore sono f77, gfortran.11.3 Problemi e AlgoritmiCi sono tante definizioni per problema:G etimologicamente, viene dal verbo greco ”pro-ballein” pro:davanti ballein:mettere, ostacolo, promontorio,impe<strong>di</strong>mentoG sul <strong>di</strong>zionario troviamo: Questione da risolvere partendo da elementi noti me<strong>di</strong>ante il ragionamento, eper la quale si propongono soluzioni 1G o ancora quesito con cui si chiede <strong>di</strong> trovare, me<strong>di</strong>ante un proce<strong>di</strong>mento <strong>di</strong> calcolo, uno o più datisconosciuti, partendo dai dati noti contenuti... 2G in senso figurato, invece, per problema si intende Questione, situazione <strong>di</strong>fficile o complessa <strong>di</strong> cuisi cerca la spiegazione o la soluzione: 3 e questione, situazione, caso <strong>di</strong>fficile da risolvere e che generapreoccupazione, . . . , complicazione, <strong>di</strong>fficoltà, ostacolo 4G estendendo ancora il significato, si trova Persona misteriosa, incomprensibile, il cui comportamentopreoccupa o mette in <strong>di</strong>fficoltà 5G . . .Qualunque sia la definizione che <strong>di</strong>amo, il tratto comune è <strong>di</strong> avere a che fare con una questione cui vogliamodare una risposta o che vogliamo risolvere. Una delle prime cose da considerare quando si cerca <strong>di</strong> risolvereun problema è, dunque, come porre il problema.Il linguaggio naturale viene usato per descrivere un problema. Ma bisogna porre attenzione:G Lo stesso evento è descritto <strong>di</strong>versamente da un bambino <strong>di</strong> 3 anni rispetto a un uomo adulto.G Lo stesso evento viene descritto <strong>di</strong>versamente da un ingegnere, un fisico, un matematico.G A volte, le stesse parole possono essere usate per <strong>di</strong>re cose completamente <strong>di</strong>verse!C’è poi il linguaggio artificiale, che si presenta sotto forma <strong>di</strong> termini tecnici (dalla fisica, ingegneria, etc) enotazioni (per esempio dall’algebra, dal calcolo, dalla logica).Per esempio, termini come temperatura, pressione, massa, espansione isotermica e a<strong>di</strong>abatica, possonoessere usati in un’officina per riparare il motore <strong>di</strong> un’automobile, da un me<strong>di</strong>co che sta misurando lapressione del sangue, da un ingegnere che lavora su una turbina a gas. . .Una volta che il problema è stato descritto e se ne ha una buona conoscenza (con l’aiuto del linguaggionaturale e artificiale), si può passare alla fase <strong>di</strong> soluzione del problema stesso.Ecco l’approccio dell’algoritmo. Un algoritmo è una sequenza <strong>di</strong> passi che permettono <strong>di</strong> risolvere tuttoo parte <strong>di</strong> un problema. 6Un algoritmo si può paragonare ad una ricetta <strong>di</strong> cucina: la ricetta consiste <strong>di</strong> due partiAlgoritmo1 Dal Dizionario online della Hoepli http://<strong>di</strong>zionari.hoepli.it2 Dal Dizionario online della Garzanti http://www.garzantilinguistica.it3 Da http://<strong>di</strong>zionari.hoepli.it4 Da il Sabatini Colletti Dizionario della Lingua Italiana http://<strong>di</strong>zionari.corriere.it/<strong>di</strong>zionario_italiano5 Da http://<strong>di</strong>zionari.hoepli.it6 La parola algoritmo è entrata in uso negli anni ’50 in sostituzione <strong>di</strong> algorismo, termine con cui si in<strong>di</strong>cava il processo <strong>di</strong> calcoloutilizzando i numeri arabi. Il termine algoritmo deriva dal nome <strong>di</strong> “al-Khwarizmi”, importante matematico arabo del nono secolo grazieal quale l’Europa imparò ad usare i numeri arabi, oltre alla notazione in base 10. Le procedure che permettevano <strong>di</strong> effettuare calcoli innotazione decimale presero il nome <strong>di</strong> algorismi o algoritmi. Anche la parola algebra viene da questo matematico e, in particolare, dallasua opera “Al-mukhtasar fi hisab al-jabr wa al-muqabala”.Nel me<strong>di</strong>oevo (e forse anche per qualche studente <strong>di</strong> oggi!!!), si pensava che questa parola derivasse dal greco algiros (panico, dolore)e arithmos (numero).161


11. INTRODUZIONE AL FORTRAN 77G la lista <strong>degli</strong> ingre<strong>di</strong>entiG la sequenza dei passi da fare per realizzare la ricettaNel realizzare una ricetta si possono avere problemi nel cercare alcuni ingre<strong>di</strong>enti. Una parte dell’esecuzionerichiederà poco tempo, altre parti richiederanno più tempo. Alcuni passi non richiedono che si segua uncerto or<strong>di</strong>ne, altri passi richiedono che si mantenga l’or<strong>di</strong>ne scritto sulla ricetta. . . Le stesse analogie troviamoin un algoritmo.11.4 Elementi <strong>di</strong> un linguaggio <strong>di</strong> programmazioneCome tutti i linguaggi, anche un linguaggio <strong>di</strong> programmazione ha le sue regole <strong>di</strong> grammatica, sintassi,ortografia. . .Inoltre, un programma non può essere ambiguo, in quanto <strong>di</strong>venta il preciso risultato delle istruzioni inesse contenute.Alcune attività (non <strong>di</strong> programmazione) possono essere vaghe o ambigue:stu<strong>di</strong>a molto per superare l’esame. . . – quanto molto?compra un po’ <strong>di</strong> pane prima <strong>di</strong> tornare a casa. . . – quanto pane?Siamo noi che capiamo quanto dobbiamo stu<strong>di</strong>are, quanto pane dobbiamo comprare, a seconda dell’esameda fare, della fame che abbiamo. . .In un programma non si può lasciare spazio al vago! Occorre essere precisi.I linguaggi <strong>di</strong> programmazione sono fatti da <strong>di</strong>chiarazioni (statements):G descrizione dei dati: che genere <strong>di</strong> dati abbiamo? Se vogliamo scrivere un programma in cui per ognistudente calcoliamo la me<strong>di</strong>a dei suoi voti, c’è un’ovvia <strong>di</strong>fferenza tra i nomi <strong>degli</strong> studenti (una stringa<strong>di</strong> caratteri) e la loro me<strong>di</strong>a (un numero). Si parla <strong>di</strong> tipo <strong>di</strong> dati.G strutture <strong>di</strong> controllo. Un programma può essere visto come una sequenza <strong>di</strong> istruzioni per risolvereun certo problema. Alcune istruzioni vanno ripetute, altre vanno eseguite solo in determinatecon<strong>di</strong>zioni. . .G lavorazione dei dati (data processing). In un programma occorre poter lavorare sui dati e poterli”manipolare” opportunamente.G <strong>di</strong>chiarazioni <strong>di</strong> ingresso e uscita (input e output). In genere, un programma è scritto in modo che idati su cui si lavora possano esistere fuori del programma stesso.11.5 Prime regole sul FORTRAN77Scriviamo il nostro primo programma <strong>di</strong> prova, prova.f (apriamo un e<strong>di</strong>tor <strong>di</strong> testo e scriviamo leseguenti righe, poi salviamo il file dando il nome prova.f):program provaCC questo e ’ un programma <strong>di</strong> provaCwrite ( * , * ) ’programma <strong>di</strong> prova ’write ( * , * ) ’ questo e ’ ’ un programma <strong>di</strong> prova ’stopendG In FORTRAN77 tutte le istruzioni vanno scritte tra la 7-ima e la 72-sima colonna 7 ;G le colonne da 1 a 6 hanno un significato particolare.– sulla prima colonna si mette una C (o un altro carattere) se ciò che segue è una riga <strong>di</strong> commento7 Questo limite è dovuto al fatto che fino alla fine <strong>degli</strong> anni settanta, la programmazione veniva fatta utilizzato schede perforate, deicartoncini rettangolari <strong>di</strong> <strong>di</strong>mensione standard, ciascuna delle quali era sud<strong>di</strong>visa in un numero fisso <strong>di</strong> colonne e righe (generalmente80 colonne e 12 righe).162


11.6. Le variabili– sulla colonna 6 si mette un carattere qualunque (meglio una lettera dell’alfabeto) se l’istruzionescritta sulla riga precedente è troppo lunga e va oltre la 72-sima colonna per cui si deve andare acapo oppure si vuole andare a capo per leggere meglio l’istruzione. Nella riga in cui si mette uncarattere sulla colonna 6, continua l’istruzione dalla riga precedente.G Il programma inizia con l’istruzione program seguito dal nome del programma.G L’istruzione stop arresta l’esecuzione del programma.G L’istruzione end segnala che non vi sono altre righe nel programma.Con questo programma <strong>di</strong> esempio, vogliamo far scrivere al computer, sulla finestra <strong>di</strong> shell in cui eseguiamoil programma, le due frasi programma <strong>di</strong> prova e questo e’ un programma <strong>di</strong> prova.L’istruzione write(*,*) ’programma <strong>di</strong> prova’rende <strong>di</strong>sponibile all’esterno le informazioni contenute tra i due apici, vale a <strong>di</strong>re la stringa <strong>di</strong> caratteriprogramma <strong>di</strong> prova.Al posto <strong>di</strong> write(*,*) ’programma <strong>di</strong> prova’ potremmo scrivere, in modo del tutto equivalente,write(6,*) ’programma <strong>di</strong> prova’Il primo simbolo “*” <strong>di</strong> write(*,*) o il numero “6” <strong>di</strong> write(6,*) sono due mo<strong>di</strong> equivalenti perin<strong>di</strong>care che il <strong>di</strong>spositivo <strong>di</strong> uscita su cui mostrare la stringa <strong>di</strong> caratteri è il terminale (la finestra <strong>di</strong> shell dacui eseguiamo il programma).Vedremo che ci sono anche altri mo<strong>di</strong> per rendere <strong>di</strong>sponibile l’output del programma non su video masu file.L’apice viene usato per in<strong>di</strong>care l’inizio e la fine della stringa <strong>di</strong> caratteri da stampare. Quin<strong>di</strong>, per stamparee’ dobbiamo usare gli apici due volte:write(*,*) ’questo e’’ un programma <strong>di</strong> prova’11.6 Le variabiliScriviamo ora un programma più complicatoprogram a r e a t r i aC programma per c a l c o l a r e l ’ area <strong>di</strong> un triangoloC dando in input i v a l o r i della base e dell ’ altezzaimplicit nonereal *8 a , b , areawrite ( * , * ) ’ base a ’read ( * , * ) awrite ( * , * ) ’ base ’ , awrite ( * , * ) ’ altezza b ’read ( * , * ) bwrite ( * , * ) ’ altezza ’ , barea =(a*b ) * 0 . 5write ( * , * ) ’ area del triangolo ’ , areastopendG L’istruzione implicit none <strong>di</strong>ce che nessuna variabile può essere <strong>di</strong>chiarata implicitamente:dobbiamo <strong>di</strong>chiarare tutte le variabili che utilizziamo all’interno del programma!G Introduciamo tre variabili <strong>di</strong> tipo reale in doppia precisione, me<strong>di</strong>ante real*8 a,b,c.G Con read(*,*) a si impone al calcolatore <strong>di</strong> prendere un valore e memorizzarlo nella variabile a, equesto valore lo si dà tramite tastiera. Analogamente potremmo scrivere read(5,*) a: il numero 5in<strong>di</strong>ca che l’acquisizione dei dati avviene da tastiera.G Prima dell’istruzione <strong>di</strong> read c’è una write che ci in<strong>di</strong>ca quale valore dobbiamo mettere: è importantealtrimenti vedremmo che l’elaboratore si mette in attesa <strong>di</strong> un valore e rimane così fino a quando nonlo riceve. Ma se noi non sappiamo che valore dargli, possiamo aspettare anche ore. . . . (vedere cosasuccede togliendo le istruzioni <strong>di</strong> write!)163


11. INTRODUZIONE AL FORTRAN 77integerrealreal*8double precisionlogicalcharactervariabile interavariabile reale in precisione semplicevariabile reale in doppia precisione(occupa esattamente 8 byte<strong>di</strong> memoria)variabile reale in doppia precisione(accuratezza <strong>di</strong>versa a secondadella macchina usata)variabile logicastringhe <strong>di</strong> caratteriTabella 11.1: Tipi <strong>di</strong> datiG Una volta dati i valori <strong>di</strong> input, si effettua un’istruzione <strong>di</strong> assegnazione: si prende il valore memorizzatonella variabile a lo si moltiplica per il valore <strong>di</strong> b e per 0.5 e il risultato viene memorizzato in una nuovavariabile chiamata area. Il simbolo * è il simbolo <strong>di</strong> moltiplicazione.G Quando effettuiamo un’assegnazione, il valore contenuto nella variabile a sinistra del segno = vieneperso. Nel nostro caso, in area non era memorizzato nessun valore, ma se avessimo posto in area unqualche valore iniziale, esso andrebbe perso perchè sostituito dall’operazione a*b*0.5. I valori <strong>di</strong> a eb non cambiano.G Nel momento in cui viene lanciato il programma, il valore delle variabili è incognito. Me<strong>di</strong>ante tastiera,noi <strong>di</strong>amo i valori ad a e b. Me<strong>di</strong>ante assegnazione, <strong>di</strong>amo il valore ad area. Una volta terminata l’esecuzionedel programma, il valore delle variabili torna ad essere incognito. Perciò ci facciamo stampareil loro valore prima dell’istruzione <strong>di</strong> stop.11.7 I tipi <strong>di</strong> datiUna variabile rappresenta un ”posto” (o locazione) della memoria del calcolatore, contrassegnato daun nome che identifica la variabile, e dove possono essere scritte delle informazioni che l’elaboratore puòutilizzare (per esempio il valore della variabile se la variabile è <strong>di</strong> tipo reale o intero).Le variabili possono essere <strong>di</strong> vario tipo: intere, reali, logiche (per le variabili logiche il valore può esseresolo o vero o falso), complesse, <strong>di</strong> caratteri (stringhe <strong>di</strong> caratteri).Le variabili <strong>di</strong> tipi intero possono variare in un intervallo limitato (tra un minimo e un massimo interirappresentabili). La stessa cosa vale per le variabili <strong>di</strong> tipo reale: esiste un valore minimo e massimo realerappresentabile. Questi valori <strong>di</strong> minimo e massimo <strong>di</strong>pendono dall’elaboratore (si veda il Capitolo 1).G Osserviamo che in FORTRAN una variabile può essere scritta con i caratteri maiuscoli o minuscolisenza <strong>di</strong>stizioni: XOLD è la stessa cosa <strong>di</strong> xold o XoLd.11.8 Espressioni aritmetiche e funzioni elementari∗∗ elevamento a potenza∗ moltiplicazione/ <strong>di</strong>visione+ ad<strong>di</strong>zione− sottrazioneTabella 11.2: Operazioni aritmetiche164


11.9. I pre<strong>di</strong>cati elementariFunzione FORTRANsin(x)cos(x)tan(x)asin(x)acos(x)atan(x)exp(x)log(x)log10(x)sqrt(x)Significatosin(x)cos(x)tan(x)asi n(x)acos(x)at an(x)e xln(x)log(x) xTabella 11.3: Principali funzioniNel fare le operazioni matematiche, in FORTRAN viene data la precedenza (priorità) agli elevamenti apotenza, poi alle moltiplicazioni e <strong>di</strong>visioni, infine a sottrazione e ad<strong>di</strong>zione. Quando due operatori hanno lastessa priorità vengono eseguite le operazioni partendo da sinistra e andando verso destra. Tuttavia, quandole espressioni sono abbastanza complicate e c’è il rischio <strong>di</strong> non capire bene quali operazioni vanno fatteprima e quali dopo, conviene mettere sempre le parentesi.In FORTRAN ci sono già molte funzioni matematiche che possiamo utilizzare per i nostri programmi. InTabella 11.8, ve<strong>di</strong>amo le principali funzioni.11.9 I pre<strong>di</strong>cati elementariGli algoritmi che tradurremo in programmi quasi mai hanno solo istruzioni sequenziali (vale a <strong>di</strong>re istruzionida eseguire l’una <strong>di</strong> seguito all’altra). Molte volte, infatti, viene eseguita una istruzione piuttosto cheun’altra se certe con<strong>di</strong>zioni sono vere. Oppure vengono ripetute alcune istruzioni fintantochè sono vere determinatecon<strong>di</strong>zioni. Gli operatori mostrati in Tabella 11.9 ci serviranno per poter scrivere istruzioni legatead una con<strong>di</strong>zione.Operatore Significato Esempio Valore.GT. > (a.gt.b) Vero se a > bFalso se a ≤ b.GE. >= (a.ge.b) Vero se a ≥ bFalso se a < b.LT. < (a.lt.b) Vero se a < bFalso se a ≥ b.LE. b.EQ. == (a.eq.b) Vero se a = bFalso se a ≠ b.NE. ∼= (a.ne.b) Vero se a ≠ bFalso se a = bTabella 11.4: Operatori logici ( È la stessa cosa scrivere .GT. o .gt. .GE. o .ge. e così via.)Dato P un pre<strong>di</strong>cato (vale a <strong>di</strong>re una proposizione logica che può assumere solo valore vero o falso) sihanno gli operatori logici <strong>di</strong> Tabella 11.9.165


11. INTRODUZIONE AL FORTRAN 77Operatore Significato Esempio.NOT. negazione .not.(P)∼.AND. congiunzione (P1).and.(P2)&.OR. <strong>di</strong>sgiunzione (P1).or.(P2)inclusiva|Tabella 11.5: Operatori logiciEsempio 11.9.1 Sia a=5 e b=10.G La proposizione (a.le.b) è una proposizione vera (.true.) perchè il valore assunto da a (5) è minore ouguale al valore <strong>di</strong> b (10).G La proposizione (a.eq.b) è falsa (.false.) perchè il valore <strong>di</strong> a è <strong>di</strong>verso da quello <strong>di</strong> bG La proposizione (a.gt.b) è falsa.G La proposizione (a.ge.b) è falsa.G La proposizione (a.ne.b) è vera.G La proposizione (a.lt.b) è vera.Esempio 11.9.2 Sia a=5, b=10, c=2G (a.le.b).and.(c.le.b) è una proposizione vera perchè composta da due proposizioni vereG .not.(a.le.b) è una proposizione falsa. Negare (a.le.b) vuol <strong>di</strong>re scrivere (a.gt.b). Ma a non è maggiorestretto <strong>di</strong> b, quin<strong>di</strong> il risultato è falso.G .not.(b.eq.c) è una proposizione vera, in quanto stiamo negando (b.eq.c): (b.eq.c) è falsa quin<strong>di</strong> la suanegazione è vera.G (a.le.b).or.(c.ge.b) è una proposizione vera perchè basta che una delle due proposizioni sia vera perrendere vero l’intero pre<strong>di</strong>cato.G (a.le.b).and.(c.ge.b) è un pre<strong>di</strong>cato falso perchè devono essere vere tutte e due le proposizioni che lacompongono per rendere vero il pre<strong>di</strong>cato.G (a.eq.b).and.(c.ge.b) è un pre<strong>di</strong>cato falso perchè composto da due proposizioni false.G (a.eq.b).or.(c.ge.b) è un pre<strong>di</strong>cato falso.RiassumendoG Negare un pre<strong>di</strong>cato falso dà come risultato un pre<strong>di</strong>cato vero.G Negare un pre<strong>di</strong>cato vero dà come risultato un pre<strong>di</strong>cato falso.G Congiungere (con .and.) due pre<strong>di</strong>cati veri dà come risultato un pre<strong>di</strong>cato vero.G Congiungere (con .and.) due pre<strong>di</strong>cati falsi dà come risultato un pre<strong>di</strong>cato falso.G Congiungere (con .and.) due pre<strong>di</strong>cati, uno vero ed uno falso, dà come risultato un pre<strong>di</strong>cato falso.G Disgiungere (con .or.) due pre<strong>di</strong>cati veri dà come risultato un pre<strong>di</strong>cato vero.G Disgiungere (con .or.) due pre<strong>di</strong>cati falsi dà come risultato un pre<strong>di</strong>cato falso.G Disgiungere (con .or.) due pre<strong>di</strong>cati, uno vero ed uno falso, dà come risultato un pre<strong>di</strong>cato vero.Importanti sono da ricordare le regole <strong>di</strong> De Morgan. Dati due pre<strong>di</strong>cati P1 e P2166


11.10. Struttura alternativaG ( .not. ( (P1).and.(P2) ) equivale a scrivere ( .not.(P1) .or. .not.(P2) )Negare una congiunzione significa <strong>di</strong>sgiungere le negazioni dei due pre<strong>di</strong>cati che la compongono.G ( .not. ( (P1).or.(P2) ) equivale a scrivere ( .not.(P1) .and. .not.(P2) )Negare una <strong>di</strong>sgiunzione significa congiungere la negazione dei due pre<strong>di</strong>cati che la compongono.Esempio 11.9.3 (.not.( (oggi fa freddo).and.(oggi è piovuto) ) ) =(oggi NON fa freddo) .or. (oggi NON è piovuto)(.not.( (oggi fa freddo).or.(oggi NON ho voglia <strong>di</strong> fare niente) ) ) =(oggi NON fa freddo) .and. (oggi ho voglia <strong>di</strong> fare tante cose)(.not.( it.le.100). and. ( x.ge.0.001) ) ) = ( (it.gt.100). or. (x.lt.0.001) )(.not.( it.le.100). or. ( x.ge.0.001) ) ) = ( (it.gt.100). and. (x.lt.0.001) )program p r e d i c a t i l o g i c iC programma <strong>di</strong> esempio s u l l e proposizioni logicheimplicit nonereal *8 a , b , cl o g i c a l p1 , p2 , pwrite ( * , * ) ’ s c r i v i i l valore <strong>di</strong> a ’read ( * , * ) awrite ( * , * ) ’ a= ’ , awrite ( * , * ) ’ s c r i v i i l valore <strong>di</strong> b ’read ( * , * ) bwrite ( * , * ) ’b= ’ , bwrite ( * , * ) ’ s c r i v i i l valore <strong>di</strong> c ’read ( * , * ) cwrite ( * , * ) ’ c= ’ , cp1= ( a . l t . b)p2=(b . gt . c )write ( * , * ) ’p1= a . l t . b ’ , p1write ( * , * ) ’p2= b . gt . c ’ , p2p= p1 . and . p2write ( * , * ) ’p1 and p2 ’ , pp= . not . ( p1 . and . p2 )write ( * , * ) ’ not ( p1 and p2 ) ’ , pp= p1 . or . p2write ( * , * ) ’p1 or p2 ’ , pp= . not . ( p1 . or . p2 )write ( * , * ) ’ not ( p1 or p2 ) ’ , pstopend11.10 Struttura alternativaI programmi in cui le istruzioni devono essere eseguite una <strong>di</strong> seguito all’altra si <strong>di</strong>cono a struttura sequenziale.Questa struttura è pero abbastanza limitata in quanto non permette <strong>di</strong> risolvere problemi anchesemplici.Supponiamo <strong>di</strong> risolvere il problema <strong>di</strong> trovare le ra<strong>di</strong>ci <strong>di</strong> un’equazione <strong>di</strong> secondo grado ax 2 +bx +c = 0.G i dati <strong>di</strong> input sono i coefficienti a,b,c167


11. INTRODUZIONE AL FORTRAN 77Ciclo ifG si calcola il <strong>di</strong>scriminante ∆ = b 2 − 4acG se ∆ < 0 allora le ra<strong>di</strong>ci sono complesseG se ∆ = 0 allora sappiamo che le ra<strong>di</strong>ci coincidonoG se ∆ > 0 allora applichiamo la formula per trovare le due ra<strong>di</strong>ci. Sappiamo però che si può verificareil fenomeno <strong>di</strong> cancellazione numerica se b 2 − 4ac ≈ b 2 e quin<strong>di</strong> possiamo applicare una formulaalternativa. . .Come fare a scrivere un programma che tenga conto <strong>di</strong> tutte le con<strong>di</strong>zioni che abbiamo visto prima, chefaccia quin<strong>di</strong> qualcosa piuttosto che un’altra a seconda che sia vera o falsa una certa con<strong>di</strong>zione? Si ha ilcosidetto ciclo if.i f ( espressione logica ) then{ istruzione 1a }{ istruzione 2a }{ . . . . }else{ istruzione 1b }{ istruzione 2b }{ . . . . }end i fSe è vera l’espressione logica allora sieseguono le istruzioni 1a, 2a, . . . .Altrimenti – cioè se è falsa l’espressionelogica – allora si eseguono le istruzioni 1b,2b, . . .i f ( espressione logica ) then{ istruzione 1a }{ istruzione 2a }{ . . . . }end i fSe è vera l’espressione logica allora si eseguonole istruzioni 1a, 2a, . . . , altrimentinon si fa nulla.Ciclo if –struttura piùgeneralei f ( espressione logica1 ) then{ istruzione 1a }{ istruzione 2a }{ . . . . }else i f ( espressione logica2 ) then{ istruzione 1b }{ istruzione 2b }{ . . . . }. . . .else{ istruzione 1z }{ istruzione 2z }{ . . . . }end i fVe<strong>di</strong>amo un programma che calcola le ra<strong>di</strong>ci <strong>di</strong> un’equazione <strong>di</strong> secondo grado.program r a d i c iimplicit nonereal a , b , c , deltareal x1 , x2C calcolo d e l l e r a d i c i r e a l i <strong>di</strong> ax **2 +bx+c = 0168


11.10. Struttura alternativaC x = [−b +/− s q r t { b**2 − 4ac } ] / 2aCwrite ( * , * ) ’ c o e f f i c i e n t i <strong>di</strong> un’ ’ equazione <strong>di</strong> secondo grado ’write ( * , * ) ’ a = ’read ( * , * ) awrite ( * , * ) ’ a = ’ , awrite ( * , * ) ’b = ’read ( * , * ) bwrite ( * , * ) ’b = ’ , bwrite ( * , * ) ’ c = ’read ( * , * ) cwrite ( * , * ) ’ c = ’ , cdelta=b**2 − 4 . * a* ci f ( delta . l t . 0 ) thenwrite ( * , * ) ’ l e r a d i c i sono complesse ’elsex1= ( −b + sqrt ( delta ) ) / ( 2 . * a )write ( * , * ) ’ x1 = ’ , x1x2= ( −b − sqrt ( delta ) ) / ( 2 . * a )write ( * , * ) ’ x2 = ’ , x2end i fstopendComplichiamo la seconda parte del programma, andando a scrivere le ra<strong>di</strong>ci coincidenti nel caso in cui∆ = 0 e utilizzando la formula alternativa (dalla considerazione che x 1 x 2 = c/a) per evitare il fenomeno <strong>di</strong>cancellazione numerica.i f ( delta . l t . 0 ) thenwrite ( * , * ) ’ l e r a d i c i sono complesse ’else i f ( delta . eq . 0 . d0 ) thenx1= −b/ ( 2 . 0 d0*a )x2=x1write ( * , * ) ’ l e r a d i c i sono : ’ , x1 , x2elsex1= ( −b + sqrt ( delta ) ) / ( 2 . * a )x2= ( −b − sqrt ( delta ) ) / ( 2 . * a )write ( * , * ) ’ l e r a d i c i sono : ’ , x1 , x2i f ( ab ( x1 ) . gt . abs ( x2 ) ) thenx2= c / ( x1 *a )write ( * , * ) ’ x2 con formula a lternativa ’ , x2elsex1= c / ( x2 *a )write ( * , * ) ’ x1 con formula a lternativa ’ , x1end i fend i fIl ciclo if non basta per scrivere tutti i nostri programmi. Pensiamo ad un blocco <strong>di</strong> istruzioni da ripeteremolte volte, fino a quando è vera una determinata con<strong>di</strong>zione. In questo caso, si usa il ciclo do while(pensiamo all’algoritmo visto per il metodo <strong>di</strong> bisezione, o allo schema <strong>di</strong> punto fisso).Ciclo dowhile169


11. INTRODUZIONE AL FORTRAN 77do while ( espressione logica ){ istruzione 1 }{ istruzione 2 }{ . . . }{ istruzione n }end doFintantochè è vera l’espressione logicaallora esegui istruzione 1, 2, . . . , n.Le istruzioni 1, 2, . . . vengono ripetute ciclicamente (non una volta sola come nel ciclo if). Quando siesegue l’ultima istruzione posta all’interno del ciclo, si torna all’espressione logica e si controlla se è vera ofalsa. Se è vera, si eseguono <strong>di</strong> nuovo le istruzioni 1, 2, . . . ,n. Se non è vera, si esce dal ciclo while. Occorredunque prestare attenzione a non creare cicli infiniti!11.11 Programma sul metodo <strong>di</strong> punto fissoConsideriamo l’algoritmo dello schema <strong>di</strong> punto fissox n+1 = cos(x n )e proviamo a scrivere un programma FORTRAN che ci permetta <strong>di</strong> trovare una buona approssimazione delpunto fisso ξ (sempre che lo schema converga). I dati <strong>di</strong> input che dobbiamo dare al programma sono:G l’approssimazione iniziale x 0G la tolleranza ε con cui vogliamo approssimare il punto fissoG il numero massimo <strong>di</strong> iterazioni entro cui cercare la convergenza dello schema (per evitare cicli infiniti)I dati <strong>di</strong> output che possiamo chiedere al programma sono:G l’approssimazione x n+1 ad ogni passoG l’iterazione nG lo scarto ad ogni passo: |x n+1 − x n |G una stima della costante asintotica dell’errore MCerchiamo ora <strong>di</strong> capire come gestire le variabili per x n e x n+1 e per gli scarti ad ogni passo. Con il metodo<strong>di</strong> punto fisso, si crea una successione <strong>di</strong> valori: x 0 , x 1 , x 2 , . . . x n . . . . Nella teoria, per n che tende all’infinito,la successione può convergere al punto fisso. Nella pratica ci si arresta quando lo scarto (il valore assoluto tradue iterazioni successive) è minore <strong>di</strong> una certa tolleranza. A priori, tuttavia, non sappiamo quante iterazionidobbiamo fare. Potremmo pensare <strong>di</strong> memorizzare le varie approssimazioni x n in un vettore che abbia una<strong>di</strong>mensione molto elevata. Ma ci sono due inconvenienti:1. Non sappiamo ancora come scrivere in un programma FORTRAN un vettore2. Supposto <strong>di</strong> saperlo fare, possiamo e dobbiamo evitarlo perchè non serve conservare in memoria tuttile approssimazioni che generiamo (x n+1 <strong>di</strong>pende dal valore x n e basta). Se ci interessano i valori generatidall’algoritmo, li possiamo scrivere <strong>di</strong> volta in volta sul video (meglio su un file! vedremo poi comescrivere dati <strong>di</strong> output su un file).Lavoreremo facendo uso <strong>di</strong> due variabili: xold che corrisponde a x n e xnew che corrisponde a x n+1 . Diamoin input il valore iniziale x 0 . Dobbiamo effettuare la prima iterazione cioè trovare x 1 = cos(x 0 ).G Porremo xold=x0 e poi xnew= cos(xold) per l’iterazione it=1. xnew ha il significato <strong>di</strong> x 1 .G Una volta fatta la prima iterazione, il valore <strong>di</strong> xold=x0 non ci interessa più. Per it=it+1=2, ci servecalcolare x 2 = cos(x 1 ). Proprio perchè il valore <strong>di</strong> xold non serve più assegniamo a xold il valorecalcolato per x 1 =xnew in modo da poter sfruttare la relazione <strong>di</strong> prima. Applicheremo <strong>di</strong> nuovo laformula xnew= cos(xold) dove ora xnew ha il significato <strong>di</strong> x 2 e xold <strong>di</strong> x 1 .G Alla fine del secondo passo, quin<strong>di</strong> xnew=x 2 e xold=x 1G Ora x 1 non serve più. Per it=it+1=3, ci serve solo x 2 . Perciò faremo xold=xnew, xnew=cos(xold)e avremo xnew=x 3 . E così via. . .170


11.11. Programma sul metodo <strong>di</strong> punto fissoxold=x0i t e r =0scartonew =2.0d0* t o l ldo while ( ( scartonew . ge . t o l l ) . and . ( i t e r . l e . itmax ) )i t e r = i t e r +1xnew=cos ( xold )scartonew=abs (xnew− xold )write ( * , * ) i t e r , xnewxold=xnewend doQuando si entra nel ciclo do while scartonew=2.0d0*toll > toll e iter=0< itmax. Si eseguono leistruzioni del ciclo do while fino a quando rimane vera la proposizione (scartonew.ge.toll) .and.(iter.le.itmax) . Si esce dal ciclo do while quando scartonew < toll oppure quando iter >itmax.|ξ − x n |Sappiamo che, per lo schema <strong>di</strong> punto fisso, vale lim n→∞ = M = |g ′ (ξ)|. Poichè non conosciamo|ξ − x n−1l’errore, ma possiamo calcolare lo scarto e, per n → ∞, vale |ξ − x n | ≈ |x n − x n−1 |, abbiamo due mo<strong>di</strong> perstimare M:1. calcolare il rapporto tra gli scarti a due passi successivi2. calcolare |g ′ (x n )|Per calcolare il rapporto tra gli scarti a due passi successivi introduciamo due variabili, che chiamiamoscartold e scartonew che corrispondono, rispettivamente, a |x n−1 −x n−2 | e |x n −x n−1 |. Le aggiorniamo inmaniera del tutto analoga a quanto visto per xold e xnew. All’inizio, assegniamo a scartonew un valore piùgrande della tolleranza per fare in modo che si entri nel ciclo while senza problemi. Nel co<strong>di</strong>ce calcoliamoquin<strong>di</strong> due stime <strong>di</strong> M, utilizzando le variabili che chiamiamo asint1 e asint2.Ve<strong>di</strong>amo il co<strong>di</strong>ce completo.program puntofissoC programma per i l calcolo del punto f i s s o per g ( x)= cos ( x ) in [ 0 , pi / 2 ]implicit noneCC s i g n i f i c a t o d e l l e v a r i a b i l iC i t e r : i t e r a z i o n e del metodo del punto f i s s oC itmax : numero massimo <strong>di</strong> i t e r a z i o n iC t o l l : tolleranza p r e f i s s a t a per l ’ approssimazioneC del punto f i s s oC x0 : punto i n i z i a l e della successioneC xold : approssimazione al passo kC xnew : approssimazione al passo k+1C s c a r t o l d : scarto all ’ i t e r a t a precedenteC scartonew : valore assoluto tra l ’ i t e r a t a corrente e quella alC passo precedenteC asint1 : scartonew / s c a r t o l d − approssimazione <strong>di</strong> MC asint2 : abs(− sin (xnew ) ) − approssimazione <strong>di</strong> Minteger i t e r , itmaxreal *8 x0 , xold , xnew , scartold , scartonew , t o l lreal *8 asint1 , asint2write ( * , * ) ’ approssimazione i n i z i a l e ’read ( * , * ) x0write ( * , * ) ’ x0 = ’ , x0itmax=100t o l l =1.d−10scartonew =2.0* t o l lscartold=scartonewi t e r = 0171


11. INTRODUZIONE AL FORTRAN 77xold=x0write ( * , * ) ’ i t xnew scarto1 asint1 asint2 ’write ( * , * ) i t e r , xold , scartonewdo while ( ( scartonew . ge . t o l l ) . and . ( i t e r . l e . itmax ) )i t e r = i t e r +1xnew=cos ( xold )scartonew=abs (xnew− xold )asint1= scartonew/ scartoldasint2=abs(− sin (xnew ) )write ( * , * ) i t e r , xnew , scartonew , asint1 , asint2xold=xnewscartold=scartonewend dostopend11.12 I sottoprogrammiQuando l’algoritmo e il problema su cui stiamo lavorando sono complicati, conviene spezzare il problemain sottoproblemi in modo da semplificare la programmazione.Analogamente, al posto <strong>di</strong> avere un unico programma in FORTRAN, conviene scrivere il programmafacendo uso <strong>di</strong> sottoprogrammi. Si hanno due tipi <strong>di</strong> sottoprogrammi in FORTRAN:G subroutinesG functionsIn tal modo un programma FORTRAN può risultare composto da:G programma principaleG una o più subroutinesG una o più functions11.12.1 Le functionsEsempio <strong>di</strong>function gfunIl programma che abbiamo scritto funziona bene ma ha un punto debole: se vogliamo applicare lo schema<strong>di</strong> punto fisso ad un’altra funzione g , dobbiamo andare a cambiare le istruzioni xnew=cos(xold) easint2=abs(-sin(xnew)). E se la funzione è complicata? E se dobbiamo valutare la stessa funzione (o lestesse funzioni) anche su altre parti del programma?Introduciamo il concetto <strong>di</strong> function in FORTRAN. Una function è del tutto simile al concetto <strong>di</strong>funzione scalare, che può essere definita in un sottoinsieme <strong>di</strong> R n ma ha valori in R. Difatti una functionpuò avere uno o più dati <strong>di</strong> input e un solo dato <strong>di</strong> output.Ve<strong>di</strong>amo come scrivere il programma precedente facendo uso delle functions.Nello stesso file (per semplicità) in cui abbiamo scritto il programma principale fisso.f, dopo le istruzionistop e end che chiudono il programma principale, dopo aver lasciato qualche riga bianca per mostrare chefinisce il programma principale, andremo a scrivere la nostra prima functionstopendC f i n e del programma principalereal *8 function gfun ( x )C funzione <strong>di</strong> punto f i s s oimplicit nonereal *8 xgfun=cos ( x )returnend172


11.12. I sottoprogrammiLa funzione che stiamo scrivendo è <strong>di</strong> tipo real*8 ed è la prima cosa che scriviamo per identificarla. C’è poila parola function e poi gfun(x). gfun ha un duplice significato: è il nome della function ma è ancheil nome della variabile che contiene il risultato dell’esecuzione della function gfun.Il corpo della function è del tutto analogo a quello che si fa in un programma principale: implicit none,<strong>di</strong>chiarazione delle variabili, istruzioni. Tutte le istruzioni servono ad assegnare il valore alla variabile gfun.La function termina con le istruzioni return (per ritornare nel programma da cui è stata chiamata) eend.La funzione in questo caso <strong>di</strong>pende da una sola variabile, che chiamiamo x. La variabile (o le variabili)da cui <strong>di</strong>pende una function deve essere dello stesso tipo (<strong>di</strong>chiarata allo stesso modo) sia all’interno dellafunction sia nel programma principale, ma può avere nomi <strong>di</strong>versi (x, xold). Per la derivata prima lafunction è la seguente:real *8 function dgfun ( x )C derivata della funzione <strong>di</strong> punto f i s s oimplicit nonereal *8 xdgfun= −sin ( x )returnendCome cambia il programma principale?Nella <strong>di</strong>chiarazione delle variabili dobbiamo <strong>di</strong>chiarare le due function gfun e dgfuninteger i t e r , itmaxreal *8 x0 , xold , xnew , scartold , scartonew , t o l lreal *8 asint1 , asint2real *8 gfun , dgfunUn’altra istruzione (opzionale) è <strong>di</strong>re che ci sono due sottoprogrammi esterni al programma principale,subito dopo la <strong>di</strong>chiarazione delle variabili:integer i t e r , itmaxreal *8 x0 , xold , xnew , scartold , scartonew , t o l lreal *8 asint1 , asint2real *8 gfun , dgfunexternal gfun , dgfunInfine, nel ciclo while, dove abbiamo bisogno della funzione <strong>di</strong> punto fisso e della sua derivata, si ha:do while ( ( scartonew . ge . t o l l ) . and . ( i t e r . l e . itmax ) )i t e r = i t e r +1xnew=gfun ( xold )scartonew=abs (xnew− xold )asint1= scartonew/ scartoldasint2=abs ( dgfun (xnew ) )write ( * , * ) i t e r , xnew , scartonew , asint1 , asint2xold=xnewscartold=scartonewend doEsempio <strong>di</strong>functiondgfunG Una function, dunque, è un sottoprogramma del programma principale.G Una function viene chiamata <strong>di</strong>rettamente: xnew=gfun(xold).G La function restituisce un valore ben preciso - il valore assunto dalla funzione stessa in funzione deiparametri. Perciò deve essere <strong>di</strong>chiarato il tipo della function (integer, real, real*8, . . . )G La function restituisce un solo valore: gfun=cos(x).G La function può avere uno o più parametri in ingresso.G Per scrivere una function si usa l’istruzione <strong>di</strong> implicit none, si <strong>di</strong>chiarano tutte le variabili chesono usate all’interno della function, si scrivono tutte le istruzioni che servono (anche cicli if, o whilese occorrono).G La function termina con le istruzioni <strong>di</strong> return e end.173


11. INTRODUZIONE AL FORTRAN 7711.12.2 Le subroutinesPossiamo pensare <strong>di</strong> cambiare ancora il programma per l’approssimazione del punto fisso, utilizzandoun <strong>di</strong>verso approccio: la parte che riguarda le iterazioni dello schema del punto fisso la facciamo fare ad unsottoprogramma che chiameremo, in qualche modo, nel programma principale. Scomporre il programmaprincipale in più sottoprogrammi ha il suo vantaggio nel momento in cui gli algoritmi che dobbiamo implementare<strong>di</strong>ventano via via più complicati, oppure se una parte <strong>di</strong> un programma viene ripetuta più volte (eanzichè scrivere righe e righe <strong>di</strong> istruzioni da eseguire, le scriviamo solo una volta nel sottoprogramma e poile richiamiamo dove occorre).program puntofissoimplicit noneinteger i t e r , itmaxreal *8 x0 , xold , xnew , scartold , scartonew , t o l lexternal i t e r p f i s s owrite ( * , * ) ’ approssimazione i n i z i a l e ’read ( * , * ) x0write ( * , * ) ’ x0 = ’ , x0itmax=100t o l l =1.d−10scartonew =2.0* t o l lscartold=scartonewi t e r = 0xold=x0write ( * , * ) ’ i t xkp1 scarto1 asint1 asint2 ’write ( * , * ) i t e r , xold , scartonewc a l l i t e r p f i s s o ( i t e r , itmax , xold , t o l l , scartonew , scartold , xnew)write ( * , * ) ’ approssimazione f i n a l e ’ , xnewstopendOsserviamo che la subroutine è chiamata tramite l’istruzionecall iterpfisso( iter ,itmax,xold,toll,scartonew,scartold,xnew)Abbiamo parametri <strong>di</strong> input: iter, itmax, xold, toll, scartonew, scartoldG Ci sono parametri <strong>di</strong> output: xnewAlcuni dei parametri <strong>di</strong> input, vengono mo<strong>di</strong>ficati all’interno della subroutine, altri no.G Nella <strong>di</strong>chiarazione delle variabili, non ci sono più le variabili che usiamo solo all’interno dellasubroutine (asint1, asint2, le due functions gfun e dgfun).Per scrivere la subroutine, lasciamo qualche riga vuota dopo le istruzioni stop e end del programma principalee scriviamo la subroutine prima delle functions (o dopo, non cambia niente). L’importante è che siscriva tutto il programma principale completo, tutta la/le subroutine complete, tutte la/le functions complete(senza che pezzi <strong>di</strong> subroutine o <strong>di</strong> functions o <strong>di</strong> programma principale si intersechino tra <strong>di</strong> loro nellascrittura!!!!)Esempio <strong>di</strong>subroutine:iterpfisso subroutine i t e r p f i s s o ( i t e r , itmax , xold , t o l l , scnew , scold , xnew)C sottoprogramma che implementa l ’ algoritmo del metodo <strong>di</strong> punto f i s s oimplicit noneinteger i t e r , itmaxreal *8 xnew , xold , t o l l , scnew , scold , asint1 , asint2real *8 gfun , dgfunexternal gfun , dgfundo while ( ( scnew . ge . t o l l ) . and . ( i t e r . l e . itmax ) )i t e r = i t e r +1xnew=gfun ( xold )scnew=abs (xnew− xold )asint1= scnew/ scold174


11.13. Il formatoasint2=abs ( dgfun (xnew ) )write ( * , * ) i t e r , xnew , scnew , asint1 , asint2xold=xnewscold=scnewend doreturnendG Una subroutine inizia con l’istruzione subroutine nomesubroutine(lista <strong>di</strong> parametri)G il nome delle subroutine non può essere uguale a quello <strong>di</strong> altre variabili utilizzate;G il “corpo” della subroutine è analogo a quello <strong>di</strong> un programma principale (implicit none, <strong>di</strong>chiarazionedelle variabili, istruzioni, cicli. . . );G la subroutine si chiude con le istruzioni return e endG la subroutine è chiamata nel programma principale tramite l’istruzionecall nomesubroutine(parametri)Il fatto che noi chiamiamo una subroutine nel programma principale (call) <strong>di</strong>ce che la subroutine non è unprogramma a sè stante. Quando termina l’esecuzione <strong>di</strong> ciò che è scritto all’interno della subroutine si tornain<strong>di</strong>etro nel programma principale e si continua l’elaborazione da quel punto. L’istruzione return fa tornareal programma principale. Le variabili non devono avere necessariamente lo stesso nome nel programmaprincipale e nella subroutine. Per esempio, possiamo scrivere:call iterpfisso( iter ,itmax,xold,toll,scartonew,scartold,xnew) nel programma principalesubroutine iterpfisso(it,imx,xold,toll,scnew,scold,xnew) nella subroutine.L’importante è che le variabili abbiamo lo stesso significato (stesso tipo <strong>di</strong> variabile, ma anchestessa valenza <strong>di</strong> variabile) e devono essere messe nello stesso or<strong>di</strong>ne: se per sbaglio scriviamocall iterpfisso(itmax,iter,xold,toll ,scartonew,scartold,xnew) nel programma principale ma poi nella subroutinescriviamo subroutine iterpfisso(it,imx,xold,toll,scnew,scold,xnew) ,all’interno della subroutine io vado ad assegnare a it il valore che passato (che è quello <strong>di</strong> itmax), mentre aimx an<strong>di</strong>amo a passare il valore <strong>di</strong> iter (che è zero all’inizio). . . ..All’interno della subroutine si possono utilizzare altre variabili oltre a quelle che sono presenti tra i parametridella stessa. L’importante è <strong>di</strong>chiararle nella subroutine. Tali variabili non passano nel programmaprincipale ma sono usate solo nella subroutine. Vedasi asint1, asint2, gfun, dgfun.11.13 Il formatoFino ad ora abbiamo stampato i risultati dei nostri programmi su video e senza aver dato nessunain<strong>di</strong>cazione su come visualizzare i dati.Per avere un output elegante e or<strong>di</strong>nato, conviene usare l’istruzione format.Ve<strong>di</strong>amo questa istruzione <strong>di</strong>rettamente all’interno <strong>di</strong> un programma d’esempio (quello del punto fissoappena visto nelle le righe <strong>di</strong> co<strong>di</strong>ce relative al ciclo do while, il resto rimane invariato)do while ( ( scartonew . ge . t o l l ) . and . ( i t e r . l e . itmax ) )i t e r = i t e r +1xnew=gfun ( xold )scartonew=abs (xnew− xold )asint1= scartonew/ scartoldasint2=abs ( dgfun (xnew ) )write ( * , 1 0 0 ) i t e r , xnew , scartonew , asint1 , asint2xold=xnewscartold=scartonewend do100 format (1 x , i4 , 1 x , f15 .12 ,1 x , e14 . 6 , 1x , 2e13 . 5 )Programma<strong>di</strong> punto fissoconl’istruzioneformatNell’istruzione write, non abbiamo scritto write(*,*) ma write(*,100). Al posto del secondosimbolo * abbiamo messo un numero (un’etichetta).175


11. INTRODUZIONE AL FORTRAN 77Questo numero lo si trova scritto alla fine del ciclo while (ma possiamo metterlo ovunque all’interno delprogramma - dopo la <strong>di</strong>chiarazione delle variabili e prima della end finale) a partire dalla seconda colonna.Dopo aver scritto il numero che contrad<strong>di</strong>stingue il formato, abbiamo l’istruzione format e, tra parentesi,abbiamo tutte le in<strong>di</strong>cazioni su come rappresentare le variabili della stampa cui ci si riferisce:format(1x,i4,1x,f15.12,1x,e14.6,1x,2e13.5)Nell’esempio particolare:G 1x significa: lascia uno spazio bianco sulla riga;G i4 significa: 4 caratteri riservati per la prima variabile che è <strong>di</strong> tipo intero (iter);G f15.12 : scrivi il valore della variabile xnew in formato fisso, riservando 15 caratteri per il numero <strong>di</strong> cui12 per la parte decimale;G e14.6: scrivi il valore <strong>di</strong> scartonew in formato esponenziale, riservando 14 caratteri per il numero, <strong>di</strong>cui 6 per la mantissa;G 2e13.5 : scrivi i 2 numeri successivi asint1 e asint2 nello stesso formato esponenziale, riservando aciascuno <strong>di</strong> essi 13 caratteri <strong>di</strong> cui 5 per la mantissa.formatoiefaxSignificatoformato interoesponenzialefissoalfanumericospazi bianchiTabella 11.6: Il formatoformatoiefaxEsempioi5 – 5 caratteri per un interoe14.6 – 14 caratteri, 6 per la mantissae18.10 – 18 caratteri, 10 per la mantissaf14.6 – 14 caratteri, 6 per le cifre decimalif15.12 – 15 caratteri, 12 per le cifre decimalia5 – una stringa <strong>di</strong> al più 5 caratteri1x – 1 carattere bianco3x – 3 caratteri bianchiTabella 11.7: Esempi <strong>di</strong> formatoSpecificando il formato, occorre prestare attenzione al fatto che non tutti i numeri possono essere stampaticorrettamente. Per esempio se un intero ha più <strong>di</strong> 5 caratteri (per esempio 100150) ma il formato per essoè i5, vengono stampati <strong>degli</strong> * o altri caratteri a seconda del compilatore. Se si hanno strani risultati in outputusando un formato, togliere il formato, compilare e rieseguire il programma per verificare se l’errore <strong>di</strong>pendedal formato!Lo stesso formato può essere utilizzato da più righe <strong>di</strong> write se il formato si riferisce a variabili dellostesso tipo. Le stringhe <strong>di</strong> caratteri possono essere scritte me<strong>di</strong>ante un formato opportuno.Ve<strong>di</strong>amo <strong>di</strong> nuovo il programma <strong>di</strong> prima:i t e r = 0xold=x0write ( * , 9 8 ) ’ i t ’ , ’ xk ’ , ’ scarto ’ , ’ asint1 ’ , ’ asint2 ’write ( * , 9 9 ) i t e r , xold , scartonewdo while ( ( scartonew . ge . t o l l ) . and . ( i t e r . l e . itmax ) )C t u t t o invariato come primawrite ( * , 1 0 0 ) i t e r , xnew , scartonew , asint1 , asint2176


11.14. Files <strong>di</strong> datixold=xnewscartold=scartonewend do98 format (1 x , a4 , 1 x , a15 , 1 x , a14 , 1 x , 2 a13 )99 format (1 x , i4 , 1 x , f15 .12 ,1 x , e14 . 6 )100 format (1 x , i4 , 1 x , f15 .12 ,1 x , e14 . 6 , 1x , 2e13 . 5 )stopendPer le stringhe è stato usato un formato riservando a ciascuna stringa lo stesso numero <strong>di</strong> caratteri riservatialle variabili corrispondenti cui si riferiscono le stringhe. In tal modo, si riesce a creare una tabellina <strong>di</strong>risultati messi in colonna l’uno dopo l’altro in maniera or<strong>di</strong>nata.11.14 Files <strong>di</strong> datiPiuttosto che visualizzarli sulla finestra <strong>di</strong> shell del computer, conviene salvare i risultati in un file <strong>di</strong> dati.Il modo più semplice per fare questo è:G far sì che durante l’esecuzione del programma venga generato un file <strong>di</strong> scrittura <strong>di</strong> dati: si apre ilfile all’interno del programma principale associando ad esso un numero (label) me<strong>di</strong>ante l’istruzioneopen. Per esempio, dopo la <strong>di</strong>chiarazione delle variabili, scriviamoopen(10, file=’rispuntofisso.txt’)G le istruzioni <strong>di</strong> write saranno poi associate a quella label e scritte su quel file.Quin<strong>di</strong>, al posto <strong>di</strong> scrivere write(*,98) andremo a scrivere write(10,98) perchè dobbiamoscrivere la stampa dei risultati sul file contrassegnato dall’etichetta 10.G chiu<strong>di</strong>amo il file con l’istruzione close.close(10)program puntofissoC programma <strong>di</strong> punto f i s s oC t u t t o come primaC <strong>di</strong>chiarazione d e l l e v a r i a b i l iopen(10 , f i l e = ’ rispuntofisso . txt ’ )write ( * , * ) ’ approssimazione i n i z i a l e ’read ( * , * ) x0write ( * , * ) ’ x0 = ’ , x0C i l programma continua con l e i s t r u z i o n i gia ’ v i s t eC l e uniche mo<strong>di</strong>fiche saranno n e l l e write :write (10 ,98) ’ i t ’ , ’ xk ’ , ’ scarto ’ , ’ asint1 ’ , ’ asint2 ’write (10 ,99) i t e r , xold , scartonewC ora i l c i c l o do whileC all ’ interno abbiamowrite (10 ,100) i t e r , xnew , scartonew , asint1 , asint2C f i n i s c e i l c i c l o do whileC scriviamo i formaticlose (10)stopendEsempio <strong>di</strong>file <strong>di</strong> datiUna volta che il programma è stato compilato correttamente ed eseguito, la stampa dei risultati non saràpiù sul video ma verrà generato un file (dal nome che abbiamo dato all’interno del programma) sul qualetroveremo i risultati che prima erano sul video.Se rieseguiamo il programma questo file sarà riscritto da capo. Quin<strong>di</strong> se dobbiamo eseguire ilprogramma più volte per <strong>di</strong>verse simulazioni, il file <strong>di</strong> output conviene rinominarlo in modo da non perderlo.177


11. INTRODUZIONE AL FORTRAN 7711.15 VettoriQuando si programma in FORTRAN, un vettore va <strong>di</strong>chiarato in un certo modo e usato in maniera quasisimile a come li abbiamo stu<strong>di</strong>ati.Supponiamo <strong>di</strong> voler calcolare la me<strong>di</strong>a <strong>di</strong> un vettore x.Nello scrivere il programma, dobbiamo pensare ad una lunghezza massima per il vettore che dobbiamodare in input: questo perchè in FORTRAN77 si ha un’allocazione statica delle variabili (e non <strong>di</strong>namica).Se <strong>di</strong>amo 20 come lunghezza massima del vettore, il programma che scriveremo potrà essere eseguito suvettori che avranno al più <strong>di</strong>mensione 20.Ci sono vari mo<strong>di</strong> per dare questa <strong>di</strong>mensione massima ai vettori. Noi partiremo dal modo più semplice.Supponiamo <strong>di</strong> voler scrivere un programma che calcola la me<strong>di</strong>a delle componenti <strong>di</strong> un vettore. Comeprocedere?G I dati <strong>di</strong> input sono: n, la <strong>di</strong>mensione effettiva del vettore e x i per i = 1,2,...n le componenti del vettorex.G L’output è la variabile me<strong>di</strong> a = (∑ ni=1 x i )nPer calcolare la variabile me<strong>di</strong> a faremo la somma in questo modo (me<strong>di</strong> a è la cosiddetta variabile <strong>di</strong>accumulo):partiamo da me<strong>di</strong> a = 0quin<strong>di</strong> facciamo me<strong>di</strong> a = me<strong>di</strong> a + x 1 (prima componente della somma)poi me<strong>di</strong> a = me<strong>di</strong> a + x 2 (il risultato è x 1 + x 2 )poi me<strong>di</strong> a = me<strong>di</strong> a + x 3 (avremo x 1 + x 2 + x 3 )e così via fino a me<strong>di</strong> a = me<strong>di</strong> a + x n (in me<strong>di</strong> a avremo tutta la somma dei vettori)Dopo si fa me<strong>di</strong> a = me<strong>di</strong> a/n e avremo il risultato finale.11.16 Ciclo doPer applicare la formula per ottenere la variabile me<strong>di</strong> a possiamo pensare a un ciclo do while scrittocome:me<strong>di</strong>a =0.d0i =0do while ( i . l e . n)i = i +1me<strong>di</strong>a = me<strong>di</strong>a + x ( i )end dome<strong>di</strong>a= me<strong>di</strong>a/nNoi non useremo questo approccio ma una struttura equivalente ad essa che prende il nome <strong>di</strong> ciclo do:Programmasulla me<strong>di</strong>adei vettorime<strong>di</strong>a = 0 . d0do i =1 ,nme<strong>di</strong>a = me<strong>di</strong>a + x ( i )end dome<strong>di</strong>a= me<strong>di</strong>a/nprogram me<strong>di</strong>avettoriC programma che calcola la me<strong>di</strong>a d e l l e componenti <strong>di</strong> un v e t t o r eimplicit noneinteger n , ireal *8 x (20) , me<strong>di</strong>awrite ( * , * ) ’ lunghezza e f f e t t i v a del vettore ’read ( * , * ) nwrite ( * , * ) ’ lunghezza del vettore ’ , ni f (n . gt . 2 0 ) thenwrite ( * , * ) ’n > massimo consentito ’ , nstop178


11.16. Ciclo doen<strong>di</strong>fdo i =1 ,nwrite ( * , * ) ’componente ’ , i , ’−sima del vettore ’read ( * , * ) x ( i )end dodo i =1 ,nwrite ( * , * ) ’ elemento ’ , i , ’ = ’ , x ( i )end dome<strong>di</strong>a=0.d0do i =1 ,nme<strong>di</strong>a = me<strong>di</strong>a + x ( i )end dome<strong>di</strong>a =me<strong>di</strong>a/nwrite ( * , * ) ’me<strong>di</strong>a ’ , me<strong>di</strong>astopendG Il vettore è stato <strong>di</strong>chiarato come real*8 x(20):il vettore può avere al più 20 componenti.Osserviamo che questo tipo <strong>di</strong> <strong>di</strong>chiarazione non fa <strong>di</strong>stinzione tra vettore riga e vettore colonna.G La <strong>di</strong>mensione effettiva del vettore è data dalla variabile intera n che viene data in input (per ilmomento da tastiera);G Le singole componenti vengono inserite da tastiera tramite un’applicazione del ciclo do;G Facciamo un controllo su n, se è più piccolo o più grande della <strong>di</strong>mensione massima. Attenzione: ilciclo if si può usare anche per interrompere il programma! Se n > 20 interrompiamo bruscamente ilprogramma me<strong>di</strong>ante l’istruzione stop all’interno del ciclo if.Con il ciclo do che abbiamo visto, la variabile intera i varia da 1 a n (la <strong>di</strong>mensione del vettore).In generale la struttura del ciclo do è la seguente:do in<strong>di</strong>ce= v a l o r e i n i z i a l e , valorefinale , incremento{ i s t r u z i o n i }end doQuando incremento=1 possiamo evitare <strong>di</strong> scriverlo.Esempio 11.16.1 Vogliamo fare la somma delle componenti <strong>di</strong> in<strong>di</strong>ce pari del vettore x:sommapari=0.d0do i =2 ,n, 2sommapari=sommapari + x ( i )end doL’in<strong>di</strong>ce i vale i = 2, i = 2 + 2 = 4, i = 4 + 2 = 6. . . .Attenzione: se valoreiniziale > valorefinale e l’incremento è positivo, non si entra nel ciclo do.Si può anche trovare il ciclo do scritto nella forma (ormai obsoleta, ma può capitare <strong>di</strong> trovarlo su vecchiprogrammi):do l a bel in<strong>di</strong>ce= v a l i n i z i a l e , v a l f i n a l e , incremento{ i s t r u z i o n i }l a bel continuedove label è un numero (etichetta) che si trova all’inizio del ciclo e poi alla fine per chiuderlo (labelcontinue). La label dell’istruzione label continue va scritta a partire dalla seconda colonna.179


11. INTRODUZIONE AL FORTRAN 7711.16.1 I vettori nei sottoprogrammiI vettori si possono usare come variabili <strong>di</strong> input nelle functions (e non <strong>di</strong> output in quanto la functiondeve dare un unico valore come output e quin<strong>di</strong> non può dare un vettore) e come variabili <strong>di</strong> input e outputnelle subroutines.Quando <strong>di</strong>chiariamo i vettori in un sottoprogramma, possiamo <strong>di</strong>chiararli con la loro <strong>di</strong>mensioneeffettiva. Ve<strong>di</strong>amo un esempio <strong>di</strong> function che calcola la norma euclidea <strong>di</strong> un vettore.real *8 function norma2(n , x )implicit noneinteger n , ireal *8 x (n)norma2=0.d0do i =1 ,nnorma2=norma2 + x ( i ) * * 2end donorma2=dsqrt (norma2)returnend11.16.2 Leggere i dati <strong>di</strong> input da fileÈ chiaro che se un vettore ha molte componenti <strong>di</strong>venta proibitivo assegnare le componenti del vettoretramite tastiera. . . È possibile leggere i dati <strong>di</strong> input da un file già esistente, cui viene associata una label e cheviene aperto all’inizio del programma. Ora sono le istruzioni <strong>di</strong> read che vengono associate alla label delfile <strong>di</strong> lettura dati. Ve<strong>di</strong>amo il programma <strong>di</strong> prima come cambia (e nello stesso calcoliamo la me<strong>di</strong>a dellecomponenti del vettore utilizzando una function).program me<strong>di</strong>avettoriC programma che calcola la me<strong>di</strong>a d e l l e componenti <strong>di</strong> un v e t t o r eimplicit noneinteger n , ireal *8 x ( 2 0 ) , me<strong>di</strong>a , funme<strong>di</strong>aopen(10 , f i l e = ’ vettoreinput . dat ’ )read ( 1 0 , * ) ni f (n . gt . 2 0 ) thenwrite ( * , * ) ’n > massimo consentito ’ , nstopen<strong>di</strong>fC nella riga seguente troviamo i l c i c l o do implicitoread ( 1 0 , * ) ( x ( i ) , i =1 ,n)C analogamente possiamo applicare i l do e s p l i c i t oC che ora e ’ commentatoc do i =1 ,nc read ( 1 0 , * ) x ( i )c end dodo i =1 ,nwrite ( * , * ) ’ elemento ’ , i , ’ = ’ , x ( i )end dome<strong>di</strong>a= funme<strong>di</strong>a (n , x )write ( * , * ) ’me<strong>di</strong>a ’ , me<strong>di</strong>aclose (10)stopendreal *8 function funme<strong>di</strong>a (n , x )implicit none180


11.17. Matrici in FORTRANinteger i , nreal *8 x (n)funme<strong>di</strong>a=0.d0do i =1 ,nfunme<strong>di</strong>a = funme<strong>di</strong>a + x ( i )end dofunme<strong>di</strong>a =funme<strong>di</strong>a/nreturnendPer la lettura dei dati <strong>di</strong> input si può utilizzare sia il ciclo do che abbiamo visto fino ad ora sia quello che èchiamato do implicito.Essenzialmente quando si devono leggere dei dati da un file, il compilatore FORTRAN leggerà dellestringhe <strong>di</strong> caratteri e le convertirà in numeri.Ci sono delle <strong>di</strong>fferenze sulle modalità <strong>di</strong> come avviene la lettura me<strong>di</strong>ante il do esplicito o implicito, manon entriamo nei dettagli. Ciò che importa e bisogna ricordare è che ci deve essere corrispondenza tra quelloche viene scritto sul file e le variabili a cui assegnare quei valori. Inoltre, lasciamo almeno uno spazio tra unvalore e il successivo se li scriviamo sulla stessa riga.Le variabili <strong>di</strong> tipo reale vanno scritte con il punto decimale. Le variabili <strong>di</strong> tipo intero vanno scritte senzail punto decimale.Le componenti <strong>di</strong> un vettore vanno scritte o su una riga o in colonna componente per componente.Scriviamo sulla prima riga il valore <strong>di</strong> n e sulla seconda riga le componenti del vettore.41. 2. 3. 4.Esempi <strong>di</strong> filevettoreinput.datOppure scriviamo sulla prima riga il valore <strong>di</strong> n e sulle righe successive le componenti del vettore.41.2.3.4.11.17 Matrici in FORTRANIn FORTRAN, le matrici vanno <strong>di</strong>chiarate dando una <strong>di</strong>mensione massima sia sulle righe sia sulle colonne.Possiamo lavorare sia su matrici rettangolari, sia su matrici quadrate. Per semplicità, poichè noi avremo a chefare con matrici quadrate, descriveremo e faremo programmi solo su matrici quadrate.Supponiamo <strong>di</strong> voler fare il prodotto <strong>di</strong> una matrice A per un vettore x.Il risultato del prodotto <strong>di</strong> una matrice per un vettore è un vettore.Come scrivere un programma che fa questa operazione?G I dati <strong>di</strong> input sono: n, la <strong>di</strong>mensione effettiva della matrice A e del vettore, le componenti A(i , j ) (iin<strong>di</strong>ce <strong>di</strong> riga e j in<strong>di</strong>ce <strong>di</strong> colonna) per i , j = 1,2,...n della matrice, e le componenti x(i ) del vettore,per i = 1,2,...n.G L’output è il vettore y <strong>di</strong> componenti y(i ) dove y = AxSappiamo che y i = (Ax) i = ∑ ni=1 A i j x j .Traduciamo il tutto in FORTRAN con il seguente programma.program matrvettC programma per i l calcolo del prodotto <strong>di</strong> una matrice A per unC v e t t o r e xC dati <strong>di</strong> input :C n − <strong>di</strong>mensione e f f e t t i v a della matrice ( quadrata ) eC del v e t t o r e xProgrammasul prodottomatricevettore181


11. INTRODUZIONE AL FORTRAN 77C A − matrice <strong>di</strong> <strong>di</strong>mensione nxnC x − v e t t o r e <strong>di</strong> lunghezza nC dati <strong>di</strong> outputC y − v e t t o r e <strong>di</strong> lunghezza n uguale al prodotto AxCimplicit noneinteger i , j , nreal *8 A( 2 0 , 2 0 ) , x ( 2 0 ) , y (20)open(10 , f i l e = ’ matrvett . dat ’ )open(11 , f i l e = ’ matrvett . r i s ’ )C l e t t u r a della <strong>di</strong>mensione nread ( 1 0 , * ) nC l e t t u r a della matrice AC usiamo un c i c l o do i =1 ,n e s p l i c i t o e un c i c l o do implicitoC leggiamo g l i elementi che s i trovano s u l l a riga i−simaC e la l e t t u r a viene f a t t a riga per rigado i =1 ,nread ( 1 0 , * ) (A( i , j ) , j =1 ,n)end doCC l e t t u r a del v e t t o r e xread ( 1 0 , * ) ( x ( i ) , i =1 ,n)C s c r i t t u r a dei dati <strong>di</strong> input sul f i l e dei r i s u l t a t iwrite ( 1 1 , * ) ’ <strong>di</strong>mensione ’ , nwrite ( 1 1 , * ) ’ matrice A ’do i =1 ,nwrite ( 1 1 , * ) (A( i , j ) , j =1 ,n)end dowrite ( 1 1 , * ) ’ vettore x ’write ( 1 1 , * ) ( x ( i ) , i =1 ,n)C prodotto matrice−v e t t o r e : l ’ elemento i−simo del prodottoC matrice−v e t t o r e e ’ dato dalla somma per j =1 ,n <strong>di</strong> A( i , j ) * x ( j )do i =1 ,ny ( i ) = 0 . d0do j =1 ,ny ( i ) = y ( i ) + A( i , j ) * x ( j )end doend dowrite ( 1 1 , * ) ’ vettore y=Ax ’write ( 1 1 , * ) ( y ( i ) , i =1 ,n)stopendLa matrice è stata <strong>di</strong>chiarata come real*8 A(20,20): al più 20 righe per 20 colonne.G Abbiamo usato un ciclo do i=1, n e un ciclo do j=1,n concatenato al primo per fare il prodottomatrice-vettore.G Per calcolare le componenti del prodotto matrice-vettore abbiamo prima posto y(i)=0.d0 in mododa poter fare la somma dei vari termini “accumulandoli” <strong>di</strong> volta in volta.G Abbiamo letto i dati <strong>di</strong> input da file. Ricor<strong>di</strong>amo che il numero che scriviamo all’interno dell’istruzioneche apre il file open(10, file=’nomefile.dat’) lo scegliamo noi. Se apriamo più files a ciascunofile deve essere associato un numero <strong>di</strong>verso, in modo da poter leggere (se il file è <strong>di</strong> lettura) o scrivere(se il file è <strong>di</strong> scrittura) in modo appropriato.11.17.1 Le matrici nei sottoprogrammiQuando una (o più matrici) devono essere passate in un sottoprogramma (sia esso una function o unasubroutine), all’interno del sottoprogramma si deve necessariamente <strong>di</strong>chiarare la matrice (o le matrici) con182


11.17. Matrici in FORTRANla loro <strong>di</strong>mensione massima sulle righe.Facciamo un esempio e successivamente ne vedremo le ragioni.Scriviamo un programma in cui, me<strong>di</strong>ante una subroutine, data la matrice A si crea la matrice B = A T .program matrtraspostaC programma che crea la matrice B=A^TC dati <strong>di</strong> input :C n − <strong>di</strong>mensione e f f e t t i v a della matrice ( quadrata )C A − matrice <strong>di</strong> <strong>di</strong>mensione nxnC dati <strong>di</strong> outputC B − matrice trasposta <strong>di</strong> ACimplicit noneinteger i , j , nreal *8 A( 2 0 , 2 0 ) , B(20 ,20)open(10 , f i l e = ’ matrice . dat ’ )open(11 , f i l e = ’ r i s t r a s p o s t a . dat ’ )C l e t t u r a della <strong>di</strong>mensione nread ( 1 0 , * ) nC l e t t u r a della matrice AC usiamo un c i c l o do i =1 ,n e s p l i c i t o e un c i c l o do implicitoC leggiamo g l i elementi che s i trovano s u l l a riga i−sima eC la l e t t u r a viene f a t t a riga per rigado i =1 ,nread ( 1 0 , * ) (A( i , j ) , j =1 ,n)end dowrite ( 1 1 , * ) ’ <strong>di</strong>mensione ’ , nwrite ( 1 1 , * ) ’ matrice A ’do i =1 ,nwrite ( 1 1 , * ) (A( i , j ) , j =1 ,n)end doc a l l trasposta (n , A , B)write ( 1 1 , * ) ’ matrice trasposta B ’do i =1 ,nwrite ( 1 1 , * ) (B( i , j ) , j =1 ,n)end dostopendsubroutine trasposta (n , A , B)implicit noneinteger i , j , nreal *8 A(20 ,n) , B(20 ,n)do i =1 ,ndo j =1 ,nB( i , j )=A( j , i )end doend doreturnendSupponiamo <strong>di</strong> dover scrivere più sottoprogrammi che richiamano matrici e vettori. Per le matrici, in ciascunodei sottoprogrammi dobbiamo dare la <strong>di</strong>mensione massima delle righe: per esempio A(20,20) nelprogramma principale e A(20,n) o A(20,20) (vanno bene entrambe le forme) nei sottoprogrammi.Supponiamo però <strong>di</strong> voler eseguire il programma già fatto, e che funziona bene, per una matrice <strong>di</strong> <strong>di</strong>-183


11. INTRODUZIONE AL FORTRAN 77mensione 50 × 50. Possiamo andare ad aumentare la <strong>di</strong>mensione massima delle matrici e dei vettori da 20 a50, ricompilare il programma ed eseguirlo.Cosa può succedere? Se da qualche parte ci siamo <strong>di</strong>menticati <strong>di</strong> correggere il 20 con il 50. . . il co<strong>di</strong>cedarà risultati sbagliati. . . Per evitare questo inconveniente possiamo usare una variabile che si chiama parameterper in<strong>di</strong>care la <strong>di</strong>mensione massima delle matrici. Nel programma principale (supponiamo <strong>di</strong> volermo<strong>di</strong>ficare il programma della trasposta <strong>di</strong> una matrice), scriveremoprogram matrtraspostaC programma che crea la matrice B=A^TC t u t t i g l i a l t r i commenti come primaCimplicit noneinteger nmaxparameter (nmax=20)integer i , j , nreal *8 A(nmax,nmax) , B(nmax,nmax)C t u t t o i l r e s t o i n a l t e r a t o fino alla chiamata della subroutinec a l l trasposta (nmax, n , A , B)subroutine trasposta (nmax, n , A , B)implicit noneinteger i , j , n ,nmaxreal *8 A(nmax, n) , B(nmax, n)do i =1 ,ndo j =1 ,nB( i , j )=A( j , i )end doend doreturnendParameternmax La variabile nmax è un parametro che viene definito una volta per tutte me<strong>di</strong>ante l’istruzioneparameter (nmax=20): all’interno del programma noi non possiamo cambiare il valore dato a nmax.Al posto <strong>di</strong> scrivere A(20,20) noi scriviamo A(nmax,nmax). Se ci sono vettori, li <strong>di</strong>chiariamo comex(nmax).Nei sottoprogrammi, dove ci sono matrici, passiamo nmax nella lista delle variabili <strong>di</strong> input delsottoprogramma e <strong>di</strong>chiariamo A(nmax,n).In questo modo, se vogliamo cambiare la <strong>di</strong>mensione massima, an<strong>di</strong>amo a cambiare solo l’istruzioneparameter (nmax=20) Per esempio scriviamo parameter (nmax=50), compiliamo il programma epossiamo eseguirlo per matrici e vettori al più <strong>di</strong> <strong>di</strong>mensione 50. Ma an<strong>di</strong>amo a cambiare solo una riga <strong>di</strong>co<strong>di</strong>ce e non tutte le righe in cui sono <strong>di</strong>chiarate le matrici e i vettori. . .11.17.2 Memorizzazione delle matriciLe matrici sono memorizzate colonna per colonna - prima gli elementi <strong>di</strong> tutta la prima colonna dallaprima all’ultima riga, poi tutti gli elementi della seconda colonna dalla prima all’ultima riga, e così via . . .Sia nmax=6, A(nmax,nmax)A può avere al più nmax righe per nmax colonne. nmax * nmax = 36 celle <strong>di</strong> memoria sono pre<strong>di</strong>sposteper i valori della matrice, a partire da A(1,1)184


11.18. La formula dei trapezi in FORTRAN1 7 13 19 25 312 8 14 20 26 323 9 15 21 27 334 10 16 22 28 345 11 17 23 29 356 12 18 24 30 36Cosa succede se la <strong>di</strong>mensione effettiva della matrice è n < nmax? All’interno del programma principalei valori della matrice vengono memorizzati nelle celle <strong>di</strong> memoria che corrispondono alla “sottomatrice” <strong>di</strong><strong>di</strong>mensione n x n.Sia n=4. Si ha:1 7 13 19 25 312 8 14 20 26 323 9 15 21 27 334 10 16 22 28 345 11 17 23 29 356 12 18 24 30 36Se nel sottoprogramma si <strong>di</strong>chiara correttamente la matrice Areal*8 A(nmax,n)allora anche il passaggio della matrice avviene correttamente.Se nel sottoprogramma si <strong>di</strong>chiara invecereal*8 A(n, n)allora la locazione <strong>di</strong> memoria all’interno del sottoprogramma è “pensata” come se fossenmax=n1 5 9 132 6 10 143 7 11 154 8 12 16Ma nelle cellette <strong>di</strong> posto 5, 6, 11 e 12 non ci sono i valori della matrice: la memorizzazione risulta noncorretta!!!11.18 La formula dei trapezi in FORTRANProviamo a implementare la formula composta dei trapezi in FORTRAN.Scegliamo la funzione da integrare e gli estremi <strong>di</strong> integrazione e, come primo approccio, <strong>di</strong>amo in inputil numero <strong>di</strong> sud<strong>di</strong>visioni n in cui applicare la formula composta. Inoltre, per vedere se il co<strong>di</strong>ce lo abbiamoscritto bene, daremo anche il valore esatto dell’integrale Iex (che avremo precedentemente calcolato concarta e penna) in modo da calcolare l’errore esatto.La funzione da approssimare, gli estremi <strong>di</strong> integrazione, il valore esatto dell’integrale saranno funzioneo variabili del programma.G dati <strong>di</strong> input:– numero <strong>di</strong> sud<strong>di</strong>visioni n– estremi <strong>di</strong> integrazione a, bG dati <strong>di</strong> output:– valore approssimato dell’integrale (usiamo per esso la variabile i tr ap)– errore esatto, che chiamiamo er r tr ap.185


11. INTRODUZIONE AL FORTRAN 77Il programma sarà così composto:G programma principaleG function in cui scriviamo la funzione integranda.G function in cui scriviamo la primitiva della funzione integranda (per calcolare il valore esattodell’integrale)G function in cui applichiamo la formula semplice dei trapezi e che chiamiamo trapsempliceTra i dati che ci facciamo stampare sul file <strong>di</strong> output, conviene farsi stampare una specie <strong>di</strong> promemoriasul problema che stiamo risolvendo (formula che stiamo applicando, gli estremi <strong>di</strong> integrazione a e b, ilvalore esatto dell’integrale Iex e, come stringa <strong>di</strong> caratteri, anche quale è la funzione integranda). In talmodo abbiamo “memoria” del problema che vogliamo risolvere e dei risultati ad esso associati.Applichiamo la formula dei trapezi su ciascun intervallino. La prima volta andrà applicata sull’intervallo[a, a + h], poi su [a + h, a + 2h] e così via, dove h è l’ampiezza dei singoli sottointervalli, che è la stessa sututti i sottointervalli avendo scelto <strong>di</strong> sud<strong>di</strong>videre in parti uguali l’intervallo [a,b], quin<strong>di</strong> h = b − a . Su ogninsottointervallo possiamo applicare la formula semplice dei trapezi in modo da avere il valore finale dell’integraleapprossimato come somma dei contributi su ciascun sottointervallo. A tal scopo useremo, su ciascunsottointervallo, una function che applica la formula semplice dei trapezi.Possiamo quin<strong>di</strong> fare un ciclo do in modo da applicare la formula semplice all’intervallino [x0, x1], dovex0 rappresenta l’estremo inferiore e x1 l’estremo superiore <strong>di</strong> ciascun sottointervallo. Ogni volta aggiorneremoin maniera appropriata i due estremi (tenendo conto che x1 nell’intervallo successivo <strong>di</strong>venta x0:l’estremo superiore <strong>di</strong> ogni intervallino <strong>di</strong>venta l’estremo inferiore nell’intervallino successivo).Scriviamo sotto forma <strong>di</strong> pseudoco<strong>di</strong>ce, quello che dobbiamo fare:Dati <strong>di</strong> input: a, b, nDati <strong>di</strong> output: i tr ap, er r tr ap1 h ←− (b − a)/n ;2 calcolare Iex ;3 inizializzare i tr ap: i tr ap ←− 0.d0 ;4 inizializzare x0 del primo sottointervallo x0 ←− a ;5 Per i = 1,n6 assegnare il valore <strong>di</strong> x1: x1 ←− x0 + h ;7 applicare la formula dei trapezi sull’intervallino i -simo e sommare il contributo al valore i tr ap:i tr ap ←− i tr ap + tr apsempl i ce(x0, x1) ;8 aggiornare x0: x0 ←− x1 ;9 Fine-Per10 stampare l’integrale approssimato i tr ap ;11 calcolare e stampare l’errore esatto er r tr ap ;Per le functions da scrivere, si deve tener conto che, per la funzione integranda, la function da utilizzare èmolto semplice: basta scrivere la funzione integranda.Per esempio, per calcolare l’integrale ∫ 0.5 π0 , f (x) = π . Per scrivere π in Fortran, basta1 − x2 1 − x2ricordare che π = 2arcsin(1). Allora la function <strong>di</strong>venta:real *8 function fun ( x )implicit nonereal *8 x , pipi =2* asin ( 1 . )fun= pi / sqrt ( 1 . 0 d0 − x * * 2 )returnendPer il calcolo del valore esatto dell’integrale, dobbiamo calcolare analiticamente l’integrale (faremo <strong>degli</strong>esempi <strong>di</strong> applicazione delle formule <strong>di</strong> quadratura con integrali <strong>di</strong> cui è possibile conoscere l’integrale esatto,quin<strong>di</strong> preliminarmente, avremo calcolato a mano l’integrale, andando a cercare una primitiva della funzioneintegranda). Conviene allora utilizzare una function per la primitiva, in modo da poter assegnare il valo-186


11.18. La formula dei trapezi in FORTRANre esatto dell’integrale me<strong>di</strong>ante l’istruzione Iex = F pr i m(b) − F pr i m(a), dove F pr i m è il nome dato allafunction della primitiva. Nell’esempio, F pr i m(x) = πarcsin(x) e la function viene costruita <strong>di</strong> conseguenza.real *8 function Fprim ( x )real *8 pi , xpi =2.* asin ( 1 . )Fprim= pi * asin ( x )returnendInvece, la function trapsemplice non è nient’altro che l’applicazione della formula semplice dei trapezisull’intervallo <strong>di</strong> estremi x0 e x1 dati in input alla function stessa. All’interno della trapsemplice vienechiamata la function della funzione integranda.real *8 function trapsemplice ( a , b)real *8 a , b , funtrapsemplice =(b−a ) / 2 . * ( fun ( a)+ fun (b ) )returnendProviamo ora ad applicare la formula composta dei trapezi partendo da una sola sud<strong>di</strong>visione n = 1, e poiraddoppiando ogni volta il numero delle sud<strong>di</strong>visioni: n = 2, n = 4, n = 8, . . . In tal caso conviene mo<strong>di</strong>ficareil programma scritto per applicare la formula composta dei trapezi per tute le sud<strong>di</strong>visioni richieste introducendoun ciclo do while che permette <strong>di</strong> calcolare la formula composta dei trapezi prima per n = 1, poiper n = 2 e così via, raddoppiando ogni volta il numero <strong>di</strong> sud<strong>di</strong>visioni. In questo modo, conservando i valoridell’errore esatto tra due sud<strong>di</strong>visioni successive, possiamo calcolare il rapporto tra l’errore alla sud<strong>di</strong>visionen/2 e l’errore alla sud<strong>di</strong>visione n. Memorizziamo questo rapporto nella variabile r ate e la stampiamo perogni sud<strong>di</strong>visione n > 1. Dai risultati saremo in grado <strong>di</strong> capire se l’errore decresce come 1 oppure no e,n2 quin<strong>di</strong>, se sono verificate le ipotesi per la formula composta dell’errore come descritto a pag. 128.Per esempio, se vogliamo applicare la formula dei trapezi per n = 1,2,4,8,...,128 sotto forma <strong>di</strong> pseudoco<strong>di</strong>ce,abbiamoDati <strong>di</strong> input: a, bDati <strong>di</strong> output: i tr ap, er r tr ap, r ate per ogni sud<strong>di</strong>visione1 n ←− 1 ;2 Fintantochè n < 1283 inizializzare i tr ap: i tr ap ←− 0.d0 ;4 porre h ←− (b − a)/n5 ; inizializzare x0 del primo sottointervallo x0 ←− a ;6 applicare l’algoritmo della formula composta dei trapezi ;7 stampare i tr ap per quel valore <strong>di</strong> n ;8 calcolare l’errore esatto er r tr ap ;9 Se n > 1 allora10 calcolare il rapporto r ate tra l’errore al passo n/2 e l’errore al passo n11 altrimenti12 r ate ←− 1 (non ha significato per n = 1)13 Fine-Se14 stampare n, i tr ap, er r tr ap, r ate ;15 aggiornare una variabile er r tr apol d che memorizza l’errore al passo precedente:er r tr apol d ←− er r tr ap ;16 aggiornare n: n ←− 2n ;17 Fine-Fintantochè187


11. INTRODUZIONE AL FORTRAN 7711.19 <strong>Esercizi</strong><strong>Esercizi</strong>o 11.19.1 Scrivere un programma FORTRAN che, assegnate due matrici A e B <strong>di</strong> <strong>di</strong>mensione n ≤ 30,esegua il prodotto C=AB; memorizzi in un vettore x gli elementi della <strong>di</strong>agonale principale <strong>di</strong> C; calcoli lanorma euclidea <strong>di</strong> x.I dati <strong>di</strong> input siano letti da un file chiamato input.dat.Scrivere, perciò, un programma che:a) legge la <strong>di</strong>mensione n, le matrici A e B e stampa i dati letti con commento;b) calcola la matrice C=AB servendosi della subroutine MATRMATR;c) salva gli elementi C i i in un vettore chiamato x;d) calcola la norma euclidea <strong>di</strong> x servendosi della function NORMAEUC;e) stampa la norma euclidea <strong>di</strong> x.(mettere a punto la subroutine MATRMATR e la function NORMAEUC.)Svolgimentoprogram prodottomatriciimplicit noneinteger nmaxparameter (nmax=30)integer n , i , jreal *8 A(nmax,nmax) ,B(nmax,nmax) , C(nmax,nmax) ,real *8 normaeuc , eucx (nmax)open(20 , f i l e = ’ input . dat ’ )open(21 , f i l e = ’ output . dat ’ )read ( 2 0 , * ) nwrite ( 2 1 , * ) ’ <strong>di</strong>mensione n ’ , nwrite ( 2 1 , * ) ’ matrice A’do i =1 ,nread ( 2 0 , * ) (A( i , j ) , j =1 ,n)write ( 2 1 , * ) (A( i , j ) , j =1 ,n)end dowrite ( 2 1 , * ) ’ matrice B’do i =1 ,nread ( 2 0 , * ) (B( i , j ) , j =1 ,n)write ( 2 1 , * ) (B( i , j ) , j =1 ,n)end doc a l l matrmatr (nmax, n , A , B,C)do i =1 ,nx ( i )= C( i , i )end doeuc=normaeuc(n , x )write ( 2 1 , * ) ’norma euclidea <strong>di</strong> x ’ , eucstopendsubroutine matrmatr (nmax, n , A , B,C)implicit noneinteger nmax, n , i , j , kreal *8 A(nmax, n) , B(nmax, n) , C(nmax, n)C devo f are i l prodotto <strong>di</strong> A e B188


11.19. <strong>Esercizi</strong>C ricordo la formula C_ij = somma_k ( A_ik * B_kj )do i =1 ,ndo j =1 ,nC( i , j )= 0 . d0do k=1 ,nC( i , j )= C( i , j ) + A( i , k ) *B( k , j )end doend doend doreturnendreal *8 function normaeuc(n , x )implicit noneinteger n , ireal *8 x (n)normaeuc=0.d0do i =1 ,nnormaeuc= normaeuc + x ( i ) * * 2end donormaeuc= sqrt (normaeuc)returnend189

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!