Appunti Calcolo

  • Uploaded by: Giacomo Rossi
  • 0
  • 0
  • February 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Appunti Calcolo as PDF for free.

More details

  • Words: 85,777
  • Pages: 206
Loading documents preview...
ANNAMARIA MAZZIA

APPUNTI DI CALCOLO NUMERICO

C R E AT I V E C O M M O N S L I C E N S E

pubblicato con creative commons license da Annamaria Mazzia, Dipartimento di Ingegneria Civile Edile e Ambientale (DICEA), Università degli Studi di Padova, anno 2018 utilizzando uno stile latex (personalizzato) reperibile su tufte-latex.googlecode.com Questo lavoro è stato rilasciato sotto la licenza Creative Commons Attribuzione- Non commerciale -Non opere derivate 3.0 Italia License, Per leggere una copia della licenza visita il sito web (http://creativecommons.org/licenses/by-nc-nd/ 3.0/it/) Il pacchetto Latex utilizzato ha la Licenza Apache, Version 2.0. (http://www.apache.org/licenses/ LICENSE-2.0) . Dispensa aggiornata in Febbraio 2018

Indice

1

Introduzione al Calcolo Numerico

2

Struttura dell’elaboratore

3

Richiami di analisi

4

Rappresentazione dei numeri nel calcolatore

5

Zeri di funzione

6

Interpolazione

7

Approssimazione

8

Integrazione numerica

9

Metodi diretti per la soluzione di sistemi lineari

7

11

23 29

49 81 105 113

10 Metodi iterativi per la soluzione di sistemi lineari

137 161

11 Differenziazione numerica ed equazioni alle derivate ordinarie Bibliografia

205

185

Istruzioni per l’uso

Le pagine che seguono sono una dispensa di Calcolo Numerico, aggiornata di anno in anno e pensata per il corso di Calcolo Numerico degli studenti di Ingegneria dell’Università di Padova, in particolare per quelli dell’area industriale e, nello specifico, del corso di laurea triennale in Ingegneria dell’Energia. Ogni capitolo spiega, spero con molti dettagli, i vari punti del programma di Calcolo Numerico, con esempi, dimostrazioni, approfondimenti ed esercizi. Le parti introdotte dalla figura della lente di ingrandimento e la scritta “Dettagli” sono parti di approfondimento che non fanno parte esplicita del programma del corso ma che possono essere utili per comprendere meglio un determinato argomento. Di queste parti, quindi, è suggerita una attenta lettura. Alla fine di ogni capitolo sono presenti esercizi svolti. Qualche studente potrebbe dire che non ci sono molti esercizi svolti. In effetti, il numero di esercizi proposti per ogni capitolo è essenziale, va da tre a sei, per due motivi: molti esercizi vengono svolti in aula durante le lezioni e si suppone che uno studente segua il corso e quindi partecipi alla soluzione degli esercizi proposti a lezione; inoltre, come raccolta a parte (una dispensa parallela a questa) viene offerta un’ampia collezione di esercizi (per un totale di oltre centocinquanta!) presi dai temi d’esame degli anni passati e, per ciascuno di questi esercizi, è data anche una soluzione sintetica. Oltre agli esercizi, alla fine di ogni capitolo vi è una sezione intitolata Domande di riepilogo in cui sono proposte domande di comprensione degli argomenti trattati nel capitolo stesso. Soffermarsi a rispondere a queste domande permette di prepararsi con maggiore cura alla parte teorica del compito d’esame. Buon lavoro e buono studio!! Padova, Febbraio 2018 Annamaria Mazzia P.S. Per migliorare sempre più queste dispense, se avete dubbi su alcune parti o trovate errori, di stampa e non, potete gentilmente segnalarmi le vostre perplessità all’indirizzo email: annamaria.mazzia CHIOCCIOLA unipd.it

Il matematico sbircia dietro le spalle di Dio per trasmettere la bellezza della Sua creazione al resto delle Sue creature. Paul Erdös

1 Introduzione al Calcolo Numerico

Il calcolo numerico è una disciplina che riguarda lo studio e lo sviluppo di algoritmi numerici (cioè di procedimenti di calcolo) utili per risolvere problemi matematici che si incontrano in vari campi delle scienze e dell’ingegneria (e non solo). Facciamo subito degli esempi.

1.0.1

Il sistema GPS Il sistema GPS (Global Positioning System) permette di determinare la posizione di un ricevitore utilizzando le distanze misurate rispetto a punti dalle coordinate note. Questi punti dalle coordinate note sono i satelliti, che trasmettono un segnale in direzione della terra. Un ricevitore GPS misura il tempo richiesto da un segnale per propagarsi da un satellite GPS fino al ricevitore stesso. Poichè il segnale viaggia alla velocità della luce, l’intervallo di tempo può essere convertito in distanza moltiplicandolo per la velocità della luce. In assenza di errori (nell’ipotesi, quindi, di sincronizzazione perfetta tra l’orologio presente nel ricevitore e quello nel satellite, mancanza di ionosfera e troposfera, che, invece, rallentano l’arrivo del segnale, ...), una misura di questo tipo ci permette di avere informazioni sulla posizione del ricevitore: esso deve trovarsi in qualche punto della superficie della sfera centrata nel satellite e con raggio uguale alla distanza misurata. Se, contemporaneamente, un secondo satellite invia un segnale allo stesso ricevitore, allora il ricevitore deve trovarsi anche da qualche parte sulla superficie sferica con centro nel secondo satellite e raggio dato da questa seconda distanza misurata. Le due superfici sferiche, quindi, si intersecano e sulla circonferenza generata dalla loro intersezione si troverà il nostro ricevitore. Un terza e simultanea misura, data da un terzo satellite, dà una terza superficie sferica che interseca le altre due in soli due punti: uno di questi punti può essere eliminato subito perchè non si trova sulla terra e rimane quindi un solo punto, che permette di identificare la posizione del ricevitore. Quanto abbiamo appena detto vale in linea teorica, in condizioni ideali. Infatti, in genere, l’orologio atomico presente nel ricevitore GPS e gli orologi presenti nei satelliti non sono sincronizzati

Quando puoi misurare ciò di cui stai parlando, ed esprimerlo in numeri, puoi affermare di saperne qualcosa; se però non puoi misurarlo, se non puoi esprimerlo con numeri, la tua conoscenza sarà povera cosa e insoddisfacente: forse un inizio di conoscenza, ma non abbastanza da far progredire il tuo pensiero fino allo stadio di scienza, qualsiasi possa essere l’argomento. Lord William T. Kelvin

8

annamaria mazzia

perfettamente. Gli stessi orologi nei satelliti sono sincronizzati l’uno con l’altro con un certo errore che, per quanto piccolo non può essere trascurato. Le misure osservate, inoltre, sono affette da errori anche di altra natura, come gli effetti della ionosfera e troposfera, l’errore di misura del ricevitore stesso, errori di orbita ... Nella pratica, dunque non bastano le distanze prese rispetto a tre satelliti, ma ne occorrono molte di più, per cercare di individuare le coordinate del ricevitore, tenendo in conto il fatto che le misure sono affette da errore. Il problema da risolvere per ottenere la posizione del ricevitore diventa dunque un problema di tipo numerico, in particolare di approssimazione ai minimi quadrati non lineari.

1.0.2

Noi studieremo il problema più semplice, quello di approssimazione lineare ai minimi quadrati.

Analisi di processi chimici La cattura di anidride carbonica con l’utilizzo di sorbenti solidi in un reattore di assorbimento è un esempio di un problema di analisi dei processi chimici di separazione, di miscelazione e dei reattori chimici. Tale analisi si basa sulle equazioni di bilancio di materia e di energia totale, cioè la somma dell’energia interna e dell’energia meccanica. Da un punto di vista matematico, questi bilanci sono rappresentati da un sistema di equazioni alle derivate ordinarie, in cui la variabile indipendente è data dal tempo. In condizioni di stazionarietà (eliminando quindi la dipendenza dal tempo), queste equazioni si traducono in un sistema algebrico di equazioni non lineari in più variabili la cui soluzione va cercata numericamente. Una strada da usare può essere data dal metodo di Newton per sistemi non lineari.

1.0.3

Un errore di tempo in termini di millisecondi può dare un errore nella posizione di circa 300 chilometri e questo, chiaramente, è un errore troppo grande!

Mini e micro turbine idrauliche L’energia idroelettrica è una delle principali fonti di energia rinnovabile. Oltre ai grandi impianti idroelettrici, sta ottenendo un forte impulso un sistema più flessibile di distribuzione con la costruzione di impianti mini e micro idroelettrici che utilizzano turbine di piccole dimensioni. Per avere la maggiore efficienza è indispensabile utilizzare un regolatore di portata all’interno della turbina in modo da mantenere un carico adeguato in funzione della portata. Dal momento che i sistemi di regolazione efficienti per mini e micro turbine hanno un costo elevato, si cercano sistemi di regolazione efficienti ma a costi inferiori: come soluzione è stato proposto di usare una turbina di tipo Cross-Flow munita di un sistema di regolazione semplice in grado di funzionare con un’efficienza quasi costante in un ampio intervallo di portate da turbinare. Per rendere valida questa proposta, e prima ancora di passare alla costruzione della turbina, si utilizza una procedura fluidodinamica di tipo computazionale: analisi idrodinamica, metodi numerici e programmi di tipo numerico permettono

Noi studieremo il metodo di Newton per equazioni non lineari.

appunti di calcolo numerico

di stabilire come dimensionare le variabili in gioco nel problema in modo da poter avere la turbina che risponda ai requisiti richiesti.

1.0.4

Laura e Petrarca Ebbene sì, il Calcolo Numerico è andato a intrufolarsi anche tra le poesie del Petrarca! È stato sviluppato un modello matematico sul Canzoniere: un sistema di equazioni differenziali che esprime i sentimenti di Laura e Petrarca e la cui soluzione va cercata numericamente (ad esempio utilizzando MATLAB). Si rimanda i più curiosi alle seguenti pagine e articoli reperibili in rete: http://areeweb.polito.it/didattica/polymath/htmlS/Interventi/ Articoli/Petrarca/Petrarca.html http://hrcak.srce.hr/file/69204

1.1

Si parte!

In tutti gli esempi che abbiamo visto, si parte da un problema, che può essere un fenomeno osservato nei vari settori dell’ingegneria (chimica, civile, informatica, dell’energia, meccanica ...) ma anche in biologia, chimica, fisica, economia (e, abbiamo visto, anche in letteratura). Il fenomeno da studiare viene tradotto in modello matematico. Dal momento che il modello matematico è difficile da risolvere o non può essere affatto risolto analiticamente, occorre passare al Calcolo Numerico. Si applica, cioè, un metodo numerico che risolva il problema matematico e arrivi ad una soluzione numerica che sia efficiente, accurata ed affidabile. Il Calcolo Numerico sviluppa i diversi metodi in modo da dire sotto quali ipotesi essi possano dare risultati buoni, quando possono essere usati e per quali tipi di problemi. Gli algoritmi numerici vanno poi sviluppati per essere implementati al calcolatore: tutto ciò ha portato allo sviluppo di linguaggi o ambienti di programmazione (Fortran, C++, MATLAB, Octave,...). Infatti solo con l’aiuto del calcolatore si riesce a dare una risposta esauriente e completa ai problemi che il Calcolo Numerico può risolvere. Perciò, in un corso di Calcolo Numerico, si cerca di combinare gli elementi della teoria degli algoritmi numerici per risolvere determinati problemi matematici insieme alla conoscenza di un linguaggio di programmazione che permetta di risolvere numericamente quei problemi al calcolatore. È importante, quindi, partire dalla struttura di un calcolatore e dalla rappresentazione dei numeri al calcolatore, per poi passare allo studio di metodi numerici per la soluzione di diversi problemi. Vedremo, in particolare, la ricerca degli zeri di funzione, problemi di interpolazione e approssimazione di dati, metodi diretti e iterativi per la soluzione di sistemi lineari, formule di quadratura numerica,

9

Per avere un quadro più preciso si rimanda a https://iris.unipa.it/retrieve/ handle/10447/100694/131679/ Articolo_H2O_Tucciarelli.pdf

10

annamaria mazzia

problemi di differenziazione numerica e metodi per la soluzione di equazioni differenziali. Per ciascuno di essi presenteremo degli esempi che derivano da fenomeni osservati in diversi settori scientifici e che vengono tradotti in problemi matematici, da risolvere, appunto, con le più opportune tecniche numeriche. In questo modo, impareremo i metodi di base e gli strumenti di analisi e di programmazione, in modo da essere pronti per affrontare i problemi più complicati che ci riserverà il futuro.

2 Struttura dell’elaboratore 2.1

Introduzione

Se dobbiamo comprare un computer, abbiamo solo l’imbarazzo della scelta tra i tanti disponibili sul mercato. Ma in base a quali criteri scegliamo un computer? Le caratteristiche fondamentali di un computer si possono riassumere in poche parole-chiave: processore, sistema operativo, memoria. Cosa significano esattamente? E, prima ancora, cosa significa Computer?

I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. L’insieme dei due costituisce una forza incalcolabile. Albert Einstein

Figura 2.1: Stralci di volantini pubblicitari per l’acquisto di un computer.

Definizione 2.1.1 Computer = elaboratore elettronico digitale Dispositivo elettronico che elabora le informazioni, immesse sotto forma di dati numerici, secondo una sequenza di istruzioni preordinate (programma).

x

Elaboratore: macchina capace di immagazzinare ed elaborare dati in base ad una serie di istruzioni (programmi) memorizzate sul computer

x

elettronico: utilizza componenti elettroniche per elaborare le informazioni

x

digitale: elabora e memorizza segnali digitali basati su cifre binarie: 0 e 1

In 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 dispositivi fisici che lo compongono. Si chiama, invece, software l’insieme delle istruzioni (i programmi) che consentono all’hardware di svolgere i propri compiti Attraverso un computer, elaboriamo dati (numeri, suoni, video, fotografie) in modo da ottenere informazioni (lettere, tabelle, risultati di procedimenti numerici. . . ). Alcune di queste informazioni possono diventare dati da elaborare di nuovo al computer.

Un sistema operativo, come Windows, Mac, Linux, è un tipo di software; programmi applicativi come Word, Excel, LaTex sono dei software.

12

2.2

annamaria mazzia

La preistoria del computer: Babbage e Lovelace

La seconda metà del diciannovesimo secolo fu un tempo di grande fermento in numerosi campi, dall’ingegneria ai trasporti, dalla comunicazione all’architettura... Furono scoperti nuovi materiali, la forza animale fu sostituita dalla forza motrice, le navi a vapore iniziarono a competere con quelle a vela, la rete ferroviaria si 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 il calcolo – si basava su tavole di calcolo per eseguire i calcoli meno banali. Tuttavia, si sa, gli uomini possono sbagliare e il timore che su quelle tavole ci fossero degli errori era giustificato: un errore non trovato poteva diventare un disastro nelle numerose applicazioni in cui le tavole di calcolo venivano usate! Già nel 1812 Charles Babbage era consapevole dell’inaccuratezza dei calcoli fatti dall’uomo. Nel suo lavoro, Babbage doveva verificare l’esattezza di tavole di calcolo che sarebbero state usate da banchieri come da marinai. Le navi avrebbero identificato la loro posizione in mare mediante quelle tavole! Eliminare il rischio dell’errore umano divenne per lui un desiderio sempre più grande. Il suo desiderio di creare una macchina per eseguire calcoli si concretizzò in due progetti, quello della Macchina alle Differenze e quello della Macchina Analitica. La Macchina alle Differenze doveva calcolare in modo automatico funzioni polinomiali ma non venne mai completata per il suo costo eccessivamente elevato. La Macchina Analitica, invece, doveva essere una macchina di calcolo programmabile, e si può considerare come la prima idea del moderno computer. Anche questo progetto, tuttavia, rimase incompiuto. Nel 1833, Babbage incontrò Ada Lovelace , figlia del famoso poeta Lord Byron. Lovelace, appena diciassettenne, aveva parecchie conoscenze matematiche, inusuali per l’epoca, e si entusiasmò talmente tanto per il progetto di Babbage, da intuire altre potenzialità della macchina stessa, come la capacità dei numeri di poter rappresentare altre entità quali le lettere dell’alfabeto o le note musicali, e che dalla manipolazione dei numeri la macchina avrebbe esteso la propria potenza oltre il mondo della matematica. Sempre la Lovelace intuì che la soluzione dei problemi matematici si sarebbe effettuata attraverso delle procedure di calcolo (quelli che noi chiamiamo programmi). Alla luce degli sviluppi che si sono avuti nel ventesimo secolo, la visione di Babbage e della Lovelace appare profetica.

2.3

Gli albori

Il 1800 si chiude con una grande invenzione: nel 1896, Guglielmo Marconi inventa la radio. Il 1900 si apre con altre importanti invenzioni: il triodo, il registratore magnetico, la televisione, fino ad

Charles Babbage (1791-1871), inventore e matematico inglese, è senza dubbio il primo ad avere avuto il concetto del moderno calcolatore.

Babbage stesso scrisse che, mentre era seduto nella stanza della Società Analitica, a Cambridge, lavorando, mezzo addormentato, su una tavola dei logaritmi, arrivò un altro membro della società che gli chiese cosa stesse sognando. E lui rispose : – Sto pensando che tutte queste tavole – riferendosi alle tavole dei logaritmi – potrebbero essere calcolate da una macchina! Nel 1821, Babbage e il suo amico e astronomo John Herschel stanno controllando delle tabelle calcolate a mano. Errore dopo errore, Babbage esclama : – Volesse Dio che questi calcoli venissero eseguiti da una macchina a vapore! Osserviamo che l’invenzione del telaio meccanico a schede, in cui il tipo di tessuto veniva scelto (o programmato) in base a delle schede inserite nella macchina, è un precursore del progetto di Babbage. Solo nel 2002 è stato possibile costruire una macchina che rispondesse al progetto di Babbage. Augusta Ada Lovelace (1815-1852) fu la figlia del famoso poeta Lord Byron. I genitori si separono subito dopo la sua nascita e la bambina crebbe insieme alla madre (Lord Byron partì dall’Inghilterra senza farvi più ritorno e morì in Grecia quando Ada aveva otto anni). Poichè la madre era appassionata di matematica e non voleva che la figlia seguisse la strada del padre, incoraggiò la figlia in questa direzione, impartendole un’istruzione legata alla matematica e alla musica. Nel 1835 sposò William King, di dieci anni più anziano. Nel 1838 il marito ricevette il titolo nobiliare di Conte di Lovelace. Ebbero tre figli. La Lovelace morì di cancro a soli 37 anni.

appunti di calcolo numerico

arrivare intorno alla metà del 1900 con il transistor (nel 1947) e il circuito integrato (nel 1958). La nuova tecnologia elettromeccanica ed elettronica si rivelò decisiva per lo sviluppo dei computer, grazie allo studio sistematico della teoria dei circuiti elettrici. Il più noto tra gli studiosi di questa teoria fu l’americano Claude Shannon. Il suo contributo fondamentale fu quello di elaborare un metodo sistematico per progettare reti logiche capaci di eseguire le operazioni logico-aritmetiche desiderate: detto più semplicemente, egli mostrò come trasformare una assegnata operazione matematica in un circuito elettrico costruito con interruttori e relè di commutazione (quelli usati nelle telecomunicazioni). Il lavoro di Shannon diede l’avvio allo studio delle tecniche indispensabili per progettare in modo sistematico tutti i circuiti logici di base necessari per realizzare i circuiti di calcolo dei futuri computer. Da un punto di vista propriamente ”pratico“ invece, la nascita e lo sviluppo dei calcolatori elettronici inizia nel 1938: il tedesco Konrad Zuse costruisce Z1, una macchina costruita e pensata in maniera completamente meccanica, tutta da migliorare, ma che può essere considerata come il primo calcolatore. Zuse passa subito al progetto Z2, dove l’aritmetica meccanica è sostituita da relè elettromeccanici. L’inizio della seconda guerra mondiale interrompe bruscamente il lavoro di Zuse, che viene chiamato alle armi, ma riesce a persuadere l’Istituto di Ricerca Aerodinamica del Terzo Reich a continuare i suoi studi. Completa quindi la costruzione dello Z2 e inizia a lavorare sullo Z3, che è il primo computer che Zuse costruisce per essere usato e non per verificare le proprie idee. Lo Z3 ha non solo l’unità aritmetica ma anche la memoria realizzata con relè elettromeccanici, ben 2600. Z3 fu la prima macchina di calcolo programmabile e venne usata dall’industria aerea per risolvere sistemi di equazioni e altri sistemi matematici ricavati da problemi di vibrazione degli apparecchi aerei messi sotto stress. Quando Zuse propose di passare all’uso di un computer basato su valvole elettroniche, la proposta fu respinta perchè i tedeschi si consideravano così vicini alla vittoria della guerra che ulteriori sforzi nella ricerca non apparivano necessari. Il lavoro di Zuse, comunque, andò avanti con la costruzione dello Z4, di S1 e S2. E, soprattutto, fu completamente indipendente dai lavori di John Eckert e John Mauchly negli Stati Uniti e di A. Turing in Inghilterra. Eckert e Mauchly costruirono l’ENIAC (Electronic Integrator and Computer). L’ENIAC fu costruito, con progetto di Eckert, in piena seconda guerra mondiale, a partire dal 1943, presso il Ballistic Research Laboratory e fu completato nel febbraio del 1946. La macchina era pensata per compiere operazioni di carattere generale, ma fu costruita con lo scopo preciso di compilare tabelle per le traiettorie di bombe. L’ENIAC conteneva circa 18. 000 valvole termoioniche e misurava circa 2 metri e mezzo di altezza per 24 metri di lunghezza! La macchina era più di mille volte veloce di tutti i predecessori elettromeccanici costruiti fino a quel momento e poteva eseguire 5000 addizioni al secondo. Le sue operazioni erano controlla-

13

Claude Shannon (1916-2002) fu fisico e matematico del MIT.

Nel 1948, l’articolo di Shannon, A Mathematical Theory of Communication, pubblicato sulla rivista The Bell System Technical Journal getta le basi teoriche dell’informatica. Per prima volta viene usato il termine bit come abbreviazione di binary digit, termine suggeritogli dal chimico e statistico J. W. Tukey. Konrad Zuse, ingegnere civile (1910-1995).

Figura 2.2:

L’ENIAC. Foto presa da

http://www.computerhistory.org/ revolution/birth-of-the-computer/ 4/78/316, copyright dell’Università di

Pennsylvania. Alan Turing (1912-1954), matematico inglese, si interessò di logica matematica e di teoria della probabilità. Introdusse il concetto di una macchina astratta, detta macchina di Turing, e pose questioni riguardanti l’intelligenza artificiale. Si occupò di problematiche riguardanti un macchina di calcolo digitale astratta, con una memoria senza limiti. John Presper Eckert (1919-1995) e John William Mauchly (1907-1980) lavorarono a quello che si può considerare il vero primo calcolatore elettronico.

14

annamaria mazzia

te da un programma che veniva inserito dall’esterno mediante nastri perforati. Intanto, nel 1944 aveva iniziato a collaborare nella costruzione dell’ENIAC, John von Neumann. Egli si accorse che l’architettura della macchina andava rivista e che la programmazione del computer mediante un numero enorme di cavi e interruttori rendeva lenta e poco flessibile la programmazione stessa. Sostenne, quindi, che il programma non dovesse essere rigidamente predisposto nell’hardware tramite interruttori e cavi e neanche letto mediante nastri perforati, ma risiedesse in una memoria su cui poter scrivere e accedere velocemente insieme ai dati da elaborare. Von Neumann per primo descrisse l’architettura dei calcolatori in termini logico-funzionale, secondo uno schema astratto non legato ai dispositivi fisici utilizzati per le varie operazioni. E il suo schema, sostanzialmente invariato, è l’architettura adottata dai calcolatori dei nostri giorni! Prima di von Neumann, il calcolatore veniva controllato mediante programmi non modificabili, registrati su nastro perforato o cablati in una configurazione di cavetti e interruttori. Con von Neumann si presenta un’architettura di riferimento precisa. Il primo calcolatore costruito seguendo l’architettura di von Neumann entrò in funzione nel 1948 all’Università di Manchester e venne chiamato Manchester Mark I. Inizia, in tal modo, una nuova fase per i calcolatori: i programmi che controllano le operazioni da svolgere risiedono nella memoria del calcolatore insieme ai dati e possono essere modificati dinamicamente nel corso dell’elaborazione. Dal 1948 fino ai nostri giorni, lo sviluppo dei calcolatori elettronici ha avuto ritmi esponenziali: l’invenzione del circuito integrato (chip) alla fine degli anni cinquanta permise non solo di ridurre via via lo spazio fisico occupato dai computer ma anche di ottenere computer sempre più potenti tanto che, in due suoi lavori, del 1965 e del 1975, Gordon Moore stabilì che il numero dei transistor inseribili su un chip raddoppia approssimativamente ogni 24 mesi (legge di Moore). Nel 1971 tre ingegneri della Intel tra cui l’italiano Federico Faggin inventarono il microprocessore, vale a dire un’intera CPU in un singolo circuito integrato: su una piastrina di 4 × 3 millimetri riuscirono a inserire 2250 transistor, che formavano il cuore di un intero computer: questo microprocessore fu chiamato Intel 4004 ed era capace di 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 Itanium 2 (con 9MB di cache) introdotto nel 2004 ha 592. 000. 000 transistors, ci accorgiamo di come la legge di Moore, dal 1968 ad oggi, sia stata rispettata.

2.4

Architettura del Computer

L’architettura del Computer si può riassumere in tre unità:

John von Neumann (1903-1957) ungherese, studiò prima a Berlino, poi a Zurigo e infine a Budapest, dove ricevette il dottorato in matematica. Nel 1930 si trasferì alla Università di Princeton dove insegnò matematica. Il suo nome è legato a studi in diversi settori: teoria dei giochi, matematica applicata, logica... Occupa un ruolo fondamentale nello sviluppo dei calcolatori elettronici. Ricevette numerosi premi e riconoscimenti in tutto il mondo.

Gordon Moore è nato nel 1929 in California. Di lui basti ricordare che ha stabilito la legge di Moore, è co-fondatore della Intel Corporation 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 metalossido), del microprocessore e dell’industria dei semiconduttori. Federico Faggin è nato nel 1940 a Vicenza e si è laureato in fisica all’Università di Padova. Nel 1968 si è trasferito prima a Palo Alto presso la Fairchild Semiconductor e poi nel 1970 nella Intel. Oggi è presidente e CEO (Chief Executive Officer) della Foveon.

appunti di calcolo numerico

15

x

il processore, che fornisce la capacità di elaborazione delle informazioni;

x x

la memoria (centrale e di massa)

i dispositivi di input/output, che comunicano attraverso un canale detto BUS, costituito da un insieme di linee elettriche digitali. Il processore è composto da blocchi con funzionalità diverse:

x CPU (Central Processing Unit), unità centrale di elaborazione x cache x varie interfacce Se il processore è integrato su un unico chip prende il nome di microprocessore. Sia la CPU sia gran parte dei dispositivi che servono per l’attività della CPU sono realizzati con la tecnologia dei circuiti integrati, che possono essere disposti in una singola scheda detta scheda madre. Questa scheda può essere dunque considerata la parte più importante del computer. La CPU esegue tutte le operazioni di elaborazione numerica e di controllo e rappresenta la parte centrale del computer. Ogni elaboratore contiene un circuito di temporizzazione (clock) che genera un riferimento temporale comune per tutti gli elementi del sistema. Un ciclo-macchina è il tempo richiesto per svolgere un’operazione elementare (ed è un multiplo del periodo del clock). La velocità di elaborazione di un processore dipende dalla frequenza del clock. I processori attuali hanno valori di frequenza del clock che variano tra gli 8 MHz e i 3500 MHz (1 MHz = 1 milione di istruzioni al secondo). La memoria serve per conservare le istruzioni da eseguire e per scrivere/leggere i dati elaborati. Si suddivide in memoria principale e memoria secondaria. La memoria principale (o di lavoro) è la memoria in grado di conservare dinamicamente dati e programmi che il processore sta utilizzando. A sua volta la memoria principale può essere di due tipi:

x

memoria di sola lettura (read-only memory): ROM. Viene scritta una volta per tutte dal produttore del sistema e contiene programmi e informazioni specifiche per il sistema; è utilizzata per memorizzare parametri di configurazione del sistema, utili all’avvio del computer;

x

memoria per scrittura-lettura (random access memory): RAM. Serve alla CPU per lavorare con i programmi inseriti dall’utente.

Poichè la RAM conserva i dati solo fino a quando il computer rimane acceso (infatti è detta memoria di tipo volatile, perchè se ne perde il contenuto quando la macchina viene spenta), per conservare dati e programmi per tempi lunghi e a sistema spento, si utilizza la

La CPU si suddivide in

x unità logico-aritmetica (ALU), che svolge tutti i calcoli logici ed aritmetici; x unità floating-point (FPU) (Floating x x

Point Unit), che consente di eseguire le operazioni su numeri reali;

unità di controllo (CU), che sovrintende all’elaborazione dei dati e alle operazioni di input e output; registri, cioè memoria locale per memorizzare dati e lo stato di avanzamento delle istruzioni. Abbiamo, ad esempio, il registro di Program Counter, di Program Status Word, il registro Istruzioni, Indirizzi Memoria. . .

16

annamaria mazzia

memoria di massa (o secondaria) – dischi come l’Hard Disk, CDROM, DVD, pendrive USB. . . . La RAM può essere pensata come una sequenza di celle (locazioni), ognuna identificata da un indirizzo e capace di contenere informazioni binarie. L’unità minima indirizzabile della memoria è detta parola (word) e può variare da macchina a macchina. In genere una parola vale un byte, cioè 8 bit. Il computer scambia informazioni con il “mondo esterno” per mezzo delle periferiche di input/output (monitor, mouse, stampante, web-cam,...). Input è l’inserimento di dati nel computer per l’elaborazione. Output è il trasferimento di dati dal computer a dispositivi che permettono all’utente di vedere/ascoltare i risultati dell’elaborazione.

2.5

Software e Sistema Operativo

Un software è una sequenza di istruzioni per eseguire le varie elaborazioni sui dati. Ci sono diverse categorie di software: software per il sistema operativo, software di base, software di 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 dispositivi fisici. Questi programmi prendono il nome di 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 di rendere fruibile all’utente le molteplici risorse del computer (gestione della memoria, della stampante, della tastiera,...); dall’altra rende il computer uno strumento amichevole e utile per affrontare le molteplici attività che gli si richiedono. I compiti affidati al sistema operativo sono molteplici:

Bit è l’unità elementare di informazione. Per esempio: 0/1, sì/no. 1 byte = 8 bit 1 Kilobyte (KB) = 210 byte = 1024 byte (circa 103 ) 1 Megabyte (MB) = 220 byte (circa 106 ) 1 Gigabyte (GB) ≈ 109 byte (un miliardo di byte) 1 Terabyte (TB) ≈ 1012 byte (mille miliardi di byte) 1 Petabyte (PB) ≈ 1015 byte (un milione di miliardi di byte)

Figura 2.3: Dispositivi di input e output.

x agire da intermediario tra l’utente e l’harware del computer x controllare e coordinare l’utilizzo dell’hardware tra i programmi applicativi

x

fornire gli strumenti per l’uso corretto delle risorse di tipo hardware e software del sistema

x

nascondere i dettagli legati alla gestione delle risorse del sistema.

I primi sistemi operativi iniziarono a vedersi intorno alla metà degli anni cinquanta quando si cominciò a individuare una serie di programmi standard di comune utilizzo indipendenti dall’applicazione specifica richiesta al computer. L’evoluzione dei sistemi operativi ha influenzato anche lo sviluppo dell’hardware in quanto per supportare certe funzioni del sistema operativo sono necessari meccanismi hardware ad hoc (basti pensare alla gestione della memoria o delle interruzioni).

I primi computer come lo Z3 di Zuse o l’ENIAC non avevano sistema operativo. Per inserire un programma (scritto in linguaggio macchina) bisognava azionare un gruppo di interruttori o modificare collegamenti tramite opportuni cavi e spinotti. Ci rendiamo conto, quindi, di quanto fosse difficile usare il computer per risolvere problemi mediante l’esecuzione di un programma perchè oltre alla competenza specifica del problema da risolvere, si richiedeva una grande conoscenza tecnica della macchina su cui si doveva lavorare. Il programma doveva contenere non solo le istruzioni per la risoluzione del problema (per esempio un sistema di equazioni) ma anche le istruzioni per gestire le unità di input e output e delle altre periferiche collegate al computer. Infine, poteva essere eseguito un solo programma alla volta.

appunti di calcolo numerico

17

Considerando gli elevatissimi costi per la realizzazione e la gestione dei primi computer, il calcolo automatico era una risorsa preziosa a disposizione di pochi utenti. Tutto ciò portò ad un ripensamento del modo di utilizzare i computer e nacquero le prime idee di sistema operativo. Per prima cosa si pensò di creare delle librerie con le istruzioni necessarie per eseguire le operazioni più comuni legate alla gestione delle periferiche del computer (ingresso e uscita dei dati, accesso alla memoria,...). Ulteriori progressi si ebbero quando il sistema operativo iniziò a sfruttare anche il disco fisso ed ebbe inizio la cosiddetta multiprogrammazione, in base alla quale nella memoria centrale venivano tenuti attivi contemporaneamente alcuni processi e i loro dati pronti per essere eseguiti. Ad ogni momento, uno solo di questi processi veniva eseguito, tuttavia, quando il processo in esecuzione richiedeva un’istruzione di ingresso o di uscita, esso veniva sospeso attivando le unità periferiche necessarie per l’esecuzione dell’istruzione data. Questa tecnica richiedeva una elevata capacità della memoria centrale e solo pochi sistemi potevano funzionare in modo adeguato. Uno dei primi sistemi che iniziò ad utilizzare la multiprogrammazione fu il sistema OS/360 realizzato per i computer IBM 360. Questo sistema operativo fu importante per due motivi:

x

si cercò di realizzare un sistema operativo uniforme e compatibile per macchine IBM molto diverse tra loro per quanto riguarda l’hardware sottostante: fino a quel momento ogni macchina aveva il proprio sistema operativo, che cambiava da macchina a macchina!

x

lo sviluppo di questo sistema operativo fu molto delicato e complesso e aprì lo studio delle problematiche relative all’ingegneria del software.

Nonostante questi progressi, la multiprogrammazione non permetteva molta interattività tra utente e computer: di fatto l’utente consegnava i dati e il programma da eseguire (un pacco di schede perforate) all’operatore del computer e accedeva ai risultati dopo qualche ora se non addirittura dopo giorni e giorni, risultati che riceveva in forma cartacea ad esecuzione avvenuta (non c’era ancora il monitor per la visualizzazione su video dei risultati). Alla fine del 1950 si introdusse il concetto di time-sharing che permetteva l’esecuzione di più processi in modo da poter soddisfare le esigenze di più utenti contemporaneamente. Con il time-sharing si assegna, infatti, un piccolo intervallo di tempo a ciascun processo dando l’impressione che ciascun processo vada avanti parallelamente agli altri. Gli sviluppi del sistema operativo ottenuti da allora fino ad oggi si possono così riassumere: il sistema operativo fornisce funzioni di base per la gestione delle risorse, quali:

x

uso del processore (multitasking: l’uso della CPU è permesso ad un programma alla volta per brevi intervalli di tempo, quindi l’utente può eseguire più programmi contemporaneamente)

Figura 2.4: Schede perforate a 80 e a 96 colonne. Foto presa da http://compvter.blogspot.it/2010/ 09/punch-card-ibm-96-colonne.html

Per risolvere i problemi legati all’uso delle schede, queste furono sostituite da appositi terminali collegati al computer e furono cambiate le modalità di gestione dell’unità centrale modificando i sistemi operativi esistenti. Si arrivò all’interazione con il computer non più mediante schede perforate bensì tramite tastiera-stampante o tramite tastiera-monitor.

18

annamaria mazzia

x x riconoscimento e gestione degli utenti (multiutenza) x gestione delle periferiche (drivers) x file system x interfaccia grafico. uso della memoria centrale (memoria virtuale)

Il software di base (o general purpose) può avere funzioni varie: editor di testo, elaborazione di testi, fogli elettronici, posta elettronica, internet. Il software applicativo è costituito da programmi che hanno obiettivi specifici come intrattenimento, controllo di sistemi, progettazione (CAD), risoluzione di problemi matematici. Per migliorare le prestazioni di un computer si inserisce una memoria intermedia tra CPU e RAM, detta cache. Si trova all’interno del processore. È più veloce della RAM ma anche più costosa.

Il file system

2.6

Il sistema operativo gestisce le informazioni su dispositivi di memoria secondaria (dischi). La gestione delle informazioni avviene mediante file Un file costituisce un insieme di informazioni della stessa natura e logicamente correlate. In genere un file contiene un programma (programma sorgente o programma eseguibile), oppure una sequenza di dati. L’informazione è rappresentata da files, organizzati in maniera gerarchica (pensiamo ad una struttura ad albero) in directories (cartelle). Una directory è un file che svolge il ruolo di ”raccoglitore“. I files possono contenere dati (abbiamo i cosiddetti files di testo) oppure programmi (i files di applicazioni). Un file è caratterizzato da:

x

posizione (path, o percorso): sequenza delle directories che portano al file dir1 / dir2 / . . . / . . . /

x

nome: individua univocamente il file all’interno della cartella (o directory)

x

Immaginiamo un ristorante con un capocuoco, il suo aiutante, una cucina, i camerieri e i clienti. I clienti scelgono un piatto dal menu, un cameriere prende l’ordine e lo porta al capo-cuoco. Il capo-cuoco riceve l’ordine e assegna al suo aiutante il compito di preparare il piatto. L’aiutante si dedicherà alla preparazione del piatto, compito che potrà richiedere più attività. Il capo-cuoco, intanto, supervisiona la preparazione dei piatti e gestisce le risorse (limitate) dei posti nel ristorante.

x il capo-cuoco rappresenta il sistema operativo, x i clienti sono gli utenti, x le ricette associate ai piatti corrispondono ai programmi, x gli ingredienti sono l’input del programma, x il piatto è l’output del programma, x il menu e il cameriere sono l’interfaccia verso il sistema operativo, x l’aiutante corrisponde al processore x x

(CPU) (Se abbiamo più processori, ci sono più aiutanti), la cucina corrisponde al computer,

pentole, fornelli etc, sono le parti che compongono il computer.

L’aiuto cuoco, quindi, rappresenta la CPU mentre il tavolo da lavoro, su cui appoggia gli ingredienti e la ricetta per preparare il piatto, rappresenta la memoria centrale. Prima di iniziare a lavorare, il cuoco deve svolgere alcune mansioni (sempre le stesse ogni volta: pulire il tavolo, controllare lo stato di pentole, tegami, coltelli. . . , ricevere le ordinazioni). Supponiamo che queste mansioni siano incise su un pezzo del tavolo da lavoro: corrispondono alla memoria ROM (quella che non può essere alterata). La RAM invece è la parte del tavolo che può essere alterata a piacimento (spostare pentole, tegami, ingredienti). Quando il ristorante chiude, il tavolo deve essere pulito e sgombro altrimenti si rovina tutto quello che vi rimane, ad eccezione di ciò che vi è stato inciso. Perciò il cuoco conserva in dispense e frigoriferi i vari ingredienti rimasti e gli utensili da lavoro: le dispense e i frigoriferi rappresentano i dischi (Hard Disk, CDROM, pen drive USB . . . ) per immagazzinare i dati.

estensione: la parte del nome del file che segue l’ultimo punto . (dati.txt prova.f matrice.dat welcome.html foto.jpeg )

x x

dimensione: quantità di informazione contenuta nel file

altre informazioni (data di creazione, data di ultima modifica, permessi di scrittura, lettura. . . )

. L’intera gestione dei file è a carico di un componente del sistema operativo detto file system.

File in inglese significa archivio. Il termine compare nei primi anni cinquanta e inizialmente si riferisce a un pacco di schede contenente informazioni omogenee. È il sistema operativo a realizzare il concetto astratto di file nella gestione dei dispositivi di memoria di massa.

appunti di calcolo numerico

2.7

19

Un po’ di storia sui sistemi operativi

Tra i numerosi sistemi operativi, il sistema Unix è quello che ha maggiormente influenzato questo settore dell’informatica. Il sistema Unix venne sviluppato sul finire degli anni sessanta nei laboratori della AT & T. La filosofia di base era di realizzare un sistema semplice rispetto agli altri in uso e adatto per la ricerca e lo sviluppo. La prima versione fu scritta in linguaggio Assembly e dipendeva dal tipo di macchina su cui si doveva applicare. Successivamente venne scritto in larga parte in un linguaggio di alto livello, il C, progettato appositamente per il sistema Unix. In tal modo il sistema operativo diventava facilmente portabile su macchine di tipo diverso senza dipendere eccessivamente dalle caratteristiche dell’hardware su cui veniva fatto funzionare. Diversamente dalle abitudini del tempo, l’azienda AT & T distribuì Unix nelle università e rese disponibili i codici sorgenti utilizzati per realizzarlo. Questo portò ad una sua ulteriore innovazione grazie a tutti i ricercatori delle università che iniziarono a sperimentarlo. Quando furono messi in commercio i primi microcomputer (a partire dal 1975), fu necessario sviluppare sistemi operativi appositamente progettati per sfruttare le poche risorse disponibili essendo le risorse di calcolo di tali macchine molto limitate. Inoltre, queste macchine erano pensate più per gli appassionati che per il personale tecnico esperto e quindi era importante creare un sistema operativo che fosse d’uso relativamente semplice. In questo campo si distinsero Bill Gates e Paul Allen, che iniziarono la loro attività scrivendo il linguaggio di programmazione Basic per il micromputer Altair. Nel 1975 crearono una ditta... la Microsoft. Un altro microcomputer, popolare nei primi anni ottanta, fu l’Apple sviluppato da Steve Wozniak e Steve Jobs. Per questa macchina svilupparono un sistema più semplice ed efficiente di quello usato per l’Altair, che si ispirava vagamente al sistema Unix. I microcomputer iniziarono ad avere un grosso successo tanto che all’inizio degli anni ottanta, l’IBM pensò di entrare in questo settore (prima si era solo occupata di grandi computer e di software), introducendo il personal computer, IBM PC, realizzando in tal modo una macchina che servisse non solo per gli appassionati e per giocare (uno dei fattori che aveva determinato il successo dei microcomputer) ma anche come strumento di studio, per i professionisti e per la gestione di piccole aziende. L’IBM incaricò Bill Gates di realizzare un sistema operativo per il nuovo personal computer. Il successo dell’IBM PC portò al successo anche di Bill Gates: i profitti della Microsoft iniziarono a crescere in modo esponenziale. Il sistema realizzato dalla Microsoft prese il nome di MS-Dos e divenne il sistema operativo più diffuso al mondo grazie alla standardizzazione dei personal computer lanciato dall’IBM. Il sistema MS-Dos non era facile da usare perchè l’utente interagiva con il computer solo attraverso comandi testuali la cui sintassi non

I sistemi operativi per i microcomputer dovevano essere più semplici di quelli impiegati per i grandi computer, in quanto la macchina veniva utilizzata da un solo utente e le periferiche collegate erano poche e semplici. Il problema maggiore ero quello di gestire i file su floppy disk (gli antenati dei CD-ROM e dei DVD, in uso fino ad una decina di anni fa) o su nastri magnetici e mettere a disposizione dell’utente un linguaggio di programmazione semplice, come il Basic. Tuttavia, il confine tra linguaggio di programmazione e sistema operativo non era ancora ben definito e, una volta avviato, il sistema era pronto per ricevere sia comandi del sistema operativo, sia istruzioni in linguaggio Basic.

20

annamaria mazzia

era così semplice da ricordare (qualche anno più tardi fu lanciata sul mercato una versione più amichevole). Nel 1984, invece, dalla Apple fu prodotto il personal computer Macintosh che adottava un tipo di interfaccia grafico progettato per interagire in modo semplice e intuitivo con l’utente. Le novità della Apple furono molto apprezzate e la Microsoft, per colmare questa lacuna, lanciò un altro sistema operativo basato su interfaccia grafica: nel 1985 nacque il primo Windows 1.0 che trovò pochi consensi perchè troppo lento e instabile. Nel 1986, con la comparsa di nuovi microprocessori, il sistema Windows cominciò a funzionare in modo adeguato tanto che le versioni di Windows 3.1 e di Windows 95 portarono 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 vedere la strada percorsa da un informatico di Helsinki (data di nascita 1969), Linus Benedict Torvalds, che ha introdotto il sistema Linux. Nel 1991 fu completata la prima versione del sistema, che fu chiamata Linux e venne messa a disposizione di tutti. Torvalds si riservò il compito di coordinare i diversi miglioramenti via via introdotti dagli altri sviluppatori. Linux si è dimostrato e si dimostra tuttora un valido sistema operativo, affidabile, sicuro e di buone prestazioni, in grado di gestire situazioni multiutente e multitasking. Ed è il sistema operativo di riferimento del corso di Calcolo Numerico.

2.8

Lavorare in ambiente Linux

Una volta entrati nel sistema (tramite login e password), si apre l’ambiente grafico e di qui possiamo lavorare (per esempio, aprire una finestra di editor, lavorare in Office, navigare in Internet ....). Per aprire nuove directories (cartelle), per spostare files, per eseguire programmi, ... è bene lavorare tramite una finestra di terminale o shell. La finestra di terminale (shell) mostra il prompt dei comandi. Un esempio di prompt è la login dell’utente (ad esempio studente) + chiocciola + nome della macchina su cui si sta lavorando (ad esempio george) + attuale directory di lavoro (se non compare nessun nome, è perchè ci troviamo nella home directory, la directory principale dell’utente) + un simbolo (% o $, a seconda della macchina): studente@george:~ $

Vediamo ora alcuni comandi essenziali (comandi da scrivere dopo il prompt, in una finestra di terminale – dopodichè si clicca il tasto di Invio):

x

ls mostra l’elenco dei files e delle directories contenuti nella

directory attuale ( ls sta per "list").

Il Macintosh utilizzava un interfaccia grafico chiamato GUI (Graphic User Interface) composto da icone, finestre, menù... Gli oggetti dell’ambiente operativo erano rappresentati con simboli grafici di facile intuizione senza dover comprendere a fondo tutti i tecnicismi informatici. L’interfaccia GUI non era un’invezione della Apple perchè era stata già sperimentata nel corso degli anni settanta dalla Xerox, che però non aveva intuito le potenzialità di questo lavoro, lasciandone invece la fortuna e il successo alla Apple che, insieme ad esso, introdusse il mouse.

Durante gli studi universitari, Torvalds si era interessato di sistemi operativi e aveva studiato una versione semplificata di Unix, chiamata Minix. Questo sistema poteva funzionare su personal computer e veniva distributo con i programmi sorgenti disponibili. Torvalds migliorò il sistema Minix, in modo da poterlo utilizzare come alternativa a Windows, nella logica di non realizzare profitti (cioè non diventare milionario) ma di realizzare un sistema utilizzabile gratuitamente da tutti e migliorabile con il contributo di tutti (la filosofia dell’open source). Tra le tante distribuzioni attualmente in uso ricordiamo: Debian, Ubuntu, Fedora, Gentoo, Slackware. . .

appunti di calcolo numerico

x Per cambiare directory, si deve digitare cd nome-directory

(cd sta per "change directory").

x Il comando cd .. fa tornare nella directory precedente. x Per creare una nuova directory: mkdir nomedirectory (mkdir sta per "make directory").

21

Esempio: studente@george:~$ls Un volta cliccato Invio, compare l’elenco delle directories presenti nello spazio di lavoro disponibile per l’utente studente sulla macchina george, ad esempio (i numeri a sinistra delle directories o files sono indicatori dello spazio che occupano in memoria): 5 2 3 3

appunti/ calcolo/ fortran/ foto/

4 mail/ 4 movies/ 1 varie/ 57 prova.pdf

x Per copiare un file dentro una directory:

Esempio: per entrare nella directory foto, scriviamo

x Per trasferire un file in una directory

Una volta cliccato il tasto di Invio, si è entrati nella directory foto:

cp nomefile nomedirectory (cp sta per "copy").

studente@george:

~$cd foto

studente@george:~/foto $

mv nomefile nomedirectory (mv sta per "move").

x Per rinominare un file (o una directory): mv nomevecchio nomenuovo .

x Per cancellare un file si usa il comando rm nomefile. x Per cancellare una directory, dobbiamo prima cancellare tutti i files della directory e poi usare il comando rmdir nomedirectory.

Esempio: siamo nella directory foto, che è una sottodirectory della home di studente. Con il comando pwd si ha: studente@george:~/ foto $pwd studente@george:~/ foto $/home/studente/foto

x Per sapere in quale directory ci troviamo, si usa il comando pwd. Esempio Abbiamo due directory chiamate uno e due e il file prova.f nella directory uno. Vogliamo copiare il file dalla directory uno alla directory due. Se ci troviamo nella home, cioè nell’ambiente di partenza, dobbiamo scrivere cp uno/prova.f due studente@george:~ $ cp uno/prova.f due

Se ora passiamo nella directory due e facciamo ls, vedremo il file prova.f studente@george:~ $ cd due studente@george:~/due $ ls total 1 1 prova.f

Se siamo nella directory uno, dobbiamo scrivere cp prova.f ../due per ottenere lo stesso risultato. Se siamo nella directory due, dobbiamo scrivere cp ../uno/prova.f . (il punto finale serve per copiare il file prova.f nella directory in cui ci troviamo). Con cp abbiamo due file identici, quello nella directory uno e quello copiato nella directory due. Possiamo anche scrivere cp prova.f prova2.f: in questo modo creiamo il file prova2.f nella stessa directory in cui si trova prova.f. Se vogliamo trasferire il file dalla directory uno alla directory due (in questo modo avremo solo un file alla fine del procedimento), dobbiamo usare il comando mv. _

Riassumendo

x x x x x x x

ls : lista dei files e delle directory cd : per cambiare directory mkdir: per creare una nuova directory cp: per copiare files mv: per trasferire o rinominare files rm: per cancellare files rmdir: per cancellare directories

22

2.9

annamaria mazzia

Editor di testo

Se vogliamo scrivere su un file un documento di testo, abbiamo bisogno di un editor di testo. Sotto Linux ne troviamo diversi: vi, emacs, kedit, gedit, nedit.... I più semplici da utilizzare sono kedit e gedit. Sotto Linux esiste anche il pacchetto Office (del tutto simile all’equivalente Microsoft) per scrivere documenti in word, creare tabelle, etc. . . . Anche il programma Gnumeric è molto utile per creare tabelle. Per visualizzare grafici, invece, c’è il pacchetto Gnuplot.

3 Richiami di analisi 3.1

La teoria attrae la pratica come il magnete attrae il ferro. Carl Friedrich Gauss

L’alfabeto greco

Quando si descrivono teoremi, si danno definizioni o, semplicemente, si discute di matematica, è abbastanza usuale prendere in prestito lettere dell’alfabeto greco. È importante, quindi, saperle riconoscere e chiamarle in maniera corretta (si veda tabella a lato).

A B

Γ ∆ E Z H

Θ

3.2

Radici di un polinomio di secondo grado

I K

Λ M

α β γ δ e ζ η θ ι κ λ µ

Alfa Beta Gamma Delta Epsilon Zeta Eta Theta Iota Kappa Lambda Mu

N

Ξ O

Π P

Σ T

Υ Φ X

Ψ Ω

ν ξ o π ρ σ τ υ φ χ ψ ω

Dato il polinomio ax2 + bx + c con a, b, c ∈ R (a 6= 0), le radici del polinomio (cioè quei valori di x per cui ax2 + bx + c = 0) si trovano applicando la formula x1 =

x x

−b +



b2 − 4ac , 2a

x2 =

−b −



b2 − 4ac 2a

Se b2 − 4ac > 0 le radici sono reali e distinte,

se b2 − 4ac = 0 le due radici coincidono (il polinomio si può b anche scrivere come ( x + )2 ) 2a

x se b

2

− 4ac < 0 non ci sono radici reali.

Inoltre, si ha x1 + x2 = −

3.3

b c e x1 x2 = a a

Identità trigonometriche

Nel seguito introduciamo alcune formule trigonometriche, con la notazione:

x sin (x) ≡ seno(x), cos (x) ≡ coseno(x), x

sin ( x ) 1 tan ( x ) ≡ tangente( x ) = , sec ( x ) ≡ secante( x ) = , cos ( x ) cos ( x )

Figura 3.1: I tre casi delle radici di un polinomio di grado 2: radici reali e distinte (in alto), radici reali e coincidenti (al centro), nessuna radice reale (in basso).

Nu Xi Omicron Pi Rho Sigma Tau Upsilon Fi Chi Psi Omega

24

annamaria mazzia

sin (−θ ) = − sin (θ ) sin ( π2 − θ ) = cos (θ ) sin ( π2 + θ ) = cos (θ ) sin (π − θ ) = sin (θ ) sin (π + θ ) = − sin (θ ) sin (θ + φ) = sin (θ ) cos (φ) + cos (θ ) sin (φ) cos (2θ ) = cos2 (θ ) − sin2 (θ ) tan2 (θ ) + 1 = sec2 (θ )

cos (−θ ) = cos (θ ) cos ( π2 − θ ) = sin (θ ) cos ( π2 + θ ) = − sin (θ ) cos (π − θ ) = − cos (θ ) cos (π + θ ) = − cos (θ ) cos (θ + φ) = cos (θ ) cos (φ) − sin (θ ) sin (φ) sin (2θ ) = 2 sin (θ ) cos (θ ) sin2 (θ ) + cos2 (θ ) = 1

3.4

Regole su funzione esponenziale e logaritmica Assumiano a, b ∈ R, con a > 0 e b > 0. Si ha:

1x = 1 a x +y = a x ay aloga ( x) = x a x−y = a x /ay loga ( xy) = loga ( x ) + loga (y) loga ( x y ) = y loga ( x ) loga ( x ) logb ( x ) = loga (b)

3.5

a xy = ( a x )y a0 = 1 a x b x = ( ab) x loga ( x/y) = loga ( x ) − loga (y) loga ( a x ) = x b x = a x loga (b)

Derivate e integrali

Siano f e g due funzioni dipendenti dalla variabile reale x mentre df c ∈ R sia una costante. Indichiamo la derivata di f con il simbolo dx o mediante f 0 . Valgono le seguenti regole:

x regola della costante: dd(cxf ) = c f

0

x regola della somma: d (df +x g) = dd xf + dd xg ) f g− fg = x regola del quoziente: d (df /g x g 0

0

2

x

regola del prodotto:

x

regola della potenza:

d ( f g) = f g0 + f 0 g dx d fr = r f r −1 f 0 dx

Tra le regole di integrazione, invece, ricordiamo quella di integrazione per parti: Z

f g0 dx = f g −

Z

f 0 g dx

appunti di calcolo numerico

Diamo ora una tabella delle derivate e degli integrali delle funzioni più note (per gli integrali lasciamo fuori la costante di integrazione). Usiamo la simbologia arcsin( x ) ≡ arcoseno( x ), arccos( x ) ≡ arcocoseno( x ), cot( x ) ≡ cotangente ( x ), arctan( x ) ≡ arcotangente( x ), arccot( x ) ≡, arcocotangente( x ). f ln( x ) sin ( x ) tan ( x ) 1 cos ( x ) arcsin ( x ) arctan ( x ) f xr ex sin ( x ) tan ( x ) 1 cos ( x ) 1 cos2

3.6

(x)

f0 1 x cos ( x ) 1 (= sec2 ( x )) 2 cos ( x ) 1 tan ( x ) cos ( x ) 1 √ 1 − x2 1 1 + x2 R fd x x r +1 (r 6 = 1) r+1 ex − cos ( x ) 1 ln | | cos ( x ) ln |

1 + tan ( x )| cos ( x )

1 cos ( x )

arcsin ( x )

x arcsin ( x ) +

arctan ( x ) 1 √ 1 − x2

x arctan ( x ) − arcsin ( x )

f0

ex

ex

cos ( x )

− sin ( x ) 1 − 2 sin ( x )

cot ( x ) 1 sin ( x )

− cot ( x )

arccos ( x ) arccot( x ) f

−√

x −1

ln | x |

ln | x | cos ( x )

x ln | x | − x sin ( x )

cot ( x )

ln | sin ( x )|

1 sin ( x )

ln |

2

sin ( x ) cot ( x ) sin ( x )



1 − x2

1 ln (1 + x2 ) 2

1

1 sin ( x )

1 − x2 1 − 1 + x2 R fd x

1

tan ( x )

tan ( x ) cos ( x )

f

arccos ( x ) arccot( x ) 1 1 + x2

1 + cot ( x )| sin ( x )

− cot ( x )



1 sin ( x )

√ x arccos ( x ) − 1 − x2 1 xarccot( x ) − ln (1 + x2 ) 2 arctan ( x )

Teoremi utili

Richiamiamo, nel seguito, teoremi che trovano applicazione nel Calcolo Numerico. Per alcuni diamo anche la dimostrazione. Utilizzeremo, inoltre, le seguenti notazioni per funzioni di 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 continue in X, che hanno le prime n derivate pure esse continue, sarà indicato con C n ( X ).

25

26

annamaria mazzia

Teorema 3.6.1 (Teorema di Rolle) Sia f ∈ C ([ a, b]) e differenziabile in ] a, b[. Se f ( a) = f (b) = 0, allora esiste un punto ξ ∈] a, b[ tale che f 0 (ξ ) = 0

Michel Rolle (1652- 1719) fu un matematico francese. È conosciuto per il teorema che porta il suo nome. Si deve a lui la notazione della radice n-sima per mezzo del simbolo √ n x.

Teorema 3.6.2 (Teorema del Valor Medio) Sia f ∈ C ([ a, b]) e diffef (b) − f ( a) renziabile in ] a, b[, allora esiste un punto ξ ∈] a, b[ tale che f 0 (ξ ) = b−a Teorema 3.6.3 (Teorema del Valore Intermedio) Sia f ∈ C ([ a, b]) e sia K un valore compreso tra f ( a) e f (b). Allora esiste almeno un punto ξ ∈] a, b[ tale che f (ξ ) = K. Quindi, per funzioni continue, un valore compreso tra i due estremi dell’insieme di definizione è un valore assunto dalla funzione stessa (in uno o più punti). Come conseguenza di questo teorema, se f ( a) f (b) < 0 (la funzione assume segno opposto agli estremi dell’intervallo [ a, b]) allora esiste almeno un punto ξ tale che f (ξ ) = 0, cioè esiste almeno una radice dell’equazione f ( x ) = 0 nell’intervallo [ a, b].

Figura 3.2: Teorema di Rolle: f 0 (c) = 0

Teorema 3.6.4 (Esistenza del punto fisso) Data una funzione g definita in [ a, b], continua e tale che a ≤ g( x ) ≤ b per ogni x ∈ [ a, b], allora g ammette almeno un punto fisso, cioè almeno un punto ξ per cui vale la relazione g(ξ ) = ξ. Figura 3.3:

Dimostrazione. Dire che una funzione g ammette almeno un punto fisso, vuol dire che esiste almeno un punto ξ nel suo insieme di definizione, tale che g(ξ ) = ξ. Dalle ipotesi del teorema, i valori della funzione g sono contenuti nell’intervallo [ a, b] e, in particolare a ≤ g( a) ≤ b e a ≤ g(b) ≤ b. Definiamo, perciò, la funzione continua Φ( x ) mediante la relazione

f 0 (c)

Teorema del Valor Medio:

f (b) − f ( a) = b−a

Φ( x ) = g( x ) − x Allora Φ( a) = g( a) − a > 0 e Φ(b) = g(b) − b < 0. Per il Teorema del Valore Intermedio esiste almeno un punto ξ ∈] a, b[ tale che Φ(ξ ) = 0, vale a dire g(ξ ) − ξ = 0, cioè g(ξ ) = ξ. Esiste almeno un punto fisso per la funzione g. 4 Teorema 3.6.5 (Esistenza e unicità del punto fisso) Data una funzione g di classe C1 in [ a, b], con a ≤ g( x ) ≤ b per ogni x ∈ [ a, b], e con | g0 ( x )| ≤ m < 1 per ogni x ∈ [ a, b] allora esiste ed è unico il punto fisso della g in tale intervallo. Dimostrazione. L’esistenza di almeno un punto fisso è assicurata dal teorema precedente (le ipotesi del teorema precedente ci sono tutte). Supponiamo, allora, che esistano due punti fissi ξ e η, con ξ 6= η, per la funzione g. Si ha

|ξ − η | = | g(ξ ) − g(η )|

Figura 3.4: Teorema del Valore Intermedio:

f (c) = K

appunti di calcolo numerico

27

Applicando il teorema del Valor Medio, esiste un punto c compreso tra ξ e η per cui

| g(ξ ) − g(η )| = | g0 (c)(ξ − η )| ≤ | g0 (c)||ξ − η | Ma per ipotesi | g0 (c)| ≤ m < 1 da cui

|ξ − η | ≤ m|ξ − η | < |ξ − η | Si arriva ad una contraddizione. L’assurdo deriva dall’aver supposto ξ 6= η. Quindi ξ = η e il punto fisso è unico. 4 Teorema 3.6.6 (Teorema del Valor Medio del Calcolo Integrale) Se f ∈ C ([ a, b]) e g è integrabile in [ a, b] e g( x ) non cambia segno in [ a, b], allora esiste un punto ξ ∈] a, b[ tale che Z b a

f ( x ) g( x ) d x = f (ξ )

Z b a

g( x ) d x

Per g ≡ 1, questo teorema ci dà il valore medio della funzione f 1 Rb sull’intervallo [ a, b], dato da f (ξ ) = f (x) d x b−a a Teorema 3.6.7 (Teorema di Rolle generalizzato) Sia f ∈ C ([ a, b]) n volte differenziabile in ] a, b[. Se f si annulla in n + 1 punti distinti x0 , x1 , . . . , xn in ] a, b[, allora esiste un punto ξ ∈] a, b[ in cui la derivata n-sima della f si annulla: f (n) (ξ ) = 0. Teorema 3.6.8 (Formula di Taylor) Sia f ∈ C2 ([ a, b]) e sia x0 un punto dell’intervallo [ a, b]. Allora, per qualunque x ∈ [ a, b] si può scrivere: f ( x ) = f ( x0 ) + f 0 ( x0 )( x − x0 ) +

( x − x0 )2 00 f (ξ x ) 2

Brook Taylor (1685 - 1731) fu un matematico inglese che sviluppò quello che oggi è chiamato calcolo delle differenze finite. L’importanza del suo lavoro e, soprattutto, della formula conosciuta oggi con il suo nome, venne riconosciuta solo nel 1772 da Lagrange.

dove ξ x è un opportuno punto di [ a, b] che si trova sul segmento individuato da x0 e x. La formula appena scritta si dice formula di Taylor di centro x0 nel punto x. La formula di Taylor appena scritta si può generalizzare se la funzione f è derivabile n + 1 volte. Si ha così la formula polinomiale di Taylor di centro x0 : f ( x ) = f ( x0 ) + f 0 ( x0 )( x − x0 ) +

f 00 ( x0 ) f ( n ) ( x0 ) ( x − x0 )2 + . . . + ( x − x0 ) n + R n 2! n!

dove Rn ( x ) =

f ( n +1) ( ξ x ) ( x − x 0 ) n +1 ( n + 1) !

con ξ x un opportuno punto di [ a, b] che si trova sul segmento individuato da x0 e x.

4 Rappresentazione dei numeri nel calcolatore

4.1

Disastri numerici!

Esistono 10 tipi di persone: quelli che capiscono i numeri binari e quelli che non li capiscono. Umorismo in rete

Molte volte, si pensa che i risultati numerici ottenuti da un calcolatore elettronico, specie se sono ottenuti come output di un sofisticato software, non contengano errori e, se ne abbiano, siano da ritenersi trascurabili. In realtà, quando si esegue un programma al calcolatore, bisogna prima di tutto aver verificato che sia stato scritto correttamente (il programma deve, cioè, tradurre correttamente il problema matematico che si vuole risolvere). Inoltre, bisogna tener conto che i risultati numerici sono sempre affetti da un certo tipo di errore, che può essere, per esempio, di arrotondamento o di troncamento: π è un numero con infinite cifre decimali ma il calcolatore lo può vedere solo come un numero con finite cifre decimali..., molte formule non possono essere usate così come sono ma devono essere in qualche modo semplificate (basti pensare ad una somma di infiniti termini). Non tenere conto di questi fattori può portare a risultati davvero disastrosi, come può essere verificato andando a controllare la pagina web dedicata ai disastri dovuti a uno scorretto calcolo numerico: http://www.ima.umn.edu/~arnold/disasters/disasters.html

Vediamo alcuni di questi disastri numerici. Il disastro del missile Patriot nel 1991. Il 25 febbraio 1991, durante la prima Guerra del Golfo, un missile Patriot fallì l’intercettazione di un missile Scud iracheno. Questo errore costò la vita di 28 soldati, un centinaio di feriti e la distruzione di un capannone americano. La causa del disastro fu dovuto ad errori di arrotondamento nel sistema operativo del Patriot: ad ogni secondo che passava si introduceva un ritardo infinitesimo che comportava un errore nella valutazione della traiettoria del missile Scud. Col passare delle ore il ritardo accumulato fu tale da far intercettare una posizione del tutto diversa da quella in cui si trovava il missile da abbattere. Difatti, il computer usato per controllare il missile Patriot era basato su un’aritmetica a 24 bit. Per i calcoli, il tempo veniva registrato dall’orologio interno del sistema in decimi di secondi e successivamente moltiplicato per 1/10 per

La pagina web è del prof. Douglas N. Arnold, dell’Università del Minnesota, e viene introdotta con la seguente frase (traducendo): Stai seguendo con attenzione il tuo corso di analisi numerica o di calcolo scientifico? Se non lo stai facendo, potrebbe costarti un caro errore. Nel seguito, ci sono esempi dalla vita reale di ciò che può succedere quando gli algoritmi numerici non sono applicati correttamente.

Figura 4.1: Il disastro del missile Patriot. La foto è presa dal sito del prof. Douglas.

30

annamaria mazzia

ottenere i secondi, utilizzando 24 bit in virgola fissa. Il numero 1/10 in base 2 ha infinite cifre decimali: la sua espansione binaria è infatti 0.0001100110011001100110011001100 . . .. In 24 bit esso veniva registrato come 0.00011001100110011001100 introducendo un errore di 0.0000000000000000000000011001100 . . ., che, in base 10, significa circa 0.000000095. Gli errori di arrotondamento nella conversione del tempo causarono un errore nel calcolo della traiettoria: il tempo di 100 ore calcolato in secondi diede il valore 359999.6567 invece di 360000, un errore di 0.3433 secondi che portò il Patriot 687 metri fuori della traiettoria del missile Scud!

L’esplosione dell’Ariane 5 nel 1996. Il 4 giugno 1996, dopo una spesa di 7 miliardi di dollari, e dopo appena 40 secondi dal suo lancio, esplose il razzo Ariane 5, nella Guiana Francese. Il razzo e il suo carico erano valutati per oltre 500 milioni di dollari. Perciò il costo totale della missione era stato di oltre 7 miliardi e mezzo di dollari. Fu scoperto che l’errore era nel software e, in particolare, nella componente del Sistema di Riferimento Inerziale, che era stato preso dal software dell’Ariane 4. Certe parti del software dell’Ariane 5 erano state aggiornate rispetto al software dell’Ariane 4, ma non si era aggiornato quanto preso dal software dell’Ariane 4. In particolare, il fallimento dell’Ariane 5 è dovuto ad un errore di conversione da un sistema a 64 bit a virgola mobile ad uno a 16 bit a virgola fissa. La velocità orizzontale del razzo rispetto alla piattaforma misurato in 64 bit era un numero più grande del massimo consentito nell’aritmetica a 16 bit. Si ebbe quindi un errore di overflow che causò l’arresto del software di controllo del volo 37 secondi dopo il lancio del razzo. Dopo 3 secondi il razzo si distrusse.

Il disastro del veicolo spaziale Mars Climate Orbiter nel 1999. Il disastro, invece, del veicolo spaziale della missione Mars Climate Orbiter non si trova sulla pagina web del prof. Douglas, ma i dettagli della storia si possono trovare, ad esempio, sul sito http://marsprogram.jpl. nasa.gov/msp98/orbiter. Il 23 settembre 1999 si perdono le tracce del veicolo spaziale Mars Climate Orbiter. Gli obiettivi di questa missione della NASA erano sia di monitoraggio dei cambiamenti climatici sia di supporto per la missione Mars Polar Lander. I costi della Climate Orbiter e della Polar Lander erano di un totale di oltre 320 milioni di dollari. Si era ipotizzato di entrare nell’atmosfera di Marte ad una altezza di circa 150 km mentre il veicolo spaziale entrò ad una altezza di circa 60 km. Per un errore di conversione delle unità di misura, il velivolo entrò nell’atmosfera con una traiettoria inferiore rispetto a quella pianificata. La velocità del mezzo era molto elevata e portò alla distruzione non solo del veicolo spaziale ma anche della stessa Polar Lander.

Figura 4.2: L’esplosione di Ariane 5. Foto tratta da http://personal.victoria.ac. nz/stephen_marshall/SE/Failures/ SE_Ariane.html

Figura 4.3: La Mars Climate Orbiter. Foto tratta da http://www.visionlearning. com/blog/2012/09/21/ tragedies-in-science-the-crash-of-the-marsclimate-orbiter/, copyright della

NASA/JPL.

appunti di calcolo numerico

31

Diversi furono i motivi che portarono al fallimento di questa missione. Il principale è dovuto all’errore nel trasferimento di informazioni tra il team che lavorava sul veicolo spaziale, che si trovava in Colorado e il team della missione di navigazione, che lavorava in California. Un team usava le unità inglesi (inches, feet, pounds) mentre l’altro usava le unità metriche. L’errore fu nella mancata conversione delle unità di misura tra unità inglesi e unità metriche!

4.2

Aritmetica di macchina

Un qualunque numero reale può essere rappresentato accuratamente da una sequenza di infinite cifre decimali. Ad esempio: 1 = 0.3333333 . . . = 3



 3 3 3 0 3 + + + + . . . × 100 100 102 103 101 104

 π = 3.14159265358979 . . . =

Si osservi che la notazione di usare la virgola per esprimere la parte decimale di un numero non è una notazione internazionale. Noi useremo sempre il punto decimale per dire che le cifre che seguono rappresentano la parte decimale del numero.

 1 1 5 3 4 + 1 + 2 + 3 + 4 . . . × 100 100 10 10 10 10

Osserviamo che abbiamo scritto 1/3 e π in base 10, usando, quindi, le cifre 0, 1, 2, . . . , 9 per poterli rappresentare. In genere, un numero reale x può essere rappresentato in base N come x = 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 |

{z

parte intera

} |

{z

parte frazionaria

dove m e n sono interi naturali e xk , k = m, m − 1, . . . , −n sono interi naturali compresi tra 0 e N − 1. Tuttavia, i calcolatori hanno una memoria finita per poter rappresentare i numeri. Ciò significa che solo una sequenza finita di cifre possono essere usate. Inoltre, i calcolatori lavorano in base binaria, quindi ogni numero può essere rappresentato mediante una sequenza di 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 di macchina denotato come f l ( x ), in rappresentazione floating point – virgola mobile.

4.3

Conversione di base

Nel seguito, non affronteremo gli aspetti teorici del passaggio da una base ad un altra per rappresentare lo stesso numero, ma vedremo l’implementazione pratica per convertire un numero dalla base 10 alla base 2 e viceversa.

}

In base 10, il numero 72.65, scritto in forma estesa è dato dalla forma:

7 × 101 + 2 × 100 + 6 × 10−1 + 5 × 10−2

32

annamaria mazzia

Il passaggio di un numero dalla rappresentazione in base 2 alla rappresentazione in base 10 è semplice, in quanto si tratta di scrivere il numero come combinazione delle opportune potenze di 2. Vediamo un esempio. Esempio Sia 10001000.010 il numero scritto in base 2. Se lo scriviamo mediante le potenze di 2 si ha:

10001000.010 =

= 1 · 27 + 0 · 26 + 0 · 25 + 0 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + 0 · 20 + 0 · 2−1 + 1 · 2−2 + 0 · 2−2 |

{z

parte intera

} |

= 27 + 23 + 2−2 = 128 + 8 + 0.25 = 136.25 Questo è quindi lo stesso numero ma rappresentato in base 10. _ Il passaggio di un numero dalla rappresentazione in base 10 a quella in base 2 si effettua, invece, in due passi. Si prende la parte intera del numero e la si divide per 2: se il resto della divisione è zero, allora la corrispondente cifra binaria sarà 0; se il resto è diverso da zero, la corrispondente cifra binaria sarà 1. Si ripete la procedura sul risultato avuto dalla divisione, fino a quando si arriva a 1. In tal modo, calcoliamo le cifre binarie a partire da x0 (il primo resto ottenuto) e andando avanti con indice crescente. Si prende la parte frazionaria del numero e la si moltiplica per 2. Se il risultato dell’operazione ha la parte intera diversa da zero, allora la corrispondente cifra binaria vale 1, altrimenti vale 0. Si ripete la procedura sulla parte frazionaria del risultato appena ottenuto e si continua fino a quando si arriva allo zero (o se si vede che c’è una periodicità nei risultati). Le cifre binarie vengono costruite da x−1 con indice decrescente.

G

G

Esempio Vogliamo convertire il numero 725.625 dalla base 10 nella base 2. Per la parte intera si ha: Per la parte decimale si ha : quoziente resto .625 × 2 = 1.250 x−1 = 1 725:2 = 362 1 x0 = 1 .250 × 2 = 0.50 x −2 = 0 362:2= 181 0 x1 = 0 .5 × 2 = 1.0 x −3 = 1 181:2= 90 1 x2 = 1 .0 × 2 = 0.0 90:2= 45 0 x3 = 0 22 1 x4 = 1 45:2= 22:2= 11 0 x5 = 0 11:2= 5 1 x6 = 1 5:2= 2 1 x7 = 1 2:2= 1 0 x8 = 0 1:2= 0 1 x9 = 1 In base 2 il numero diventa 1011010101.101. _

{z

parte frazionaria

}

appunti di calcolo numerico

33

Osserviamo che un numero può avere una rappresentazione finita in base 10 e infinita in base 2. Vediamo in dettaglio un esempio: Esempio Scriviamo il numero base 2. Per la parte intera: : 2 = quoziente 1 0

resto 1

x0

11 , che è 1.1 in base 10, nella 10

Per la parte decimale: .1 × 2 = 0.2 x−1 = 0 .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 = 0

Osserviamo che nella parte decimale si ripetono all’infinito le cifre 0011. Il numero in base 2 si scrive quindi come: 1.0 0011 |{z} . . . |{z} 0011

4.4

_

Rappresentazione IEEE dei numeri di macchina

Lo sviluppo dei calcolatori ha promosso e sviluppato l’uso del sistema binario, in cui ciascun numero è rappresentato da una successione di cifre binarie (0 e 1). Ma come avviene la rappresentazione di un numero nel calcolatore? Come rappresentare un numero a infinite cifre in maniera accurata utilizzando solo un numero finito di cifre? Lo standard IEEE , oggi utilizzato dalla maggior parte dei calcolatori, è dato dalla rappresentazione in virgola mobile (floating point). Esiste anche un tipo di rappresentazione in virgola fissa (fixed point), ma in genere è preferita quella in floating point, e noi ci soffermeremo solo su questa. Riprendiamo l’esempio proposto in Sezione 4.2, dove abbiamo 1 scritto in base 10 come 3   1 0 3 3 3 3 = 0.3333333 . . . = + + + + . . . × 100 3 100 102 103 101 104 Questo è un esempio di numero scritto in virgola mobile: un qualunque numero x, in base 10, si può scrivere sotto la forma x = f 10e dove f rappresenta la parte frazionaria, detta mantissa, del numero e e è l’esponente (intero) della base con cui stiamo rappresentando il numero stesso, che dà informazioni sulla parte intera del numero. Ci sono diverse rappresentazioni in virgola mobile, tutte equivalenti tra loro. Si parla di virgola mobile normalizzata quando la mantissa ha una singola cifra di valore diverso da zero a sinistra della virgola.

IEEE è la sigla dell’Institute of Electrical and Electronics Engineers

12.5 = 1.25 × 101 = 0.125 × 102 = 0.000125 × 105 sono tutte rappresentazioni equivalenti dello stesso numero.

La rappresentazione in virgola mobile normalizzata, se stiamo lavorando in base 10, esprimerà la mantissa del numero come x.qualcosa con x è una cifra diversa da zero. Invece, in base 2, la mantissa sarà del tipo 1.qualcosa.

34

annamaria mazzia

La rappresentazione in virgola mobile normalizzata in base 2 è quella utilizzata nello standard IEEE: i numeri si possono scrivere nella forma x = f 2e . Al calcolatore, tuttavia, non possiamo rappresentare numeri con una mantissa a infinite cifre, perciò f = ±1. f −1 f −2 . . . f −n e e = ±e Ne−1 e Ne−2 . . . e0 ., dove f −1 , f −2 , . . . , f −n , e e Ne−1 , e Ne−2 , . . . , e0 sono le cifre che caratterizzano rispettivamente la mantissa e l’esponente del numero in virgola mobile normalizzata in base 2, e quindi possono valere 1 o 0. Abbiamo n cifre per la mantissa (in realtà sono n + 1 ma poichè la rappresentazione è normalizzata f 0 = 1) e Ne per l’esponente. Nel sistema binario, le cifre vengono chiamate bits ( binary digits): quindi n bits sono riservati per la mantissa, Ne per l’esponente. Un numero in floating point nella rappresentazione IEEE viene scritto come x = ±(1 + f −1 2−1 + f −2 2−2 + . . . + f −n 2−n ) × 2e dove

x 1+ f

+ f −2 2−2 + . . . + f −n 2−n è la mantissa, normalizzata, cui sono riservati un numero n di bits, −1 2

−1

x

e è la potenza della base 2 cui sono riservati un numero Ne di 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 rappresentazione in virgola mobile può essere schematizzata nel modo seguente (s, e ed f rappresentano i bits riservati rispettivamente per il segno della mantissa, e per le cifre dell’esponente e della mantissa – ogni celletta può avere il valore 0 o 1): s |{z}

segno

e

e |

e

e

e

···

{z

cifre dell’esponente

e }

f

f |

f

f

f

···

{z

cifre della mantissa

f }

Abbiamo 1 bit riservato al segno (si ha 0 per il segno + e 1 per il segno −), un numero Ne di bits per l’esponente 2e , e un numero n di bits per la mantissa La scelta del numero di bits da riservare all’esponente e alla mantissa si basa su un compromesso tra la dimensione dell’esponente (e quindi il più piccolo e il più grande numero rappresentabile) e la dimensione della mantissa (e quindi 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 suddivisione dei bits tra esponente e mantissa viene ripartita nel modo seguente: Singola precisione Doppia precisione

s 1 1

Ne 8 11

n 23 52

# totale bits 32 64

Riservare, nell’ordine, i bits per il segno, per l’esponente e infine per la mantissa, ha una sua spiegazione. Se, ad esempio, noi vogliamo confrontare due date per stabilire quale viene prima e quale dopo, partiamo dall’anno, poi vediamo il mese e infine il giorno. Allo stesso modo, se dobbiamo confrontare due numeri, prima andiamo a vedere l’esponente e poi la mantissa. Perciò, viene memorizzato prima l’esponente e poi la mantissa. Per il segno del numero, invece, la scelta è fatta per analogia alla rappresentazione dei numeri interi, dove il primo bit è riservato al segno.

appunti di calcolo numerico

35

Gli esponenti possono essere sia positivi sia negativi ma si preferisce memorizzarli come interi positivi (senza segno). Abbiamo dunque bisogno di una tecnica che permetta di rappresentare esponenti negativi come interi positivi. La tecnica utilizzata nello standard IEEE è chiamata di biasing (distorsione): un numero positivo (detto bias) viene aggiunto all’esponente (sia esso positivo o negativo) in modo che il risultato finale sia sempre positivo. Ed è questo valore che viene memorizzato per rappresentare l’esponente. L’esponente viene quindi rappresentato in forma biased (parziale, influenzata da un altro numero): se e è l’esponente effettivo, noi memorizziamo il valore b + e dove b è il bias dato b = 0111 | {z. . . 1}, vale a dire Ne bits 1 − 2 Ne−1 b = 1 + 2 + 22 + . . . + 2 Ne−2 + 0 · 2 Ne−1 = = 2 Ne−1 − 1 1−2 Il vantaggio di usare la rappresentazione biased, cioè di memorizzare il valore dell’esponente senza segno, rende più semplice il confronto degli esponenti (quando serve) perchè su di essi si possono applicare istruzioni di confronto come per i numeri interi. Questa semplificazione non si ha, invece, in altri tipi di memorizzazione.

Esempio Cerchiamo di capire perchè b ha questo valore, considerando la rappresentazione in singola precisione. Il più grande esponente che può essere rappresentato in singola precisione è dato da 11111111 che, in base 10 vale 255. La metà di 255 è 127 (con resto 1). Questo valore è proprio quello assegnato al bias (infatti 127 in base 2 si scrive come 01111111) e ci permette di ottenere valori sempre positivi per l’esponente che viene effettivamente memorizzato. Dal momento che (in base 10) deve valere la relazione 0 ≤ b + e ≤ 255 (noi memorizziamo il valore b + e sia che e sia positivo sia che sia negativo), troviamo che e può variare tra −127 e +128. Tuttavia, per e = −127 si ha b + e = 0 e per e = 128 si ha b + e = 255, questi due valori dell’esponente sono riservati per i numeri speciali (zero, infinito e Not-a-Number), quindi, e potrà variare nell’intervallo [−126, 127]. _ In generale, quindi, si ha 0 ≤ b + e ≤ 1111 . . . 1 (il valore massimo è dato dal numero in base 2 formato da Ne cifre uguali a 1). Per trovare il limite superiore e inferiore entro cui può variare e, dobbiamo tener conto del fatto che, nella rappresentazione IEEE, i valori 0 e 1111 . . . 1 sono riservati per rappresentare numeri speciali quali lo zero, infinito e il Not-a-Number. Di conseguenza, la relazione di prima va scritta con le disuguaglianze strette: 0 < b + e < 1111 . . . 1. Ciò significa che il massimo esponente che si può rappresentare è dato da 1111 . . . 1 − 1 che, in base 2, vale 1111 . . . 10. Da b + e ≤ 1111 . . . 10 si ha pure e ≤ 1111 . . . 10 − b = 1111 . . . 10 − 0111 . . . 1 = 0111 . . . 1 = b. Il limite superiore per e, che indichiamo con U vale proprio b. Per il limite inferiore abbiamo: 0 < b + e cioè 1 ≤ b + e (si noti che siamo passati da < a ≤) da cui 1 − b ≤ e, ovvero, −(b − 1) ≤ e.

Si arriva a questo risultato perché abbiamo una somma del tipo S = 1 + a + a2 + . . . +

an e vale S = a=

1 = 2−1 . 2

1 − a ( n +1) . In questo caso, 1−a

36

annamaria mazzia

Il limite inferiore è L = −(b − 1). In singola precisione, b = 0111 | {z. . . 1}: in base 10 b = 12710 , da cui

8 bits l’intervallo [ L, U ] = [−126, 127]. In doppia precisione, invece, b = 102310 da cui [ L, U ] = [−1022, 1023]. Per quanto riguarda la mantissa, sono ad essa riservati n bits. Considerando anche l’1 della normalizzazione, la precisione è di n + 1 bits. Il più grande numero che si può rappresentare è, quindi n

1. 111 . . . 1} ×2U = ( ∑ 2−k ) × 2U = | {z n

k =0

bits

Dati n valori w1 , w2 , . . . , wn con la seguente simbologia si indica la loro somma:

1 − 2−(n+1) U 2 = (2 − 2−n )2U ≈ 2U +1 1 − 2−1

n

∑ w k = w1 + w2 + w3 + . . . w n

.

Il più piccolo numero positivo rappresentabile è dato, invece, da:

k =1

In singola e doppia precisione abbiamo, per il più grande e il più piccolo numero positivo rappresentabile, i seguenti valori:

1. 000 . . . 0} ×2 L = 2 L | {z

bits Se si vuole rappresentare un numero al di fuori di questo intervallo si ha overflow o underflow. n

Massimo Minimo

Esempio Vogliamo scrivere il numero 5.7510 in formato IEEE in singola precisione. Effettuiamo prima la conversione in base 2: Per la parte intera: Per la parte decimale: 5 2 1 x0 .75 × 2 = 1.50 x−1 = 1 .5 × 2 = 1.0 2 1 0 x1 x −2 = 1 1 0 1 x2 .0 × 2 = 0.0 Quindi 5.7510 = 101.112 = 1.0111 × 22 . Memorizziamo ora il numero in singola precisione: Per l’esponente, essendo e = 2, si ha:

(b + e)10 = (127 + 2)10 = 12910 = 100000012 Per la mantissa, m = 23 e si deve trascurare l’1 della normalizzazione, quindi memorizzeremo le cifre 0111 e poi avremo tutti 0. 0

1

1

1

0

0

0

...

0

0

0

0

0

0

0

0

0

0

Il segno è positivo, quindi s = 0 Perciò la memorizzazione, considerati i bits per il segno, l’esponente e la mantissa è: 0

1

|{z}

|

s

0

0

0

0 {z

esponente

0

0

1

0

}

|

1

1

1

0

...

0

0

0

0

{z

}

mantissa

_ Consideriamo, ora, la rappresentazione dei numeri speciali. Per convenzione si pone uguale a 0 la rappresentazione che vede tutti zero sia nel segno, sia nell’esponente che nella mantissa (non dimentichiamo che il valore 1 della normalizzazione non è messo in memoria ma c’è e quindi non potremmo mai avere il valore 0, perciò lo si pone per convenzione).

0

Singola precisione

Doppia precisione

≈ 3.4 × 1038 ≈ 1.2 × 10−38

≈ 10308 ≈ 2.2 × 10−308

appunti di calcolo numerico

37

Per i valori ±∞ si considerano tutti 1 nello spazio dedicato all’esponente, tutti 0 nello spazio dedicato alla mantissa e 0 o 1 per il segno, a seconda che sia + o −∞. 0/1 |{z} s

1

1 |

1

... {z

esponente

1

1 }

0

0 |

0

...

0

{z

mantissa

0 }

I valori ±∞ si hanno se si fa una divisione per zero o si fa un calcolo che comporta overflow. Si ha invece il Not-a-Number (NaN) come risultato di operazioni non definite, come 0/0 o log 0. A seconda della macchina si ha:

0 |{z} s

NaNS, che produce un segnale di errore 1 1 1 ... 1 1 0 1 1 ... 1 |

{z

esponente

}

|

{z

mantissa

1 }

NaNQ, con il quale il calcolo continua comunque... 0 1 1 1 ... 1 1 1 0 0 ... 0 0 |{z} s

4.5

|

{z

esponente

}

|

{z

mantissa

}

Precisione numerica

Un numero può avere una rappresentazione finita o infinita. Basti √ pensare al valore di π 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 di cifre: in che modo lo esprimiamo? Per lasciare maggiore generalità al discorso, consideriamo una base N. −k p Sia x = ±(∑∞ k =0 x−k N ) N il numero "esatto" (può avere infinite cifre decimali e lo rappresentiamo come somma di infiniti termini). 1 ∗ −k p∗ In floating-point esso sarà espresso come x ∗ = ±(∑tk− =0 x − k N ) N , esso, cioè, sarà arrotondato (non possiamo avere infinite cifre decimali e, difatti, la somma considera solo t termini). Ci sono due modi per arrotondare un numero

x

∗ = x troncamento: x ∗ = tronc( x ), dove p∗ = p e x− −k per k k = 0, . . . , t − 1. Le altre cifre, x−t , x−t−1 , . . . sono ignorate.

x

1 arrotondamento simmetrico: x ∗ = arr ( x ) = tronc( x + N −t+1 N p ), 2 aggiungiamo un’unità a x−t+1 se x−t ≥ N/2.

L’errore assoluto | x − x ∗ | che si commette approssimando il numero x con x ∗ sarà

Evitiamo di effettuare tutti i passaggi che portano alle formule dell’errore assoluto e relativo, che sono il risultato di maggiorazioni di serie geometriche.

38

annamaria mazzia

  N 1− t N p |x − x∗ | ≤ 1  N 1− t N p 2

nel troncamento nell’arrotondamento

Per l’errore relativo (in valore assoluto)

|x − x∗ | |x|

  N 1− t ≤ 1  N 1− t 2

|x − x∗ | , invece, si ha: |x|

nel troncamento nell’arrotondamento

1 1− t N è il numero conosciuto come precisione di macchina. 2 Nel caso della rappresentazione IEEE di un numero, si ha t − 1 = n, (ricordiamo che nella rappresentazione IEEE si memorizza il numero normalizzato), da cui l’errore di arrotondamento relativo che |x − x∗ | si commette è ≤ 2−(n+1) . |x| In singola precisione (n = 23), avremo Il valore

|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.

4.6

Cifre significative

Prima di vedere come si propagano gli errori nelle operazioni elementari di moltiplicazione, divisione, addizione e sottrazione, vediamo il concetto di cifre significative. Le cifre significative sono quelle che danno un’informazione effettiva sul valore del numero, indipendentemente dalla parte esponenziale. Esempio Supponiamo di dover calcolare l’errore assoluto e relativo per approssimare un certo numero x mediante x ∗ , per i seguenti casi: 1. x = 0.6000 × 101 , x ∗ = 0.6100 × 101 ; 2. x = 0.6000 × 10−3 , x ∗ = 0.6100 × 10−3 ; 3. x = 0.6000 × 104 , x ∗ = 0.6100 × 104 ;

appunti di calcolo numerico

39

Nel primo caso, abbiamo | x − x ∗ | = 0.1 mentre l’errore relativo vale 0.166666 × 10−1 Nel secondo caso, l’errore assoluto vale 1 × 10−5 e l’errore relativo 0.166666 × 10−1 . Nell’ultimo caso, l’errore assoluto è 1 × 102 e quello relativo 0.166666 × 10−1 . L’errore relativo rimane sempre lo stesso, mentre quello assoluto cambia per i tre casi esaminati. Come misura di accuratezza, l’errore assoluto può portare a conclusioni fuorvianti, mentre l’errore relativo ci dà informazioni più significative perché tiene conto della dimensione del valore. _ Abbiamo quindi la seguente definizione (per numeri in base 10). Definizione 4.6.1 Si dice che un numero x ∗ approssima x con t cifre significative se t è il più grande intero positivo per il quale

|x − x∗ | ≤ 5 × 10−t |x| Se il numero x è rappresentato al calcolatore in floating point, mediante la rappresentazione data da f l ( x ), sappiamo che vale | x − f l ( x )| 1 ≤ N 1−t (N la base, t il numero di cifre per la man|x| 2 tissa): se consideriamo la base dieci, questa maggiorazione si scrive proprio come

Nell’esempio precedente, i tre numeri sono rappresentati con due cifre significative dal momento che 0.166666 × 10−1 ≤ 5 × 10−2 e 0.166666 × 10−1 > 5 × 10−3 .

|x − x∗ | ≤ 0.5 × 101−t = 5 × 10−t |x| Quest’ultima maggiorazione, con t il più grande intero positivo per il quale è verificata la relazione scritta, dà quindi la definizione di cifre significative per un numero espresso in floating point.

4.7

Propagazione degli errori

Se scriviamo il numero in virgola mobile normalizzata, le cifre significative sono date, quindi, dalle cifre della parte frazionaria. La bontà delle cifre va diminuendo procedendo da sinistra verso destra e questo può portare ad una perdita di cifre significative, come possiamo vedere studiando la propagazione degli errori nelle operazioni elementari. Supponiamo che i numeri su cui lavoriamo siano affetti da errore (di arrotondamento), mentre le operazioni siano eseguite in modo esatto. Indichiamo con il simbolo o una qualunque delle operazioni elementari {×, /, +, −} e con f l ( x ) il numero x rappresentato in floating point e arrotondato, quindi f l ( x ) = x (1 + ex ) dove ex è l’errore di arrotondamento relativo, cambiato di segno. Allora f l ( x o y) = f l ( x ) o f l (y) = x (1 + ex ) o y(1 + ey ).

x

Moltiplicazione

x − f l (x) si ha xe x = x − f l ( x ) x da cui f l ( x ) = x (1 + e x ), dove ora e x viene Da e x =

considerato cambiato di segno.

Nei calcoli sono trascurabili le potenze maggiori o uguali a due per e x e ey

40

annamaria mazzia

x (1 + ex ) × y(1 + ey ) = ( x × y)(1 + ex )(1 + ey ) ≈ ( x × y)(1 + ex + ey ) Quindi l’errore nel prodotto è dato da exy = ex + ey

x Divisione (con y 6= 0)

x (1 + e x ) x x = (1 + ex )(1 − ey + e2y + . . .) ≈ (1 + ex − ey ) y (1 + e y ) y y Abbiamo scritto

Si ha ex/y = ex − ey : gli errori si accumulano additivamente

x

Somma algebrica (addizione o sottrazione, a seconda del segno di x e y)

x (1 + ex ) + y(1 + ey ) = x + y + xex + yey = ( x + y)(1 + L’errore è ex+y =

1 = (1 − ey + e2y + 1 + ey

. . .) come risultato della formula polinomiale 1 di 1 + ey centro 0. di Taylor della funzione f (ey ) =

y x ex + ey ) x+y x+y

x y ex + ey , una combinazione lineare che x+y x+y

dipende da x e y. – xy > 0 =⇒ |ex+y | ≤ |ex | + |ey |

|y| |x| e possono essere molto grandi e, in | x + y| | x + y| tal caso, ci sarà un’amplificazione notevole dell’errore. Si ha il fenomeno di cancellazione se non si fa attenzione al numero di cifre significative dei numeri che vengono sommati.

– xy < 0 =⇒

Ricordiamo, infine, che in aritmetica di macchina non valgono più la proprietà distributiva o associativa del prodotto. Esempio 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−3 Facendo la sottrazione di 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 × 0.100337 − 5 10 . Questo errore è minore della precisione di macchina (considera1 ta la base 10 e le 4 cifre) · 10−3 . 2 Tuttavia, se non teniamo conto delle cifre significative ma tronchiamo i numeri alle prime 4 cifre, abbiamo la sottrazione di 0.1103 − 0.0099 = 0.1004. |0.100337 − 0.1004| Questa volta l’errore relativo è ≈ .63 × 10−3 . 0.100337 L’errore è maggiore della precisione di macchina. _ Esempio Sia da risolvere l’equazione ax2 + bx + c = 0 con a = 1, b = −56 e c = 1, quindi x2 − 56x + 1 = 0, in una macchina a 4 cifre decimali (normalizzata).

Supponiamo di avere due numeri molto vicini tra loro, in cui le prime p + 2 cifre della parte frazionaria sono buone mentre le altre sono corrotte. Inoltre, le prime p cifre siano le stesse per entrambi i numeri (usiamo i simboli vvv e www per esprimere le cifre corrotte):

f l ( x ) = 1.d−1 d−2 . . . b−( p+1) b−( p+2) vvv × 2e 0 0 e f l (y) = 1.d−1 d−2 . . . b−( p+1) b−( p+2) www × 2

Quando andiamo a fare la sottrazione le prime p cifre buone si annullano. Da p + 2 cifre buone, ne abbiamo ora solo 2 e tutte le altre sono quelle corrotte. Con la normalizzazione il risultato diventa del tipo (ora qqqqq sono le cifre corrotte): 00 00 e f l ( x − y) = 1.b− 1 b−2 qqqqqq × 2

appunti di calcolo numerico

41

√ −b ± b2 − 4ac Applicando la formula x1/2 = abbiamo x1/2 = 2a  0.01786284073 √ . L’arrotonda28 ± 783 = 28 ± 27.98213716 = 55.98213716 mento delle due radici in virgola mobile normalizzata a 4 cifre decimali dà: x1 = 1.7863 · 10−2 e x2 = 5.5982 · 101 . Consideriamo ora la macchina a 4 cifre decimali per risolvere l’equazione: x1 = 28 −



783 = 2.8 · 101 − 2.7982 · 101 = 0.0018 · 101 = 0.018 = 1.8 · 10−2

x2 = 28 +



783 = 2.8 · 101 + 2.7982 · 101 = 5.5982 · 101

La radice x2 è arrotondata correttamente, mentre la variabile x1 no, per effetto della cancellazione. Per ricavare x1 con l’arrotondamento corretto, applichiamo la formula x1 x2 = c/a, che, nel nostro caso, vale x1 x2 = 1 da cui x1 = 1/x2 = 1/(5.5982 · 101 ) = 1.7863 · 10−2 . Abbiamo fatto un’operazione che non risente del fenomeno di cancellazione numerica! _ Esempio Vediamo come non valga più la relazione ( a − b)2 = − 2ab + b2 . Sia a = 15.6 e b = 15.7 e la macchina sia a 3 cifre decimali ( a − b) = ( a − b)∗ + ea−b . Abbiamo ( a − b)∗ = 15.6 − 15.7 = −0.1. Quindi ( a − b)2 = +0.01 = 0.1 · 10−1 . Consideriamo ora a2 − 2ab + b2 = 243.36 − 489.84 + 246.49 = 0.24336 · 103 − 0.48984 · 103 + 0.24649 · 103 Considerando la macchina a 3 cifre decimali, abbiamo: 0.243 · 103 − 0.490 · 103 + 0.246 · 103 = −0.1 · 101 I risultati sono completamente diversi! _ a2

Esempio Consideriamo il problema di approssimare la derivata della funzione f ( x ) = sin x nel punto x = 1.2. Supponiamo di non poter valutare direttamente la derivata della f e di volerla approssimare applicando la formula polinomiale di Taylor: f ( x0 + h ) = f ( x0 ) + h f 0 ( x0 ) +

h2 00 h3 h4 IV f ( x0 ) + f 000 ( x0 ) + f ( x0 ) + . . . 2 6 24

Allora f 0 ( x0 ) =

f ( x0 + h ) − f ( x0 ) h h2 h3 − ( f 00 ( x0 ) + f 000 ( x0 ) + f IV ( x0 ) + . . .) h 2 6 24

f ( x0 + h ) − f ( x0 ) . h L’errore, detto errore di discretizzazione, che si commette è Approssimiamo, quindi, la f 0 ( x0 ) calcolando

| f 0 ( x0 ) −

f ( x0 + h ) − f ( x0 ) h h2 h3 | = | f 00 ( x0 ) + f 000 ( x0 ) + f IV ( x0 ) + . . . | h 2 6 24

Questa volta lavoriamo su una macchina non normalizzata, per cui scriviamo la parte frazionaria come 0.qualcosa. Per esercizio, si ripeta l’esempio lavorando su una macchina a 2 cifre decimali normalizzata e su una macchina a 3 cifre decimali normalizzata. Cosa si osserva?

42

annamaria mazzia

Supponendo di conoscere il valore della derivata seconda in x0 , per piccoli valori di h possiamo dare una stima dell’errore di discretizzazione,

| f 0 ( x0 ) −

h f ( x0 + h ) − f ( x0 ) | ≈ | f 00 ( x0 )| h 2

Ci aspettiamo, anche senza conoscere il valore di f 00 ( x0 ) (purchè diverso da 0) che l’errore di discretizzazione diminuisca proporzionalmente con il passo h, al decrescere di h. Nel nostro caso, in cui f ( x ) = sin ( x ), noi conosciamo il valore esatto della derivata in 1.2, cos (1.2) = 0.362357754476674... e possiamo dunque calcolare l’errore esatto che commettiamo approssimando la derivata di sin x con la formula che abbiamo ricavato. Per h = 0.1 non abbiamo un’approssimazione accurata. Ci aspettiamo che diminuendo il passo h l’errore che commettiamo diminuisca. Riportiamo, nella tabella a lato, gli errori della formula (in valore h assoluto) e confrontiamoli con l’errore di discretizzazione | f 00 ( x0 )| 2 (i conti sono fatti in singola precisione): L’errore commesso dallo schema decresce come h e, in particolare, h come | f 00 (1.2)| = 0.46602h. 2 Possiamo pensare di ottenere un’accuratezza grande quanto vogliamo a condizione di prendere valori di h sempre più piccoli. In realtà, per valori di h molto piccoli, gli errori iniziano ad aumentare! h

errore

1.e-8 1.e-9 1.e-10 1.e-11 1.e-12 1.e-13 1.e-16 1.e-18

4.3611e-10 5.5947e-8 1.6697e-7 4.6603e-5 1.3006e-4 4.2505e-4 3.6236e-1 3.6236e-1

h

errore

h 00 | f ( x0 )| 2

1.e-1 1.e-2 1.e-3 1.e-4 1.e-5 1.e-6

4.7167e-2 4.6662e-3 4.6608e-4 4.6603e-5 4.6602e-6 4.6597e-7

4.6602e-2 4.6602e-3 4.6602e-4 4.6602e-5 4.6602e-6 4.6602e-7

h 00 | f ( x0 )| 2 4.6602e-9 4.6602e-10 4.6602e-11 4.6602e-12 4.6602e-13 4.6602e-14 4.6602e-16 4.6602e-19

In Figura 4.4 vediamo come la curva dell’errore inizialmente segue la retta descritta dall’errore di discretizzazione ma poi si allontana da essa. Perchè questo diverso comportamento per valori di h molto piccoli? Dobbiamo tenere presente che l’errore che noi valutiamo non è semplicemente l’errore di discretizzazione ma la somma dell’errore di discretizzazione e dell’errore di arrotondamento! Per valori di h grandi, l’errore di discretizzazione descresce al diminuire di h e domina sull’errore di arrotondamento. Ma quando l’errore di discretizzazione diventa molto piccolo, per valori di h minori di 10−8 , allora l’errore di arrotondamento inizia a dominare e ad aumentare sempre più al diminuire di h. Questo è un motivo per cui si deve cercare di far prevalere l’errore di discretizzazione in un procedimento numerico. Nell’errore di arrotondamento, per h via via più piccoli, si verifica un errore di cancellazione: f ( x0 + h) è praticamente uguale a f ( x0 ) per h molto piccoli! per cui l’errore che

Figura 4.4: In alto: errore di discretizzazione ed effettivo ( f 0 ( x0 ) ≈

f ( x0 + h ) − f ( x0 ) ). h

In basso: errori di discretizzazione, di arrotondamento, ed errore effettivo (con f 0 ( x0 ) ≈

f ( x0 + h ) − f ( x0 ) ), ed errore dalla forh mula trigonometrica per cui sin ( x0 + h) − sin ( x0 ) = 2 cos (2x0 + h/2) sin (h/2). I grafici sono in scala logaritmica.

appunti di calcolo numerico

43

calcoliamo è | f 0 ( x0 ) − 0| = f 0 ( x0 ) = 0.3623577544.... Una strategia per evitare la cancellazione è di scrivere diversamente la differenza f ( x0 + h) − f ( x0 ). Nel caso di f ( x ) = sin ( x ) ricorriamo alla formula φ+ψ φ−ψ trigonometrica per cui sin (φ) − sin (ψ) = 2 cos ( ) sin ( ). 2 2 Vediamo come migliorano le cose inserendo nel grafico 4.4 anche la curva dell’errore che otteniamo utilizzando questa espressione trigonometrica. L’errore continua a diminuire anche quando la formula precedente dà un errore crescente. Sempre in Figura 4.4, e in riferimento alla formula “non buona”, abbiamo considerato la curva dell’errore di arrotondamento in modo da confrontare l’andamento effettivo dell’errore con un limite superiore "teorico" dell’errore computazionale totale dato dalla somme degli errori di discretizzazione e di arrotondamento. La rappresentazione di f ( x ) è affetta da errore per cui avremo: f ( x ) = f ∗ ( x ) + ex . L’errore di arrotondamento è e x + h − e x0 f ( x0 + h ) − f ( x0 ) f ∗ ( x0 + h ) − f ∗ ( x0 ) = + 0 . Maggioranh h h do ex con la precisione di macchina e, l’errore di arrotondamento è dato da 2e/h: per h piccoli è l’errore che predomina! _

4.8

4.8.1

Instabilità e malcondizionamento

Instabilità

In generale è impossibile evitare un accumulo lineare degli errori di arrotondamento durante un calcolo, ed è accettabile che ci sia una crescita lineare moderata, del tipo En ≈ c0 nE0 dove En misura l’errore in valore assoluto dell’n-sima operazione dell’algoritmo e c0 rappresenta una costante non molto grande. Se invece avviene una crescita di tipo esponenziale En ≈ c1n E0 con c1 > 1, allora l’algoritmo è instabile. Algoritmi del genere devono essere evitati! Definizione 4.8.1 Un procedimento numerico si dice instabile se gli errori che vi sono associati non rimangono limitati ma crescono fino a distruggere completamente la soluzione. Esempio Consideriamo l’integrale yn =

Z 1 0

xn dx x + 10

per valori di n = 1, 2, . . . , 30. Osserviamo che, poichè x ∈ [0, 1], la funzione integranda varia pure essa nell’intervallo [0, 1] per cui 0 < yn < 1.

Per algoritmo intendiamo un procedimento di calcolo. In particolare, un algoritmo è una sequenza di passi che permettono di risolvere tutto o parte di un problema. Per curiosità, la parola algoritmo è entrata in uso negli anni ’50 in sostituzione di algorismo, termine con cui si indicava il processo di calcolo utilizzando i numeri arabi. Il termine algoritmo deriva dal nome di “al-Khwarizmi”, importante matematico arabo del nono secolo grazie al quale l’Europa imparò ad usare i numeri arabi, oltre alla notazione in base 10. Le procedure che permettevano di effettuare calcoli in notazione decimale presero il nome di algorismi o algoritmi. Nel medioevo (e forse anche per qualche studente di oggi!!!), si pensava che algoritmo derivasse dal greco algiros (panico, dolore) e arithmos (numero)!

44

annamaria mazzia

Analiticamente, si ha: yn + 10yn−1 =

Z 1 n x + 10x n−1 0

x + 10

dx =

Z 1 n −1 x ( x + 10) 0

x + 10

dx =

Z 1 0

x n−1 dx =

1 n

Vale anche la relazione y0 =

Z 1 0

1 dx = ln (11) − ln (10). x + 10

Possiamo pensare, quindi, di calcolare numericamente il valore di yn attraverso il seguente algoritmo: 1. valutare y0 = ln (11) − ln (10) 2. per n = 1, 2, . . . , 30 valutare yn =

1 − 10yn−1 n

Questa formula ricorsiva darebbe l’esatto valore se non fossero presenti errori di arrotondamento che ci allontanano completamente dalla soluzione vera. L’errore si moltiplica esponenzialmente. Infatti y1 = 1 − 10y0 1 1 − 10(1 − 10y0 ) = − 10 + (−10)2 y0 2 2 1 1 2 y3 = − 10( − 10 + 10 y0 ) = −103 y0 + costante 3 2 .. .. . . y2 =

yn = (−10)n y0 + costanten L’errore che si commette applicando questo algoritmo (tenendo conto che noi non avremo i valori yn esatti ma dei valori approssimati y∗n , dovuti all’arrotondamento) sarà del tipo yn − y∗n ≈ (−10)n (y0 − y0∗ ) cioè En ≈ (−10)n E0 . L’algoritmo, quindi, presenta un errore En con crescita di tipo esponenziale. Difatti, numericamente, otteniamo valori che via via si allontanano dall’intervallo di ammissibilità [0, 1]. I risultati che ricaviamo sono riportati nelle tabelle a lato (osserviamo che sono leggermente diversi a seconda dal linguaggio usato, proprio per effetto dell’instabilità). 1 1 Se invece, consideriamo yn−1 = ( − yn ), partendo da un valore 10 n di n molto grande e andando a ritroso, l’errore diminuisce. Infatti: y n0 = 0 1 1 10 n0 1 1 1 1 1 y n0 −2 = ( − )= + costante 10 n0 − 1 10 n0 (−10)2 n0 .. .. . . y n0 −1 =

yn =

1 + costanten0 −n (−10)n0 −n n0

L’errore al passo n dipende, quindi, (in valore assoluto) da

1 10n0 −n

(dal momento che n0 − n > 0, l’errore decresce per n che tende a

Da un programma in Fortran:

n

yn

0 1 2 3 4 ... 7 8 9 10 18 27 30

9.5310e-2 4.6898e-2 3.1021e-2 2.3122e-2 1.8778e-2 .... -3.0229e-1 3.1479e+0 -3.1368e+1 3.1378e+2 3.1377e+10 -3.1377e+19 3.1377e+22

Da un programma Matlab:

n

yn

0 1 2 3 4 ... 7 8 9 10 18 27 30

9.5310e-2 4.6898e-2 3.1018e-2 2.3154e-2 1.8465e-2 .... 1.1481-2 1.0194e-2 9.1673e-3 8.3270e-3 -9.1694e+1 -9.1699e+9 -9.1699e+13

appunti di calcolo numerico

zero). Perciò, dato un valore di accuratezza e > 0 e fissato un intero n1 è possibile determinare l’intero n0 tale che, partendo da yn0 = 0 e andando a ritroso, gli integrali yn saranno valutati con un errore in valore assoluto minore di e per 0 < n ≤ n1 . Se richiediamo una tolleranza e = 10−6 , e fissiamo un valore n1 , per calcolare n0 dovrà essere 1 10n0 −n1

< e cioè 10n1 −n0 < e

Passando al logaritmo in base 10: n1 − n0 < log e =⇒ n0 > n1 − log e Fissato n1 = 20 si ricava n0 = 26. Questa volta i calcoli danno gli stessi risultati sia in Matlab sia in Fortran: n 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12

yn 0.000000 3.84615e-3 3.61538e-3 3.80513e-3 3.96731e-3 4.14872e-3 4.34703e-3 4.56530e-3 4.80663e-3 5.07489e-3 5.37486e-3 5.71251e-3 6.09542e-3 6.53332e-3 7.03898e-3

n 11 10 9 8 7 6 5 4 3 2 1 0

yn 7.62944e-3 8.32797e-3 9.16720e-3 1.01944e-2 1.14806e-2 1.31377e-2 1.53529e-2 1.84647e-2 2.31535e-2 3.10180e-2 4.68982e-2 9.53102e-2

Osserviamo come il valore y0 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 di sapere la grandezza dell’errore che si commette nell’algoritmo stesso; efficiente in termini di velocità di esecuzione e di richiesta di spazio di memoria per le variabili utilizzate; robusto nel dare il risultato corretto entro un livello di tolleranza dell’errore che sia accettabile.

4.8.2

Malcondizionamento

Definizione 4.8.2 Un problema si dice malcondizionato se a piccole variazioni nei dati di input del problema corrispondono forti variazioni nei dati di output.

45

46

annamaria mazzia

Quando il problema è molto sensibile alle variazioni dei dati di input, producendo risultati molto diversi tra loro, allora nessun algoritmo, per quanto robusto e stabile, potrà dare una soluzione robusta al problema stesso. Esempio Il problema del calcolo delle radici di un polinomio p( x ) di grado n è un esempio di problema malcondizionato. Sia p( x ) = a0 + a1 x + a2 x2 + . . . + an x n . I dati di input del problema sono i coefficienti a0 , a1 , . . . , an . I dati di output sono le radici del polinomio. Si può provare che a piccole variazioni sui dati iniziali, corrispondono grandi variazioni sui risultati. Vediamo il caso del polinomio p( x ) = ( x − 1)( x − 2) · · · ( x − 10). Chiaramente, tale polinomio ha radici 1, 2, . . . , 10. Se perturbiamo il polinomio variando il coefficiente a9 del valore di 0.00001, considerando quindi il polinomio p( x ) + 0.00001x9 , le radici corrispondenti si discostano di poco da quelle del polinomio di partenza, come si può notare in Figura 4.5. Ma se variamo il coefficiente a9 del valore 0.0001, considerando cioè il polinomio p( x ) + 0.0001x9 allora le radici corrispondenti a x7 , x8 , x9 , x10 non saranno più reali ma avranno anche una parte immaginaria. La piccola variazione sui dati di ingresso, quindi, provoca una grande variazione sui dati in uscita, proprio perchè il problema è malcondizionato. _ Una quantità che misura il grado di sensibilità di un problema – fornendoci indicazioni sul fatto che a piccole variazioni sui dati di ingresso del problema ci possono essere piccole o grandi variazioni sui dati di uscita – si chiama indice di condizionamento (o numero di condizionamento) 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 di uscita del problema f . Vogliamo vedere cosa succede se il dato di ingresso non è più x ma x + ∆x. ∆x rappresenta quindi una perturbazione sul dato iniziale. Assumiamo x 6= 0, y 6= 0. Applichiamo la formula di Taylor di centro x. Si ha:

Figura 4.5: Esempio: malcondizionamento

f ( x + ∆x ) = f ( x ) + f 0 ( x )∆x + O(∆x2 ) ≈ f ( x ) + f 0 ( x )∆x La variazione sul dato d’uscita è data dalla differenza f ( x + ∆x ) − f ( x ). Chiamiamo questa differenza con ∆y. Quindi ∆y = f ( x + ∆x ) − f ( x ) ≈ f 0 ( x )∆x (utilizziamo il risultato ottenuto dalla formula di Taylor). Se utilizziamo gli errori relativi, abbiamo (e sapendo che y = f ( x )): ∆y f 0 ( x )∆x ≈ y f (x) Moltiplicando numeratore e denominatore a secondo membro per x si ricava ∆y x f 0 ( x ) ∆x ≈ y f (x) x

Come esempio, consideriamo f ( x ) = x1/α , con x > 0 e α > 0. Calcoliamo l’indice di condizionamento applicando la formula (poichè abbiamo supposto x > 0, si ha f ( x ) 6= 0). Risulta

0 1 1/α−1 x f ( x ) x α x 1 = (cond f )( x ) = = f ( x ) x1/α α Per α grande, (cond f )( x ) tende a zero, quindi abbiamo un problema bencondizionato. Se, invece α è molto piccolo si ha un problema malcondizionato (se α = 10−10 , si 10

ha f ( x ) = x10 e (cond f )( x ) = 1010 , un valore molto grande).

appunti di calcolo numerico

Al limite per ∆x → 0, questa uguaglianza approssimata (abbiamo usato il simbolo ≈) diventa una vera uguaglianza. Questo suggerisce di definire l’indice di condizionamento di f mediante la formula 0 x f (x) (cond f )( x ) = f (x) Questo numero ci dice quanto grandi sono le perturbazioni relative per y confrontate con le relative perturbazioni di x. ∆x Per x = 0 e y 6= 0, non ha senso considerare l’errore relativo ,e x si considera l’errore assoluto su x. In tal caso, si definisce indice di condizionamento la quantità 0 f (x) (cond f )( x ) = f (x) Per x = y = 0 si considera invece l’errore assoluto sia per x che per y, dimodochè l’indice di condizionamento diventa

(cond f )( x ) = | f 0 ( x )|

4.9

Domande di riepilogo

1. Spiegare, con degli esempi, il passaggio dalla base 2 alla base 10 e dalla base 10 alla base 2. 2. In che modo vengono rappresentati i numeri in virgola mobile normalizzata, nello standard IEEE? Che cosa rappresenta il bias? 3. Cosa significa fenomeno di cancellazione numerica? Spiegare e fornire un esempio. 4. Definire un algoritmo stabile e fare un esempio mostrando un algoritmo stabile e uno instabile. 5. Cosa vuol dire che un problema è malcondizionato? Dare un esempio. 6. Come è definito l’indice di condizionamento di una funzione f ?

47

5 Zeri di funzione 5.1

Partiamo da alcuni problemi...

Nel progettare una pompa centrifuga, o turbopompa, occorre tener presenti diversi elementi. Ne elenchiamo solo alcuni:

x

il rendimento della macchina (maggiore è il rendimento più competitiva è la macchina);

x

il dimensionamento dell’albero e del mozzo, che dovrà garantire una rigidezza torsionale sufficiente per permettere una trasmissione di energia in totale sicurezza;

Non so come il mondo potrà giudicarmi ma a me sembra soltanto di essere un bambino che gioca sulla spiaggia, e di essermi divertito a trovare ogni tanto un sasso o una conchiglia più bella del solito, mentre l’oceano della verità giaceva insondato davanti a me. Isaac Newton Non entriamo nei dettagli: questo problema sarà affrontato con la dovuta competenza in uno dei corsi del terzo anno di Ingegneria dell’Energia, con indirizzo elettrico. L’esempio vuole mostrare come il Calcolo Numerico possa essere di aiuto per risolvere problemi pratici e specifici dell’Ingegneria.

x

il dimensionamento della bocca di aspirazione, in modo da ottimizzare il comportamento a cavitazione e per rendere massimo il suo rendimento.

Considerando più in dettaglio quest’ultimo punto e indicando con D0 il diametro della bocca di aspirazione, per rendere massimo il suo rendimento, occorre calcolare il valore di D0 che rende minima la velocità relativa (che chiamiamo w2 ) in ingresso, perchè limitare l’energia cinetica nella sezione di ingresso vuol dire limitare le perdite. La velocità w2 si può scrivere come s ω 2 D02 24 Q2 k2m + w2 = 4 πηv2 ξ 22 ( D02 − D2M )2 dove Q è la portata volumetrica della pompa, k m è un numero tipico di macchina, ηv rappresenta il rendimento volumetrico, ξ 2 è un coefficiente di ostruzione, D M il diametro del mozzo, ω è la velocità di rotazione. Se è solo D0 la nostra incognita, per rendere minimo w2 dobbiamo fare la derivata di w2 rispetto a D0 e cercare il valore di D0 che rende nulla tale derivata: in tal modo troviamo il valore di D0 che rende minima la velocità. Si dovrà risolvere la seguente equazione: " # Q2 1 k2m 7 D0 = 2 · 2 2 · 2 2 · " #2 π ω ηv ξ 2 D2M 1− 2 D0 Osserviamo come a destra del segno di uguaglianza abbiamo una funzione complicata e non è possibile trovare per via analitica quel

Assegnata una funzione, tra i punti che annullano la sua derivata possiamo trovare i punti di massimo e di minimo. In tal caso si trova un solo punto e si può dimostrare che è punto di minimo.

50

annamaria mazzia

valore di D0 che soddisfa l’equazione. Allora in che modo possiamo risolvere il problema? Se chiamiamo con g( D0 ) la funzione complicata che leggiamo nell’equazione precedente, potremo applicare lo schema di punto fisso a tale funzione g, oppure potremo applicare un metodo per trovare quel valore di D0 che annulla la funzione f ( D0 ) = g( D0 ) − D0 . Consideriamo ora un’altro problema, quello di calcolare la radice quadrata di un numero. Già gli antichi Babilonesi, intorno al 1700 √ a.C., avevano trovato la soluzione: per calcolare b, partivano da un certo valore x che si avvicinava alla soluzione, dividevano b per questo numero, e facevano poi la media, iterando il procedimento. L’algoritmo si può schematizzare nel modo seguente: √ partire da x0 prossimo a b;

x x considerare x x

1

=

1 b ( x0 + ); 2 x0

generalizzando: xn+1 =

1 b ( x n + ). 2 xn

Il metodo usato dai Babilonesi non è altro che il metodo di NewtonRaphson (che vedremo più avanti) per trovare gli zeri della funzione f ( x ) = x2 − b. Abbiamo visto ora due esempi, uno specifico dell’Ingegneria e uno tipico della Matematica, in cui dobbiamo risolvere un’equazione del tipo g( x ) = x o f ( x ) = 0. Siamo pronti per passare allo studio di metodi numerici che ci permettano di risolvere questi due tipi di equazioni.

5.2

Per √

calcolare sapendo che il valore che dobbiamo approssimare è compreso tra 1 e 2, possiamo partire da x0 = 1.5, ottenendo:

2

esempio,



per

1.41421356237310,

x0 = 1.5

2 ) = 1.41666667 1.5 2 1 ) = 1.41421569 x2 = 2 (1.41666667 + 1.41666667 2 x3 = 12 (1.41421569 + ) = 1.41421356 1.41421569 x1 = 21 (1.5 +

Metodo delle Bisezioni

Sia data una funzione f continua in un intervallo [ a, b], con f ( a) e f (b) che assumono valori di segno opposto. Allora, per il teorema del Valore Intermedio (si veda il Teorema 3.6.3 con K = 0), esiste almeno un punto ξ ∈] a, b[ tale che f (ξ ) = 0. Assumiamo, per semplicità che ci sia una sola radice ξ nell’intervallo ] a, b[. Il metodo delle bisezioni (detto anche metodo dicotomico) si chiama così perchè, ad ogni passo, viene dimezzato l’intervallo precedente, cercando in tal modo di racchiudere la radice ξ in sottointervalli sempre più piccoli.

x

Si pone a0 = a e b0 = b. Si prende il punto medio dell’intervallo a + b0 . [ a0 , b0 ], c0 = 0 2

x

Se f (c0 ) = 0 allora abbiamo trovato la radice dell’equazione, altrimenti si va a controllare il segno di f (c0 ). – Se f (c0 ) e f ( a0 ) hanno lo stesso segno, allora ξ si trova nell’intervallo ]c0 , b0 [ (applicando di nuovo il teorema del Valore Intermedio). In tal caso porremo a1 = c0 e b1 = b0 .

Nel caso ci sia più di una radice, la procedura che ora descriviamo vale sempre, e ci permette di calcolare una di queste radici.

appunti di calcolo numerico

– Se, invece, f (c0 ) e f (b0 ) hanno lo stesso segno, allora ξ si trova nell’intervallo ] a0 , c0 [ In tal caso porremo a1 = a0 e b1 = c0 .

x

Riapplichiamo questa procedura appena descritta sul sottointervallo [ a1 , b1 ]

x

Fermiamo il procedimento ad una certa iterazione n, se f (cn ) = 0 o se l’ampiezza del sottointervallo è sufficientemente piccola, cioè bn − a n ≤ tol dove tol è una certa tolleranza prefissata. In tal caso 2 assumiamo cn come approssimazione della radice ξ.

Osserviamo che, ad ogni passo, viene dimezzato l’intervallo in cui si trova la radice ξ, da cui

|ξ − cn | ≤

b−a . 2n +1

Da questa relazione, si può determinare il numero di iterazioni n necessarie per calcolare un’approssimazione della radice ξ entro una certa tolleranza tol richiesta. Infatti b−a ≤ tol =⇒ |ξ − cn | ≤ tol 2n +1 Ma b−a 2tol log(2) 

b−a b−a ≤ tol ⇐⇒ 2n ≥ =⇒ n ≥ 2tol 2n +1



log

.

L’algoritmo di bisezione può essere descritto sotto forma di pseudocodice. Se il metodo non converge (perchè, ad esempio, la funzione che abbiamo scelto non assume segno opposto agli estremi dell’intervallo), il procedimento iterativo potrebbe entrare in stallo (pensiamo ad un programma da fare eseguire al calcolatore) e quindi conviene introdurre un numero massimo di iterazioni, che viene indicato con itmax. Si intende che il metodo converge quando l’ampiezza del nuovo intervallo diventa minore di una tolleranza tol prefissata.

Figura 5.1: Metodo delle Bisezioni

51

52

1

2 3 4 5 6 7 8 9 10 11 12 13

Dati di input: a, b, tol, itmax Dati di output: soluzione approssimata c o messaggio di fallimento verificare che f ( a) f (b) < 0, altrimenti non si può implementare il metodo ; n ←− 1 ; c ←− ( a + b)/2 ; ampiezza intervallo ←− |b − a|/2 ; Fintantochè n ≤ itmax e ( f (c) 6= 0 e ampiezza intervallo > tol) n ←− n + 1 (incrementa n) ; Se f ( a) f (c) > 0 allora a ←− c altrimenti b ←− c Fine-Se aggiorna c ; aggiorna ampiezza intervallo ;

19

Fine-Fintantochè Se f (c) = 0 o ampiezza intervallo ≤ tol allora c è la soluzione approssimata altrimenti n > itmax ; il metodo è fallito dopo itmax iterazioni ;

20

Fine-Se

14 15 16 17 18

5.3

annamaria mazzia

Metodo del Punto Fisso

Il problema f ( x ) = 0 può essere reso equivalente alla ricerca del punto fisso di una opportuna funzione g (vale a dire del problema g( x ) = x).

 x 2

− sin ( x ) = 2 0, aggiungendo ad ambo i membri x, ottenia x 2 mo − sin ( x ) + x = x. Se poniamo 2   x 2 g( x ) = − sin ( x ) + x, le radici della 2 f coincidono con i punti fissi della g. Un esempio. Da f ( x ) =

Definizione 5.3.1 Data una funzione g, si definisce punto fisso della g, quel punto ξ che soddisfa la relazione g(ξ ) = ξ Una funzione può ammettere uno o più punti fissi o non ammetterne affatto. Un modo per calcolare un punto fisso di una funzione g è dato da iterazioni successive sulla funzione g stessa. Figura 5.2: Radici di f ( x ) =

Esempio Supponiamo che la funzione g sia g( x ) = cos ( x ). Prendiamo come valore iniziale x0 = 1. Con una calcolatrice, andiamo a calcolare (in modalità radianti!) il suo coseno: ricaviamo x1 = cos ( x0 ) = g( x0 ) = 0.54030230. Successivamente, calcoliamo il coseno di x1 , ottenendo x2 = cos ( x1 ) = 0.857553216. Osserviamo che x2 = cos ( x1 ) = cos (cos ( x0 )) e non cos2 ( x0 )! Abbiamo innescato, in questo modo, un procedimento iterativo per cui xn+1 = cos ( xn ) = g( xn ). Con

sin ( x ).

Figura 5.3: Punti fissi di g( x ) =

sin ( x ) + x.

 x 2 2

 x 2 2





appunti di calcolo numerico

la calcolatrice, basta digitare sulla funzione cos ogni volta in modo da avere i nuovi valori della successione xn+1 . I primi numeri che otteniamo non sono molto importanti. Quelli importanti sono quelli che si hanno dopo 15, 30 o 100 passi. Nel nostro caso, abbiamo i valori riportati nella Tabella a lato. Perchè i valori di x tendono a 0.7390851332? Cosa ha di speciale questo numero? Il valore 0.7390851332 è un punto fisso per la funzione cos ( x ). _

n

xn

5 11 13 14 15 29 30 56 57 58

0.7013687746 0.7356047404 0.7414250866 0.7375068905 0.7401473356 0.7390893414 0.7390822985 0.7390851333 0.7390851332 0.7390851332

53

Esempio Consideriamo la funzione g( x ) =

1 x + 2. Partendo da x0 = 0 si ha 2

n xn 1 x1 = 12 · 0 + 2 = 2 2 x2 = 12 · 2 + 2 = 3 3 x3 = 12 · 3 + 2 = 3.5 4 x4 = 12 · 3.5 + 2 = 3.75 5 x5 = 12 · 3.75 + 2 = 3.875 6 x6 = 21 · 3.875 + 2 = 3.9375 I numeri 2, 3, 3.5, 3.75, 3.875, 3.9375 sembrano avvicinarsi a ξ = 4. Difatti, per valori crescenti di n, per xn che tende a ξ, si ha, da 1 1 una parte ξ = limn→∞ xn+1 = limn→∞ xn + 2 = ξ + 2 da cui, 2 2 1 ξ = ξ + 2, cioè ξ = 4. 2 _ Scopriamo quindi che se l’iterazione xn+1 = g( xn ) converge a ξ, ξ è punto fisso per la funzione g. Da un punto di vista geometrico, i grafici di y = x (bisettrice del primo e terzo quadrante) e di y = g( x ) si intersecano in ξ. Tuttavia, non sempre questo schema iterativo, applicato a funzioni che ammettono uno o più punti fissi, converge. Vediamo con un esempio. Esempio Sia g( x ) = x2 . Analiticamente troviamo due punti fissi per questa funzione. Dovendo essere ξ = ξ 2 , si ricava ξ 2 − ξ = 0, vale a dire ξ (ξ − 1) = 0: quindi ξ = 0 e ξ = 1 sono i due punti fissi per questa funzione. Partendo da x0 = 0.5, si ha la successione di valori 0.25, 0.0625, 0.00390625, rapidamente il metodo converge a ξ = 0 Se si prende come punto iniziale un valore x0 ∈] − 1, 1[, la successione converge a ξ = 0. Le sole successioni che convergono a ξ = 1 sono le ovvie successioni generate da x0 = ±1. Se si prende come punto iniziale x0 tale che | x0 | > 1 allora lo schema iterativo xn+1 = xn2 diverge a +∞. Partendo da x0 = 2, si ha 4, 16, 256, 65536... _ Questo esempio è significativo per capire come ciascun punto fisso ξ abbia un proprio bacino di attrazione: se si prende x0 in questo bacino,

Figura 5.4: Punto fisso di g( x ) = 1/2x + 2.

Figura 5.5: Punti fissi di g( x ) = x2 .

54

annamaria mazzia

allora i valori xn tendono a ξ. Un punto fisso può dunque attirare o respingere i valori xn prodotti dallo schema iterativo. Prima di passare a studiare quando lo schema di punto fisso converge, ricordiamo che una funzione può ammettere più di un punto fisso, ammetterne uno solo o non ammetterne affatto. Ci sono due teoremi (3.6.4 e 3.6.5) che ci dicono quando una funzione può ammettere punti fissi. Il primo assicura l’esistenza di almeno un punto fisso (ciò vuol dire che vi possono essere più punti fissi) quando la funzione g, definita e continua in [ a, b], è tale che a ≤ g( x ) ≤ b per ogni x ∈ [ a, b]. Il secondo teorema aggiunge, a queste ipotesi, quelle che g sia di classe C1 e, inoltre, | g0 ( x )| ≤ m < 1 per ogni x ∈ [ a, b]: in tal caso esiste un unico punto fisso. Possiamo ora provare un teorema di convergenza per lo schema iterativo del punto fisso. Teorema 5.3.1 A partire da un punto iniziale x0 , lo schema iterativo xn+1 = g( xn ) converge al punto fisso ξ di g se | g0 ( x )| < 1 in un intorno di ξ. Dimostrazione.

È importante osservare che, data una funzione che ammette punto fisso, le ipotesi dei due teoremi 3.6.4 e 3.6.5 possono essere rilassate dall’intervallo [ a, b] ad un intorno del punto fisso.

Dalle relazioni

ξ = g(ξ ) x n +1 = g ( x n ) sottraendo membro a membro e, applicando il teorema del Valore Medio 3.6.2 (con ξ n un opportuno punto del segmento che congiunge ξ a xn ), otteniamo: ξ − xn+1 = g(ξ ) − g( xn ) = g0 (ξ n )(ξ − xn ) Possiamo scrivere questa relazione per n = 0, 1, . . . ottenendo ξ − x1 = g0 (ξ 0 )(ξ − x0 ) ξ − x2 = g0 (ξ 1 )(ξ − x1 ) ξ − x3 = g0 (ξ 2 )(ξ − x2 ) .. .. .=. ξ − xn = g0 (ξ n−1 )(ξ − xn−1 ) Moltiplicando, ora, membro a membro e prendendo i valori assoluti, abbiamo:

| ξ − x1 | · | ξ − x2 | · . . . · | ξ − x n | = | g0 (ξ 0 )| · | g0 (ξ 1 )| · | g0 (ξ 2 )| · . . . · | g0 (ξ n−1 )| · |ξ − x0 | · |ξ − x1 | · . . . · |ξ − xn−1 | La relazione appena trovata può essere semplificata, dividendo ambo i membri per |ξ − x1 | · |ξ − x2 | · . . . · |ξ − xn−1 | ottenendo:

|ξ − xn | = | g0 (ξ 0 )| · | g0 (ξ 1 )| · | g0 (ξ 2 )| · · . . . · | g0 (ξ n−1 )||ξ − x0 | Assumiamo, ora che | g0 ( xi )| ≤ m per i = 0, 1, . . . , n − 1. Abbiamo dunque una relazione che lega l’errore assoluto al passo n con l’errore assoluto iniziale.

| ξ − x n | ≤ m n | ξ − x0 |

appunti di calcolo numerico

55

Perchè il metodo converga, l’errore deve tendere a zero per n che tende all’infinito. Se m < 1 è assicurata la convergenza (quindi, se in un intorno del punto fisso, la derivata prima è minore di 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ò dire a priori, ma bisogna vedere caso per caso cosa succede nell’intorno del punto fisso. 4 Negli esempi precedenti: g( x ) cos ( x ) 1 x+2 2 2 x

g0 ( x ) − sin ( x ) 1 2 2x

Nel primo caso (con g( x ) = cos ( x )) si ha − sin (0.7390851332) = −0.673612, perciò in un intorno del punto fisso la derivata è minore di 1 in valore assoluto e si ha convergenza. 1 1 Nell’esempio in cui g( x ) = x + 2, risulta g0 ( x ) = qualunque 2 2 sia x: si ha convergenza. Nel terzo caso (g( x ) = x2 ), g0 ( x ) = 2x da cui g0 (0) = 0 e g0 (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 di attrazione si ha quindi se vale m < 1. Da un punto di vista grafico, le iterazioni dello schema di punto fisso si possono vedere sotto forma di ragnatela. Le iterazioni, infatti, si muovono avanti e indietro tra il grafico della y = g( x ) e il grafico della bisettrice y = x. L’esempio con g( x ) = cos ( x ), è rappresentato in Figura 5.6 : partendo da ( x0 , x0 ) sulla retta y = x, applicando l’algoritmo si ha x1 = g( x0 ). Perciò:

Figura 5.6: Il metodo di punto fisso con g( x ) = cos ( x ).

Figura 5.7: Il metodo di punto fisso con e

g( x ) =

1 x+2 2

x

da ( x0 , x0 ) si va su o giù fino a raggiungere ( x0 , x1 ) sulla curva g;

x

da ( x0 , x1 ) si arriva a ( x1 , x1 ) sulla bisettrice y = x.

Questi due passi vengono ripetuti per tutte le altre iterazioni. Da x1 si arriva sulla curva a g( x1 ). Ora l’altezza è x2 . Da qui si va sulla bisettrice al punto ( x2 , x2 ). E così via. Lo scopo delle iterazioni, infatti, è di arrivare al punto (ξ, ξ ) ≈ 0.7390851332 che è il punto di intersezione tra il grafico di g e la bisettrice y = x. Osserviamo che, per questo esempio, i valori della successione si avvicinano a ξ muovendosi a destra e a sinistra rispetto ad esso. Si parla di convergenza oscillante. 1 Nell’esempio con g( x ) = x + 2, si devono intersecare due linee 2 rette. Notiamo, anche dalla Figura 5.7, che i valori delle iterazioni si trovano tutti da un lato rispetto al punto fisso: si parla di convergenza monotona. In generale, quando 0 ≤ g0 ( x ) < 1 in un intorno del punto fisso, si ha convergenza monotona. Se, invece, −1 < g0 ( x ) < 0 in un intorno del punto fisso, si ha convergenza oscillante.

Figura 5.8: Il metodo di punto fisso: esempio con g( x ) = x2 . Si noti la convergenza monotona a ξ = 0 (in alto) e la divergenza monotona da ξ = 1 (in basso)

56

annamaria mazzia

Analogamente, in Figura 5.8, si possono ritrovare le conclusioni già viste dell’esempio in cui g( x ) = x2 : si ha convergenza monotona verso ξ = 0 partendo da un punto iniziale in valore assoluto minore di uno, e divergenza monotona a infinito, partendo da | x0 | > 1. Esempio Consideriamo ora g( x ) = x − sin ( x ) nell’intervallo [0, 2π ]. Data la periodicità della funzione seno, g ammette più di un punto fisso. Infatti da ξ = ξ − sin (ξ ) si ha 0 = sin (ξ ) da cui ξ = 0, ξ = π e ξ = 2π. Studiamo ora la derivata prima g0 ( x ) = 1 − cos ( x ). Si ha g0 (0) = 1 − 1 = 0, g0 (π ) = 1 − (−1) = 2 e g0 (2π ) = 1 − 1 = 0. Da queste informazioni, deduciamo che qualunque sia il punto iniziale x0 la successione generata dallo schema del punto fisso non potrà mai convergere a π, come si vede anche dalla Figura 5.9. _ Nel caso in cui il metodo di punto fisso converge, si possono ricavare maggiorazioni per l’errore che si commette approssimando ξ mediante xn . Vale infatti la disuguaglianza

|ξ − xn | ≤

m | x n − x n −1 | 1−m

Figura 5.9: Il metodo di punto fisso: esempio con g( x ) = x − sin ( x ). ξ = 0 e ξ = 2π sono punti fissi attrattivi, al contrario di ξ = π in cui g0 (ξ ) = g0 (π ) = 2

(5.1)

dove m, come prima, è una maggiorazione di | g0 ( x )|. Dimostrazione della relazione precedente. Proviamo questo risultato, scrivendo l’errore all’iterazione n come ξ − xn = g(ξ ) − g( xn−1 ) Applicando il teorema del valor medio e considerando, come prima, 0 | g ( x )| ≤ m < 1 in un intorno del punto fisso, si ha:

| ξ − x n | ≤ m | ξ − x n −1 |

(5.2)

Possiamo scrivere ξ − xn−1 nel modo seguente aggiungendo e sottraendo xn : ξ − 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)|ξ − xn−1 | ≤ | xn − xn−1 | 1 | ξ − x n −1 | ≤ | x n − x n −1 | 1−m Andando a sostituire questa maggiorazione nella disuguaglianza (5.2), troviamo il risultato espresso nell’equazione (5.1). Errore e scarto. La disuguaglianza (5.1) fornisce una maggiorazione dell’errore al passo n tramite il valore assoluto della differenza tra due iterazioni successive | xn − xn−1 |. Quest’ultima quantità prende il nome di scarto e viene indicata con il simbolo dn . Generalmente, per vedere se il metodo di punto fisso converge al punto fisso entro una certa tolleranza prestabilita, il controllo da fare è proprio sullo scarto dn . Sfruttiamo questo fatto per vedere come

dn = | xn − xn−1 | rappresenta lo scarto all’iterazione n.

appunti di calcolo numerico

57

implementare l’algoritmo dello schema di punto fisso (sotto forma di pseudo-codice): Dati di input: x0 , tol, itmax Dati di output: xn soluzione approssimata o messaggio di fallimento 1 n ←− 0 contatore delle iterazioni; 2 d n ←− 2tol (una quantità iniziale > tol) ; 3 Fintantochè n ≤ itmax e d n > tol 4 incrementa n di 1; 5 applicare l’algoritmo di punto fisso xn = g( xn−1 ) ; 6 aggiorna dn ;

12

Fine-Fintantochè Se dn ≤ tol allora xn è la soluzione approssimata altrimenti n > itmax ; il metodo è fallito dopo itmax iterazioni ;

13

Fine-Se

7 8 9 10 11

5.4

Il Metodo di Newton-Raphson

Il metodo di Newton-Raphson è uno dei metodi più potenti e più famosi per risolvere equazioni non lineari. Ci sono diversi approcci per introdurre questo metodo – tra questi c’è anche quello di vedere il metodo di Newton-Raphson come un particolare schema di punto fisso, come vedremo in seguito. Supponiamo ora che la derivata prima e seconda di f esistano e siano continue e assumiamo che la derivata prima f 0 sia valutabile con sufficiente facilità. Lo schema di Newton-Raphson è uno schema iterativo che produce una successione di approssimazioni x0 , x1 , . . . , xn della radice della funzione f . Sia xn l’iterata corrente. Applicando la formula di Taylor di centro xn si ha: f ( x ) = f ( xn ) + f 0 ( xn )( x − xn ) + f 00 (ξ x )( x − xn )2 /2 dove ξ x è un punto (che non conosciamo) compreso tra x e xn . Sia x = ξ, dove ξ è radice di f , f (ξ ) = 0. Se f fosse lineare, avremmo f 00 ≡ 0 e quindi potremmo trovare la radice risolvendo direttamente

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 a x3 − 2x − 5 = 0). Il metodo di Newton fu pubblicato per la prima volta nel 1685. Nel 1690 Joseph Raphson ne pubblicò una descrizione semplificata in termini di approssimazioni successive xn piuttosto che di sequenze di polinomi. Fu solo nel 1740 che Thomas Simpson descrisse il metodo di Newton come un metodo iterativo per risolvere equazioni non lineari (e non solo polinomi) e diede una versione generalizzata per sistemi di due equazioni. Isaac Newton (1643-1727), inglese, fu fisico, matematico, astronomo, alchimista, inventore, filosofo naturalista. È visto come uno dei più grandi scienzati nella storia dell’umanità. Su Joseph Raphson (1648-1715) non si hanno molti dettagli. Pare che Newton stesso gli permettesse di vedere e studiare i suoi scritti matematici. Il suo lavoro del 1690 "Analysis aequationum universalis" gli valse l’ingresso nella Royal Society, nel 1691 benchè fosse uno studente (si laureò nel 1692) piuttosto anziano (aveva 43 anni).

0 = f (ξ ) = f ( xn ) + f 0 ( xn )(ξ − xn ) Supponendo f 0 ( xn ) 6= 0, otterremmo, con semplici passaggi, ξ = xn −

f ( xn ) f 0 ( xn )

In questo caso, partendo da un qualunque valore iniziale x0 , in una sola iterazione otterremo il valore della radice ξ.

Osserviamo che

y( x ) = f ( xn ) + f 0 ( xn )( x − xn ) altro non è che l’equazione della retta tangente alla f nel punto ( xn , f ( xn )).

58

annamaria mazzia

Per una funzione non lineare, il discorso da fare è molto simile. La nuova approssimazione xn+1 vogliamo che sia uguale al valore xn più una certa quantità h che ci permetta di arrivare alla soluzione desiderata. Applicando la formula di Taylor di centro xn , deve essere f ( xn+1 ) = f ( xn + h) = f ( xn ) + f 0 ( xn )h + f 00 (ξ h )h2 /2 Vogliamo che sia f ( xn+1 ) = 0, da cui, trascurando il termine in h2 e considerando f 0 ( xn ) 6= 0, ricaviamo h=−

f ( xn ) f 0 ( xn )

Utilizziamo questo valore di h per la nuova approssimazione xn+1 = xn + h ottenendo la formula

x n +1 = x n −

f ( xn ) , f 0 ( xn )

n = 0, 1, 2, . . .

Trascurando il termine f 00 (ξ h ) h2 /2 nella formula di Taylor, abbiamo una linearizzazione della f in un intorno di xn : approssimiamo, cioè la funzione f con la retta tangente a ( xn , f ( xn )). Se ci troviamo vicino ad una radice della f , quindi, ci aspettiamo che il procedimento che stiamo applicando ci avvicini molto rapidamente alla radice stessa!

(5.3)

L’interpretazione geometrica del metodo di Newton è che xn+1 è l’intercetta, sull’asse delle x, della tangente della f a xn (vedi figura 5.10). Figura 5.10: Il metodo di Newton-Raphson applicato alla funzione f ( x ) = ( x/2)2 − sin ( x ) con x0 = 1.3

Lo schema di Newton-Raphson si può vedere come un caso particolare dello schema del punto fisso applicato alla funzione g( x ) = x − f ( x )/ f 0 ( x ). Perchè lo schema del punto fisso converga, deve essere | g0 ( x )| < 1 in un intorno di ξ. Nel caso specifico abbiamo:

| g0 ( x )| = |1 −

f 0 ( x )2 − f ( x ) f 00 ( x ) f ( x ) f 00 ( x ) | = | | f 0 ( x )2 f 0 ( x )2

Supponendo f 0 (ξ ) 6= 0 (che è il caso in cui la radice non è multipla), si ha | g0 (ξ )| = 0, poichè al numeratore f (ξ ) = 0 (essendo ξ radice della f ). Per continuità, allora, vale | g0 ( x )| < 1 in un intorno di ξ.

appunti di calcolo numerico

59

Pertanto il metodo di Newton-Raphson è generalmente convergente. Per vedere come si riduce l’errore via via che le approssimazioni si avvicinano a ξ, consideriamo l’errore cambiato di segno en , per cui xn = ξ + en . Sostituendo in (5.3) abbiamo

Cosa vuol dire quel generalmente? Vuol dire: quasi sempre, tranne alcuni casi particolari (che vedremo in seguito).

f ( ξ + en ) f 0 ( ξ + en ) f ( ξ + en ) = en − 0 f ( ξ + en )

e n +1 + ξ = e n + ξ − e n +1

Applicando la formula polinomiale di Taylor sia su f sia su f 0 di centro ξ, si ha: e n +1 = e n −

f (ξ ) + en f 0 (ξ ) + en2 f 00 (ξ )/2 + . . . f 0 (ξ ) + en f 00 (ξ ) + . . .

Poichè f (ξ ) = 0, raccogliendo i termini si ricava: e n +1 =

en f 0 (ξ ) + en2 f 00 (ξ ) − en f 0 (ξ ) − en2 f 00 (ξ )/2 + . . . en2 f 00 (ξ )/2 + . . . = f 0 (ξ ) + en f 00 (ξ ) + . . . f 0 (ξ ) + en f 00 (ξ ) + . . .

Trascurando i termini en f 00 (ξ ) + . . . al denominatore e le potenze maggiori o uguali a en3 al numeratore si trova: e n +1 =

f 00 (ξ ) 2 e = Aen2 2 f 0 (ξ ) n

ponendo A =

f 00 (ξ ) . 2 f 0 (ξ )

L’ultima relazione che abbiamo ottenuto ci dice che l’errore al passo n + 1 è proporzionale, secondo il fattore A, al quadrato dell’errore al passo precedente. Si parla di convergenza quadratica. Nel caso in cui ξ sia una radice multipla, allora f 0 (ξ ) = 0 e A = ∞: se il metodo converge, la convergenza non sarà più quadratica ma avremo una convergenza di tipo lineare, come vedremo meglio in seguito. Se in ξ vi è un punto di flesso non orizzontale, per cui f (ξ ) = 0, f 0 (ξ ) 6= 0, f 00 (ξ ) = 0, allora A = 0 e ci aspettiamo una convergenza superiore a quella quadratica.

5.5

Convergenza di un metodo iterativo

Quando si parla di un metodo iterativo, ci sono due cose fondamentali da vedere: se il metodo converge alla soluzione, in che modo si riduce l’errore ad ogni passo e secondo quale fattore? Si parla di ordine di convergenze e di fattore di convergenza. Vediamo la definizione più usata. Definizione 5.5.1 Un metodo ha ordine di convergenza p se si possono definire due costanti p ≥ 1 e M > 0 tali che lim

n→∞

| x n +1 − ξ | =M | xn − ξ | p

La costante M prende il nome di costante asintotica dell’errore o fattore di convergenza.

Se partiamo da un errore iniziale dell’ordine di 10−2 , al passo successivo l’errore è proporzionale a 10−4 e poi a 10−8 fino a 10−16 in tre sole iterazioni. Generalmente, quindi, il numero delle cifre significative raddoppia ad ogni passo del metodo.

60

annamaria mazzia

In maniera alternativa, un metodo iterativo si dice:

x

Nel caso del metodo di Newton-Raphson, generalmente vale p = 2 e la costante asintotica dell’errore è quella che abbiamo f 00 (ξ ) . definito come A presa in valore assoluto, cioè M = 0 2 f (ξ )

x

Nel metodo del punto fisso, nell’ipotesi in cui g0 (ξ ) 6= 0, la convergenza è lineare. Infatti, considerando l’errore cambiato di segno, la relazione xn+1 = g( xn ) si può scrivere, in modo equivalente, come ξ + e n +1 = g ( ξ + e n )

x

x x

linearmente convergente se esiste una costante M < 1 tale che, per n sufficientemente grande, vale

| x n +1 − ξ | ≤ M | x n − ξ | a convergenza quadratica se esiste una costante M tale che, per n sufficientemente grande, vale

| x n +1 − ξ | ≤ M | x n − ξ | 2 a convergenza superlineare se esiste una successione di costanti Mn → 0 tale che, per n sufficientemente grande, vale

| x n + 1 − ξ | ≤ Mn | x n − ξ | .

e, applicando la formula (polinomiale) di Taylor si ha ξ + e n +1 = g ( ξ ) + e n g 0 ( ξ ) + . . . ξ + e n +1 = ξ + e n g 0 ( ξ ) + . . . en+1 = en g0 (ξ ) + . . . e, al limite per n → ∞ e n +1 = g 0 ( ξ ) e n La costante asintotica per lo schema di punto fisso, nel caso generale vale, dunque, M = | g0 (ξ )|. Se invece | g0 (ξ )| = 0, il metodo converge sempre ma con ordine di convergenza maggiore di uno.

x

Il metodo delle bisezioni può essere visto come un metodo lineare, 1 con M = (considerando che, ad ogni passo, si riduce della metà 2 l’intervallo in cui viene cercata l’approssimazione della radice).

5.6

Ricordiamo che, se il metodo di punto fisso converge linearmente, deve essere | g0 (ξ )| < 1. Infatti, se un metodo è lineare, affinchè l’errore al passo n + 1 decresca di M rispetto all’errore al passo n, deve essere M < 1. Per esercizio, si ricavi ordine di convergenza e costante asintotica se g0 (ξ ) = 0 e g00 (ξ ) 6== 0.

Errore e scarto nel metodo di Newton-Raphson

Come per lo schema di punto fisso, quando implementiamo il metodo di Newton-Raphson, non potendo misurare l’errore en (la radice ξ è incognita), usiamo lo scarto dn come misura della bontà dell’approssimazione della radice. Esempio Consideriamo l’equazione f ( x ) = 2x − cos ( x ) + 1 = 0 che ammette come unica radice ξ = 0. Poichè f 0 ( x ) = 2 + sin ( x ), il metodo di Newton-Raphson diventa: x n +1 = x n −

2xn − cos ( xn ) + 1 2 + sin ( xn )

Partendo da x0 = 0.5 e richiedendo una tolleranza pari a 10−10 nei risultati (interrompiamo l’algoritmo quando dn < 10−10 ), si ha:

Figura 5.11: Radice della funzione f ( x ) =

2x − cos ( x ) + 1.

appunti di calcolo numerico

n 0 1 2 3 4 5

xn 0.5 0.4730746270E-01 0.5462695134E-03 0.7458221874E-07 0.1395426403E-14 0.7647622253E-17

61

dn 0.4526925E+00 0.4676119E-01 0.5461949E-03 0.7458222E-07 0.1387779E-14

I valori generati dall’algoritmo tendono a ξ = 0. Considerando che f 00 ( x ) = cos ( x ) possiamo valutare la costante | cos (ξ )| 1 | f 00 (ξ )| = = = 0.25 asintotica M = 2| f 0 (ξ )| 2(|2 + sin (ξ )|) 4 _ Da un punto di vista teorico, considerando la radice ξ e l’approssimazione xn e applicando il teorema del valor medio, possiamo scrivere f (ξ ) − f ( xn ) = f 0 (ξ n )(ξ − xn ) dove ξ n è un punto, che non conosciamo, compreso tra ξ e xn . Per xn vicino a ξ possiamo considerare ξ n ≈ xn , da cui ricaviamo (essendo f (ξ ) = 0):

− f ( xn ) ≈ f 0 ( xn )(ξ − xn ) Sostituendo questa espressione nell’iterazione di Newton-Raphson si ha: x n +1 = x n −

f ( xn ) ≈ xn + (ξ − xn ) f 0 ( xn )

vale a dire x n +1 − x n ≈ ξ − x n

Nell’ esempio appena visto

cioè

d n +1 ≈ e n .

Ma in condizioni di convergenza, dn+1 < dn da cui, per l’errore, vale la maggiorazione en < dn . Perciò gli scarti sono molto vicini agli errori e possono essere utilizzati sia per controllare il numero di iterazioni da effettuare per approssimare la radice entro una certa tolleranza sia per approssimare d 1 M applicando la formula M ≈ n+ . d2n Una volta stimato M, si può anche avere una stima più accurata dell’errore all’ultimo passo (cioè al passo n + 1). Da una parte, infatti, d n +2 vale en+1 ≈ dn+2 , dall’altra M ≈ . Se siamo arrivati fino ( d n +1 )2 all’iterazione n + 1 non abbiamo lo scarto dn+2 ma, avendo stimato M, possiamo approssimare en+1 tramite la formula en+1 ≈ dn+2 ≈ M ( d n +1 )2 . Esempio Consideriamo l’equazione f ( x ) = 0 con f ( x ) = x3 + x. Si vede subito che l’unica radice reale di f è ξ = 0. Dal momento che f 0 ( x ) = 3x2 + 1 e f 00 ( x ) = 6x, risulta che f 0 (0) = 1 6= 0 mentre

d2 ( d1 )2 d3 ( d2 )2 d4 ( d3 )2 d5 ( d4 )2

= 0.2282 = 0.2498 = 0.2500 = 0.2495

Abbiamo una stima di M usando gli scarti.

Figura 5.12: Radice della funzione f ( x ) = x3 + x.

62

annamaria mazzia

f 00 (0) = 0: la radice ξ = 0 è un punto di flesso non orizzontale. Questo è un caso particolare in cui il metodo di Newton-Raphson converge non con ordine p = 2 bensì con ordine di convergenza cubico, p = 3. Applichiamo il metodo di Newton-Raphson, partendo da x0 = 5 e arrestando le iterazioni quando lo scarto diventa minore di 10−10 . Vengono eseguite 9 iterazioni e, per gli scarti, abbiamo: n 1 2 3 4 5 6 7 8 9

dn 1.7105e+00 1.1620e+00 8.0644e-01 5.8158e-01 4.3318e-01 2.6142e-01 4.4651e-02 1.7912e-04 1.1494e-11

Proviamo a vedere, sperimentalmente, quale può essere l’ordine di convergenza e la costante asintotica. Mettiamo in tabella i rapporti dn dn (convergenza lineare?) (convergenza quadratica?) e d n −1 ( d n −1 )2 dn (convergenza cubica?). Sappiamo già che non può esserci ( d n −1 )3 convergenza quadratica. Per i vari rapporti degli scarti, si ha: n 2 3 4 5 6 7 8 9

dn d n −1 6.7934e-01 6.9399e-01 7.2117e-01 7.4484e-01 6.0348e-01 1.7081e-01 4.0115e-03 6.4168e-08

dn

dn

)2

( d n −1 3.9715e-01 5.9723e-01 8.9426e-01 1.2807e+00 1.3931e+00 6.5339e-01 8.9840e-02 3.5824e-04

( d n −1 )3 2.3218e-01 5.1395e-01 1.1089e+00 2.2021e+00 3.2160e+00 2.4994e+00 2.0120e+00 2.0000e+00

I rapporti che indicano convergenza lineare e quadratica tendono a zedn ro, mentre i rapporti tendono a 2: ciò dice che la convergenza ( d n −1 )3 è cubica e che la costante asintotica vale 2. _

5.7

Ancora esempi sul metodo di Newton-Raphson

Vediamo un esempio che ci permette di capire meglio il significato di metodo generalmente convergente (e che il metodo di Newton-Raphson non converge proprio sempre!).

Figura 5.13: Grafico di convergenza del metodo di Newton-Raphson applicato alla funzione f ( x ) = x3 + x, partendo da x0 = 5.

Abbiamo detto che il metodo di NewtonRaphson ha, in genere, ordine 2. Ma se noi, ipotizzando ordine 2, troviamo una costante asintotica M nulla o che tende a zero, deve suonare un campanello di allarme! La costante asintotica di un metodo iterativo non può mai valere zero. Quindi l’ordine non è quello che ci aspettiamo ma bisogna indagare ulteriormente sui risultati! Attenzione: in questo esempio, una volta accertata che la convergenza non è quadratica, non potremmo neanche pensare ad una convergenza di tipo lineare perchè, se aves-

en = M 6= 0, avreme n −1 en en = limn→+∞ mo limn→+∞ · e n −1 ( e n −1 )2 1 1 = M limn→+∞ = +∞ e non e n −1 e n −1 simo limn→+∞

zero (ciò che invece abbiamo).

Allo stesso risultato si arriva anche per via teorica (sapendo qual è la radice), applicando lo sviluppo di Taylor alla formula dell’errore dell’algoritmo di Newton-Raphson. e considerando che la radice è un punto di flesso non orizzontale.

appunti di calcolo numerico

63

Esempio

 √ x per x ≥ 0 Si consideri f ( x ) = . √ − − x per x < 0 La radice di questa funzione è ξ = 0. 1   √  2 x 0 Per la derivata prima, si ha f ( x ) = 1    √ 2 −x Se partiamo da x0 > 0 abbiamo

per x ≥ 0 . per x < 0 Figura 5.14: Esempio in cui il metodo di Newton-Raphson oscilla tra due valori.



x1 = x0 −

x0 = x0 − 2x0 = − x0 1 √ 2 x0

Se partiamo da x0 < 0 abbiamo x1 = x0 −

√ − − x0 = x0 + 2(− x0 ) = − x0 . 1 √ 2 − x0

Il metodo di Newton applicato alla funzione f , diventa quindi: x n +1 = − x n ,

n = 0, 1, 2, . . .

Qualunque sia il valore iniziale x0 6= 0, si ha x1 = − x0 , x2 = − x1 = x0 ... i valori generati dal metodo di Newton-Raphsono si alternano tra x0 e − x0 e non si avrà mai convergenza alla radice ξ = 0. _ Da un punto di vista pratico occorre prestare molta attenzione anche alla scelta del punto iniziale per il metodo di Newton-Raphson. Dal momento che la formula richiede una divisione per f 0 ( xn ), occorre evitare di prendere un punto iniziale in cui la f abbia una tangente quasi orizzontale (e quindi il corrispondente valore di f 0 sia un valore vicino allo zero). In tal caso, infatti, ci si può allontanare dalla radice e il metodo può non convergere o convergerà molto lentamente. Esempio Consideriamo f ( x ) = x5 − 6, per la quale f 0 ( x ) = 5x4 . Se partiamo da un punto iniziale prossimo allo zero, poichè la tangente alla f è quasi orizzontale, non si riesce ad avere convergenza se non dopo molte iterazioni: partendo da x0 = 0.01 e richiedendo una tolleranza 10−8 , sono necessarie 88 iterazioni per arrivare a ξ = 1.430969081115725849. Vediamo in tabella, come cambia il numero delle iterazioni al variare di x0 : x0 iterazioni

0.05 59

0.1 46

0.5 18

0.8 10

1.0 7

1.4 4

1.5 4

2. 6

3. 8

10. 14

Figura 5.15: La funzione f ( x ) = x5 − 6

20. 17 _

100. 24

64

5.8

annamaria mazzia

Il metodo delle secanti o Regula Falsi

La conoscenza della derivata prima della f per applicare il metodo di Newton-Raphson potrebbe essere semplice ma a volte potrebbe rivelarsi un’operazione molto costosa e alquanto complicata. Il metodo delle secanti è una variante del metodo di NewtonRaphson dove, al posto della derivata prima, si considera una sua approssimazione. Scriviamo la formula ricorsiva x n +1 = x n −

f ( xn ) Cn

Per Cn = f 0 ( xn ) abbiamo la formula di Newton-Raphson, che possiamo anche chiamare della tangente variabile perchè è il coefficiente angolare della retta tangente a ( xn , f ( xn )) che interseca l’asse delle x in xn+1 . Ci possono essere altre scelte per Cn :

x

Cn = f 0 ( x0 ): il valore di Cn è costante e dà vita al metodo della tangente fissa.

x

Cn =

x

Cn =

f ( x1 ) − f ( x0 ) : abbiamo sempre una costante che approssix1 − x0 ma la derivata f 0 ( x0 ) utilizzando i valori di x1 e x0 . Lo schema è detto della secante fissa.

f ( x n ) − f ( x n −1 ) . La derivata f 0 ( xn ) è approssimata utix n − x n −1 lizzando il rapporto incrementale della f valutata in xn e xn−1 . Abbiamo il metodo delle secante variabile, che chiameremo nel seguito anche metodo della Regula Falsi. In forma estesa, l’iterazione n + 1 della Regula Falsi si scrive come:

x n +1 = x n −

f ( xn )( xn − xn−1 ) f ( x n ) − f ( x n −1 )

Notiamo che, per innescare il metodo occorrono due valori iniziali, x0 e x1 . Ma è richiesta solo la valutazione della funzione f a ciascun passo (nessuna conoscenza della derivata prima). Da un punto di vista geometrico, nel metodo delle secanti il valore xn+1 è dato dall’intercetta sull’asse delle x della retta passante per x n , f ( x n ) e x n −1 , f ( x n −1 ). Per quanto riguarda l’ordine di convergenza si può dimostrare che si ha convergenza superlineare poichè vale la relazione p p e n +1 = M p + 1 e n √ 00 f (ξ ) 1+ 5 è la costante asitontica del dove p = = 1.618 e M = 0 2 2 f (ξ ) metodo di Newton-Raphson, da cui en+1 = M0.618 en1.618

Attenzione! In letteratura viene descritto un altro metodo (simile ma non lo stesso) con il nome della Regula Falsi o Falsa Posizione che genera i valori xn+1 in modo che la radice ξ sia sempre compresa tra le iterazioni successive.

Per quanto riguarda l’accumulo degli errori di arrotondamento, conviene utilizzare la formula così come è stata scritta in quanto è più "sicura" rispetto alla forma compatta in cui vengono raccolti i termini, data da

x 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 xn ≈ xn−1 e f ( xn ) f ( xn−1 ) > 0.

Il valore p = 1.618 è la cosidetta sezione aurea, un numero molto importante nelle arti e nella matematica (e il nome aureo deriva da alcune sue proprietà che hanno da sempre affascinato l’uomo). Il valore di p rappresenta √ il punto fisso della funzione g( x ) = 1 + x.

appunti di calcolo numerico

65

Figura 5.16: Il metodo della Regula Falsi applicato alla funzione f ( x ) = ( x/2)2 − sin ( x ) con x0 = 1.3 e x1 = 1.35

5.9

Complessità computazionale di uno schema

Un altro elemento da considerare per valutare l’efficienza numerica di uno schema iterativo è la sua complessità computazionale. Un metodo, infatti, può avere un elevato ordine di convergenza ma avere anche un costo computazionale molto elevato. Viceversa, un metodo può avere un basso ordine di convergenza ma essere anche semplice computazionalmente e, quindi, molto vantaggioso da questo punto di vista. Si definisce indice di efficienza E dello schema iterativo la quantità E = p1/s dove s indica il numero delle funzioni coinvolte ad ogni iterazione (per esempio: solo f , oppure f e f 0 , e così via), mentre p è l’ordine di convergenza del metodo. Sebbene il metodo di Newton-Raphson abbia ordine di convergenza più elevato della Regula Falsi, quest’ultimo è computazionalmente più efficiente. Si ha infatti Metodo Newton-Raphson Regula Falsi

5.10

p 2 1.618

s 2 1

E √

2 ≈ 1.414 1.618

Confronto tra Newton-Raphson e Regula Falsi

Esempio Consideriamo la funzione f ( x ) = 0 con f ( x ) = ( x/2)2 − sin ( x ). La derivata prima è f 0 ( x ) = ( x/2) − cos ( x ) Consideriamo come x0 = 1.3 per entrambi i metodi e x1 = 1.35 per la Regula Falsi. Come Figura 5.17: Radici della funzione f ( x ) =

( x/2)2 − sin ( x )

66

annamaria mazzia

criterio di arresto, consideriamo una tolleranza tol = 1.e − 8, cioè andremo avanti con le iterazioni fino a quando troveremo che lo scarto dn = | xn − xn−1 | sarà minore di tol. Otteniamo i seguenti risultati per il metodo di Newton-Raphson n 0 1 2 3 4 5 6

xn 1.3 2.714526871831 2.084760792766 1.944113685369 1.933811265085 1.933753764621 1.933753762827

f ( xn ) -5.410581854E-01 1.427962127E+00 2.157545986E-01 1.377189572E-02 7.60156095E-05 2.37200355E-09 -1.00668172E-16

f 0 ( xn ) 0.382501171 2.26744846 1.53401376 1.33676314 1.32199993 1.32191743

dn

dn /d2n−1

1.41452687E+00 6.29766079E-01 1.40647107E-01 1.03024203E-02 5.75004640E-05 1.79436599E-09

0.314743565 0.354627390 0.520808008 0.541742396 0.542710632

Per la Regula Falsi si ha: n

xn

f ( xn )

f ( x n ) − f ( x n −1 ) x n − x n −1

0 1 2 3 4 5 6 7 8 9

1.3 1.35 2.590702853065 1.735341043061 1.879309845941 1.940687248331 1.933542654410 1.933752971771 1.933753762918 1.933753762827

-5.41058185E-01 -5.20098358E-01 1.15448972E+00 -2.33640901E-01 -6.98346071E-02 9.19996444E-03 -2.79035921E-03 -1.04570967E-06 1.19824825E-10 -1.00668172E-16

0.419196552 1.34970922 1.62285784 1.13779020 1.28768192 1.32673746 1.32176540 1.32191686

dn

dn /d1.618 n −1

1.24070285E+00 8.55361810E-01 1.43968803E-01 6.13774024E-02 7.14459392E-03 2.10317362E-04 7.91146198E-07 9.06448250E-11

0.603386215 0.185374473 1.412310765 0.653100215 0.623935239 0.704441455 0.676026603

Attraverso gli scarti, abbiamo fatto una stima della costante asintotica dell’errore, considerando che, al limite per k → ∞, xn → ξ. Le ultime colonne delle tabelle, infatti, valutano i rapporti dn /d2n−1 e dn /d1.618 n −1 . Diamo un’ulteriore stima di tali costanti facendo uso della definizione teorica e considerando ξ ≈ xn . | f 00 (ξ )| Per il metodo di Newton-Raphson dobbiamo calcolare M = 2| f 0 (ξ )| 0.618 mentre per la Regula Falsi dobbiamo considerare il valore M . Poichè f 00 ( x ) = 1/2 + sin ( x ), abbiamo, per ξ ≈ x6 (di NewtonRaphson) o, equivalentemente per ξ ≈ x9 (della Regula Falsi), in pratica ξ ≈ 1.933753762827, f 0 (ξ ) = 1.32191743 e f 00 (ξ ) = 1.4348509. Otteniamo quindi: M ≈ 0.542715784 e M0.618 ≈ 0.685434221 _

5.11

Metodo di Newton-Raphson per radici multiple

Il metodo di Newton-Raphson non si comporta come ci si aspetta se viene applicato per approssimare una radice ξ per cui vale f 0 (ξ ) = 0. In tal caso, la radice non è una radice semplice ma è una radice multipla. Definizione 5.11.1 Data un’equazione f ( x ) = 0, una radice ξ si dice multipla con molteplicità r se vale: f (ξ ) = f 0 (ξ ) = . . . = f r−1 (ξ ) = 0

Un conto è dire che una radice è multipla, cioè la stessa radice si ripete per un certo numero di volte. Un conto è dire che una funzione ha molteplici radici (distinte, diverse tra loro).

appunti di calcolo numerico

67

e f r (ξ ) 6= 0. Ciò significa che la funzione f ( x ) può essere scritta come f ( x ) = ( x − ξ )r q( x ), dove q( x ) è una funzione per cui vale q(ξ ) 6= 0 o limx→ξ q( x ) 6= 0. Esempio Consideriamo l’equazione x2 − 8x + 16 = 0. Si tratta di trovare le radici di un polinomio di grado 2. L’equazione che abbiamo scritta si può riscrivere, in modo del tutto equivalente, come ( x − 4)2 = 0. Troviamo una radice, da contarsi due volte, cioè ξ = 4 è una radice doppia, o con molteplicità r = 2. Da f ( x ) = x2 − 8x + 16 = ( x − 4)2 ricaviamo f 0 ( x ) = 2x − 8 = 2( x − 4) e f 00 ( x ) = 2. Risulta, quindi: f (4) = f 0 (4) = 0, mentre f 00 (4) 6= 0. _ Quando si ha una radice multipla, il metodo di Newton-Raphson diventa un metodo del primo ordine in quanto la formula che lega l’errore al passo n + 1 con l’errore al passo n diventa: e n +1 =

r−1 en r

Figura 5.18: Radice doppia di f ( x ) = x2 − 8x + 16.

Il procedimento da seguire per arrivare a questo risultato è del tutto simile a quanto è stato fatto nell’ipotesi in cui f 0 (ξ ) 6= 0. Si consiglia di ricavare questo risultato come esercizio.

r−1 . Per poter avere un metodo r che sia di nuovo a convergenza quadratica, occorre modificare l’algoritmo, ottenendo la formula di Newton-Raphson modificata, nel modo seguente: da cui la costante asintotica è M =

x n +1 = x n − r

f ( xn ) f 0 ( xn )

Da un punto di vista geometrico, la nuova approssimazione xn+1 è dato dall’intercetta con l’asse delle ascisse della retta data da y = f 0 ( xn )( x − xn ) + r f ( xn ) (retta che è parallela alla retta tangente alla f in xn ) Esempio Riprendiamo la funzione f ( x ) = x2 − 8x + 16 (di cui sappiamo che ξ = 4 è una radice doppia). Applicando il metodo di Newtonx2 − 8xn + 16 Raphson, abbiamo xn+1 = xn − n . La stessa formula si 2xn − 8 ( x n − 4)2 xn − 4 xn + 4 può riscrivere come xn+1 = xn − = xn − = . 2( x n − 4) 2 2 La convergenza è lineare: se facciamo il rapporto tra gli scarti otteniamo un valore che tende a 0.5. Modificando l’algoritmo tenendo conto della molteplicità della ( x n − 4)2 radice, otteniamo: xn+1 = xn − 2 = xn − ( xn − 4) = 4. 2( x n − 4) Qualunque sia il punto iniziale, arriviamo alla radice in una sola iterazione! La funzione che abbiamo preso in esame è particolare, essendo un polinomio di grado 2, perciò abbiamo una sola iterazione per arrivare a convergenza.

Per esercizio si dimostri che, data la funzione f ( x ) = ( x − ξ )2 = 0, il metodo di NewtonRaphson modificato converge a ξ in una sola iterazione qualunque sia il punto x0 iniziale.

68

annamaria mazzia

Figura 5.19: Prima iterazione dello schema di Newton-Raphson e dello schema diNewtonRaphson modificato per approssimare la radice doppia della funzione f ( x ) = x2 − 8x + 16 = ( x − 4)2 .

_ Osserviamo che, in caso di una radice multipla, anche il metodo della Regula Falsi converge alla radice in modo lineare e non più superlineare come ci si aspetta.

5.12

Controllo sugli scarti e grafici di convergenza

Da un punto di vista pratico, il controllo per verificare la convergenza o meno della successione di valori xn−1 , xn , xn+1 , generata dallo schema iterativo viene effettuato sugli scarti dn = | xn − xn−1 | piuttosto che sugli errori (assoluti) en = |ξ − xn |, poichè, se avessimo informazioni sugli errori, conosceremmo anche il valore di ξ (che, in generale, non è noto). Fissata una certa tolleranza tol, arrestiamo lo schema iterativo quando dn < tol (o quando dn+1 < tol a seconda della notazione usata). Nel caso del metodo di Newton-Raphson a convergenza quadratica, abbiamo visto che il controllo sullo scarto va bene (si veda quanto detto a pag. 61). Vediamo cosa succede per metodi lineari. Sia tol la tolleranza richiesta per approssimare ξ utilizzando gli scarti. Sappiamo che, per n grande e se il metodo converge, vale la relazione en+1 ≈ Men dove M < 1, M 6= 0, è la costante asintotica. Riscriviamo la precedente formula come:

|ξ − xn+1 | ≈ M|ξ − xn | = M|ξ − xn + xn+1 − xn+1 | ≤ M (|ξ − xn+1 | + | xn+1 − xn |)

appunti di calcolo numerico

69

Quindi en+1 ≤ M(en+1 + dn+1 ) vale a dire (1 − M )en+1 ≤ Mdn+1 Se siamo arrivati ad un indice n per cui dn+1 ≤ tol, allora vale e n +1 ≤

M M d ≤ tol 1 − M n +1 1−M

M < 1 (vale a dire per M < 1/2), se dn+1 ≤ tol anche 1−M en+1 ≤ tol. Se, invece, M ≥ 1/2, allora l’errore può essere un po’ più grande della tolleranza richiesta. Per quanto riguarda il metodo della secante variabile, poichè è superlineare, in base alla definizione alternativa che abbiamo dato, si può dire che en+1 ≈ Mn+1 en con Mn+1 → 0: si può vedere come un caso limite di convergenza lineare con fattore di convergenza che tende a zero, e quindi il controllo dello scarto permette un buon controllo dell’errore. Quando si implementa un metodo iterativo, si può fare il grafico semilogaritmico di convergenza del metodo, ponendo sull’asse delle ascisse i valori delle iterazioni e sull’asse delle ordinate i logaritmi (in base 10) degli scarti. Asintoticamente, infatti, nella definizione di ordine di convergenza di un metodo, possiamo sostiture l’errore con lo scarto da cui dn ≈ p Mdn−1 . Nel caso in cui p = 1, si ha: Perciò, per

M < 1 si può riscrive1−M re come M < 1 − M da cui 2M < 1 ovvero M < 1/2. Se tol = 10−10 e M = 0.8 (maggiore di 1/2), l’errore sarà minore o uguale a 4 · 10−10 . La disequazione

dn ≈ Mdn−1 dn−1 ≈ Mdn−2 dn−2 ≈ Mdn−3 .. .

.. .

d2 ≈ Md1 d1 ≈ Md0 Partendo dalla prima relazione abbiamo: dn ≈ Mdn−1 ≈ M2 dn−2 ≈ M3 dn−3 ≈ . . . ≈ Mn d0 Troviamo una relazione tra dn e d0 . Passando ai logaritmi: log10 (dn ) = n log10 ( M ) + log10 (d0 ) Abbiamo un’equazione del tipo y = ax + b dove y = log10 (dn ) e x = n, che rappresenta l’equazione della retta nel nostro grafico semilogaritmico, e la pendenza della retta vale a = log10 ( M ). Dalla pendenza della retta possiamo dunque risalire al valore della costante asintotica M.

Figura 5.20: Grafico con i profili di convergenza per i metodi di Newton-Raphson, secante variabile e punto fisso per trovare lo zero della funzione f ( x ) = x + ln ( x ) (e applicando lo schema di punto fisso alla funzione g( x ) = e− x ).

Nel caso in cui p 6= 1 il discorso si fa più complicato (e non staremo qui ad analizzarlo nei dettagli).

70

5.13

annamaria mazzia

Osservazioni sull’ordine di convergenza di un metodo iterativo

Abbiamo visto che, in generale, uno schema iterativo ha un certo ordine di convergenza, ma ci sono delle eccezioni: ad esempio, il metodo di Newton-Raphson in genere è di ordine p = 2 ma se la radice è multipla allora il metodo diventa lineare, e se la radice è un punto di flesso non orizzontale il metodo ha convergenza cubica; analogamente nello schema di punto fisso, se g0 (ξ ) = 0 allora il metodo non è più lineare... Se non abbiamo sufficienti informazioni sulla radice o sul punto fisso che vogliamo approssimare, come facciamo a capire qual è l’ordine di convergenza del metodo iterativo? Una strada è vedere se l’approssimazione della costante asintotica usando gli scarti o la formula "teorica" che vale per l’ordine p che ci aspettiamo, abbia senso (cioè non tenda nè a zero nè a infinito ma ad un valore limite ben preciso – si veda l’esempio descritto a pag. 65). Ma se l’approssimazione della costante asintotica non va bene, c’è una strada più pratica da seguire per capire qual è l’ordine di convergenza del metodo? Riprendiamo la definizione di ordine di convergenza di uno schema iterativo: lim

n→∞

Se stiamo applicando il metodo di NewtonRaphson e stimando M tramite la formula dn+1 /d2n o tramite la formula teorica | f 00 ( xn )/(2 f 0 ( xn )| troviamo dei valori che tendono ad un limite ben preciso diverso da zero e da infinito, allora significa che il metodo ha ordine p = 2 e che la stima che stiamo facendo è corretta. Ma se, seguendo questa strada, troviamo dei valori di M che tendono a zero o a infinito, significa che l’ordine del metodo non è p = 2!

| x n +1 − ξ | =M | xn − ξ | p

Utilizzando gli scarti come approssimazione dell’errore possiamo dire che, se p è l’ordine di convergenza, allora, al limite per n che tende all’infinito, si ha

| x n +1 − x n | →M | x n − x n −1 | p

ovvero

Deve essere p ≥ 1 e M numero reale positivo.

d n +1 → M. (dn ) p

Partendo dall’iterazione 1 (lo scarto d0 ha un significato fittizio e non lo usiamo) fino ad arrivare all’iterazione n + 1, abbiamo le seguenti approssimazioni per M: d2 ≈ M, ( d1 ) p

d3 ≈ M, ( d2 ) p

d4 ≈ M, ( d3 ) p

...

dn ≈ M, ( d n −1 ) p

d n +1 ≈M (dn ) p

Supponiamo di non conoscere quale sia il valore di p. Allora non possiamo andare a calcolare quei rapporti tra gli scarti che abbiamo appena scritto! Sappiamo però che quei rapporti tendono allo stesso valore di M (la costante asintotica). Perciò possiamo eguagliarli a due a due in modo da poter avere una relazione che ci permetta di ricavare p: d2 d3 d2 d3 ≈M≈ =⇒ ≈ p p p ( d1 ) ( d2 ) ( d1 ) ( d2 ) p d3 d4 d3 d4 ≈M≈ =⇒ ≈ ( d2 ) p ( d3 ) p ( d2 ) p ( d3 ) p .. .. . . dn d dn d ≈ M ≈ n+1p =⇒ ≈ n+1p ( d n −1 ) p (dn ) ( d n −1 ) p (dn )

appunti di calcolo numerico

d2 d3 ≈ ricaviamo facilmente ( d1 ) p ( d2 ) p  p  p d2 (d ) p d1 d3 d2 ≈ 1 p = oppure, passando ai reciproci, si ha ≈ d3 ( d2 ) d2 d2 d1

Da

Passando ai logaritmi si ha 

 log

d2 d3





≈ p log

d1 d2

 da cui

 d2 log d  3 p≈ d1 log d2



 d3 d  2 In modo equivalente, p ≈ d2 log d1 log

Lavorando allo stesso modo sugli altri rapporti tra gli scarti abbiamo: 







d3 d  4, p≈ d2 log d3

log

log

...

p≈

 log

dn

 d n +1 d  n  In modo equivalente p ≈ dn log d n −1 log



d n +1  d n −1 dn

Man mano che ci stiamo avvicinando a convergenza il valore di p tenderà ad un valore ben preciso, l’ordine di convergenza del metodo. E, una volta trovato p, possiamo stimare M usando la formula del rapporto tra gli scarti. Esempio Riprendiamo l’esempio di pag. 65 in cui abbiamo confrontato gli schemi di Newton-Raphson e della Regula Falsi. Andiamo a rivedere i valori degli scarti e a stimare il valore di p usando la formula appena scritta. n 1 2 3 4 5 6 7 8 9

dn (N-R) 1.41452687E+00 6.29766079E-01 1.40647107E-01 1.03024203E-02 5.75004640E-05 1.79436599E-09

p (N-R)

1.8526 1.7436 1.9849 1.9997

dn (R-F) 5.E-02 1.24070285E+00 8.55361810E-01 1.43968803E-01 6.13774024E-02 7.14459392E-03 2.10317362E-04 7.91146198E-07 9.06448250E-11

p (R-F)

-0.11581 4.7913 0.47845 2.5226 1.6392 1.5836 1.6254

Osserviamo che per poter iniziare a stimare il valore approssimato di p dobbiamo avere fatto almeno tre iterazioni    in modo da poter dn d n −1 applicare la formula p ≈ log / log . d n +1 dn Dalla tabella, si può notare che, per il metodo di Newton Raphson, a parte un’iniziale oscillazione, il valore di p tende a 2. Per il metodo della Regula Falsi invece si vede all’inizio un valore negativo (dovuto alla scelta dei due valori iniziali x0 e x1 ), successivamente ci sono forti oscillazioni, infine, quando si sta arrivando a convergenza, si hanno i valori di p = 1.6392, 1.5836, 1.6254. Ricordiamo che in questo caso p = 1.618 e l’approssimazione finale che otteniamo è abbastanza buona.

71

72

annamaria mazzia

Se, all’ultima iterazione, il valore dello scarto fosse zero o molto prossimo a zero (dell’ordine di 10−16 , la precisione di macchina) allora non conviene usare quest’ultimo valore per stimare l’ordine di convergenza (non possiamo fare log 0 o una divisione per zero – a seconda di come stiamo applicando la formula per p). In casi simili conviene fermarsi alla stima del penultimo passo di iterazione. _

Esercizi

5.14

Esercizio 5.14.1 Si vuole risolvere l’equazione x = g( x ) con lo schema del punto fisso; sapendo che g( x ) = x2 − 5x + 9 (a) calcolare analiticamente il valore del punto fisso; (b) determinare il fattore di convergenza M dello schema del punto fisso; (c) calcolare le approssimazioni x1 , x2 e x3 partendo prima da x0 = 1 e poi da x0 = 2.5 e giustificandone il diverso comportamento. Svolgimento (a) ξ è punto fisso della funzione g se verifica g(ξ ) = ξ. Imponiamo dunque la condizione g(ξ ) = ξ. Ricaviamo ξ 2 − 5ξ + 9 = ξ, ovvero ξ 2 − 6ξ + 9 = 0, cioè (ξ − 3)2 = 0, da cui ξ = 3 è punto fisso della g. (b) Il fattore di convergenza è M = g0 (ξ ). Poichè g0 ( x ) = 2x − 5, si ha g0 (ξ ) = g0 (3) = 1. Osserviamo che, a priori, non si può dire se lo schema del punto fisso converge o meno proprio perchè nel punto fisso la derivata prima vale esattamente 1, ma bisogna vedere caso per caso a seconda del punto iniziale da cui si fa partire il metodo. Per x0 = 1 si ha

(c)

k 0 1 2 3

Figura 5.21: Esercizio sullo schema di punto fisso

Per x0 = 2.5 si ha xk 1 5 9 45

g( xk ) 5 9 45 1809

k 0 1 2 3

xk 2.5 2.75 2.8125 2.84765625

g( xk ) 2.75 2.8125 2.84765625 2.870864868

Per x0 = 1 il metodo non converge, mentre per x0 = 2.5 il metodo converge. La diversità di comportamento si giustifica graficamente, come si può vedere dalla Figura 5.21, osservando che per x0 = 1 i valori ottenuti dallo schema si allontanano sempre più dal punto fisso. Nel secondo caso, al contrario, i valori si avvicinano con monotonia al punto fisso.

appunti di calcolo numerico

Esercizio 5.14.2 Si vuole risolvere l’equazione f ( x ) = 0 con f ( x ) = ( x − 1)2 + 3 ln ( x ), nell’intervallo [0.5, 2] con gli schemi di NewtonRaphson e della Regula Falsi. (a) Dimostrare esistenza e unicità della soluzione nell’intervallo considerato. (b) Calcolare le approssimazioni x1 , x2 e x3 con lo schema di NewtonRaphson, partendo da x0 = 0.5; (c) Calcolare le approssimazioni x2 e x3 con lo schema della RegulaFalsi partendo da x0 = 0.5 e x1 calcolato al punto b). Stimare, inoltre il fattore di convergenza del metodo di Newton-Raphson assumendo ξ ≈ x3 .

Svolgimento (a) La funzione ammette valori opposti all’estremo dell’intervallo. Infatti f (0.5) = −1.82944154 e f (2) = 3.07944154. Quindi, per il teorema del valor intermedio, esiste almeno una radice. Inoltre 3 2x2 − 2x + 3 f 0 ( x ) = 2( x − 1) + = è sempre positivo nell’interx x 2 vallo dato, (la parabola 2x − 2x + 3 ha discriminante negativo e quindi è sempre positiva). Perciò, da f 0 ( x ) > 0 concludiamo che la f è crescente. Di qui l’unicità della radice. (b) Partendo da x0 = 0.5, il metodo di Newton-Raphson fornisce i seguenti valori: k 0 1 2 3

xk 0.50000000E+00 0.86588831E+00 0.99541173E+00 0.99999643E+00

f ( xk ) -0.18294415E+01 -0.41401211E+00 -0.13775443E-01

f 0 ( xk ) 0.50000000E+01 0.31964267E+01 0.30046517E+01

Dalla tabella sembra che i valori della successione tendano a 1. E, infatti, si vede facilmente che f (1) = 0 e quindi 1 è il valore che stiamo cercando. Per stimare la costante asintotica dell’errore del metodo di Newton-Raphson assumendo ξ ≈ x3 , occorre usare la formula M≈

| f 00 ( x3 )| 2| f 0 ( x3 )|

3 dove, nel caso specifico, vale f 0 ( x ) = 2( x − 1) + e f 00 ( x ) = x 3 2− 2. x Usando il valore trovato per x3 si ricava M ≈ 0.16667004E + 00.

73

74

annamaria mazzia

(c) Partendo da x0 e x1 del metodo di Newton-Raphson, la Regula Falsi dà: k

xk

f ( xk )

0 1 2 3

0.50000000E+00 0.86588831E+00 0.97291038E+00 0.99920448E+00

-0.18294415E+01 -0.41401211E+00 -0.81656072E-01

f ( x n ) − f ( x n −1 ) x n − x n −1 0.38684741E+01 0.31054906E+01

Esercizio 5.14.3 Provare, anche solo graficamente, che l’equazione f ( x ) = sin ( x ) + x − 1 = 0 ammette una sola radice ξ nell’intervallo [0, 1]. (a) Dire se lo schema del punto fisso con g( x ) = arcsin (1 − x ) può convergere. (b) Partendo da x0 = 0.1 calcolare le approssimazioni x1 , x2 e x3 con lo schema di Newton-Raphson; (c) Dare una stima del fattore di convergenza.

Svolgimento Graficamente, da f ( x ) = 0 si ha sin ( x ) = 1 − x. Se si studia l’intersezione delle due curve, sin ( x ) e 1 − x nell’intervallo [0, 1], si può osservare una sola intersezione, cioè una sola radice della f (fare il grafico delle due funzioni). Analiticamente, la funzione f ( x ) assume valori di segno opposto agli estremi dell’intervallo dato: f (0) = sin (0) + 0 − 1 = −1 f (1) = sin (1) + 1 − 1 = 0.8414709848 La derivata prima della f è f 0 = cos ( x ) + 1: è funzione continua e sempre positiva nell’intervallo [0, 1]. Quindi f è una funzione crescente e interseca l’asse delle x solo una volta in [0, 1], vale a dire ammette un’unica radice. (a) Da f ( x ) = 0 si ha sin ( x ) + x − 1 = 0 o, equivalentemente, sin ( x ) = 1 − x, da cui x = arcsin (1 − x ). Consideriamo perciò lo schema del punto fisso con g( x ) data da 1 g( x ) = arcsin (1 − x ). La derivata di g( x ) è g0 ( x ) = p . 1 − (1 − x )2 Nell’intervallo [0, 1] valgono le seguenti disuguaglianze: 0 ≤ x ≤ 1 =⇒ 0 ≥ − x ≥ −1 =⇒ 1 ≥ 1 − x ≥ 0 =⇒

=⇒ 1 ≥ (1 − x )2 ≥ 0 =⇒ −1 ≤ −(1 − x )2 ≤ 0 =⇒ 0 ≤ 1 − (1 − x )2 ≤ 1 =⇒ q 1 =⇒ 0 ≤ 1 − (1 − x )2 ≤ 1 =⇒ 1 ≤ p 1 − (1 − x )2

appunti di calcolo numerico

Perciò g0 ( x ) è sempre maggiore di 1 e lo schema del punto fisso non può convergere. (b) Da f ( x ) = sin ( x ) + x − 1 si ha f 0 ( x ) = cos ( x ) + 1 e f 00 ( x ) = − sin ( x ). Il metodo di Newton-Raphson è: x k +1 = x k −

sin ( x ) + x − 1 . cos ( x ) + 1

Utilizziamo la notazione M1 e M2 per indicare la stima della costante asintotica dell’errore mediante le formule M1 =

| x k +1 − x k | | x k − x k −1 | 2

o

M2 =

| f 00 ( xk )| 2| f 0 ( xk )|

Partendo da x0 = 0.1 si ottengono i seguenti valori:

k 0 1 2 3

xk 0.1 0.50108517E+00 0.51096084E+00 0.51097343E+00

f ( xk ) -0.80016658E+00 -0.18537249E-01 -0.23565955E-04 -0.38737166E-10

f 0 ( xk ) 0.19950042E+01 0.18770618E+01 0.18722750E+01 -

| x k − x k −1 | 0.40108517E+00 0.98756733E-02 0.12586802E-04

(c) La stima del fattore di convergenza è dato da M1 = 0.12905712E+00 o da M2 = 0.13059731E+00, a seconda della strada scelta per dare la stima.

Esercizio 5.14.4 Data l’equazione f ( x ) = ln ( x ) + x2 − x = 0, (a) si provi, anche solo graficamente, che l’equazione ammette l’unica radice ξ = 1 nell’intervallo [0.7, 2.3]; (b) si applichino due iterazioni del metodo dicotomico (o delle bisezioni) a partire dall’intervallo dato, chiamando con x0 l’ultimo valore ottenuto con tale metodo; (c) a partire da x0 del punto (b) si calcoli l’approssimazione x1 con il metodo di Newton-Raphson; (d) a partire da x0 e x1 del punto (c) si calcolino le approssimazioni x2 e x3 con il metodo della Regula Falsi; (e) considerata la radice esatta ξ = 1, si calcoli la costante asintotica di convergenza del metodo della Regula Falsi.

Svolgimento (a) Da f ( x ) = 0 si ricava ln ( x ) = x − x2 , per cui graficamente si può vedere che le due curve si intersecano in un solo punto, che vale ξ = 1.

75

76

annamaria mazzia

Analiticamente, invece, la funzione f ( x ) assume valori di segno opposto agli estremi dell’intervallo dato: f (0.7) = −0.566674943938732 f (2.3) = 3.8229091229351 Inoltre f è continua, quindi ammette almeno una radice nell’inter1 vallo dato. La derivata prima è: f 0 ( x ) = + 2x − 1, che possiamo x 1 + 2x2 − x 0 anche scrivere come f ( x ) = : numeratore e denominax tore sono entrambi sempre positivi nell’intervallo dato, (la parabola 2x2 − x + 1 ha discriminante negativo ∆ = −7, di conseguenza, per ogni x reale si ha 2x2 − x + 1 > 0). Da f 0 ( x ) > 0 per ogni x segue che f è crescente e, quindi, ammette un’unica radice. (b) Applichiamo il metodo delle bisezioni a partire dall’intervallo dato (utilizziamo la notazione xs per indicare l’estremo sinistro dell’intervallo, xd per indicare l’estremo destro dell’intervallo, xc , il punto medio dell’intervallo considerato):

iter. 1 2

xs 0.7 0.7

f ( xs ) -0.566674944 -0.566674944

segno -

xd 2.3 1.5

f ( xd ) 3.822909123 1.155465108

segno + +

xc 1.5 1.1

Il valore x0 è dunque x0 = 1.1. f ( xk ) dove f 0 = f 0 ( xk ) 0.20531018 1/x + 2x − 1. Partendo da x0 = 1.1, si ricava x1 = 1.1 − = 2.1090909 1.002654656

(c) Il metodo di Newton-Rapshon è xk+1 = xk −

(d) Applicando il metodo della Regula Falsi si ha:

k

xk

f ( xk )

1 2 3

1.002654656 1.000068720 1.000000046

0.5312842078E-02 0.1374413812E-03

f ( x k ) − f ( x k −1 ) x k − x k −1 0.2054513650E+01 0.2001364094E+01

(e) Considerato che la radice esatta è ξ = 1, la costante asintotica di convergenza della Regula Falsi si calcola utilizzando l’espresf 00 (ξ ) 0.618 1 sione M = | 0 | . Da f 0 ( x ) = + 2x − 1 segue f 0 (1) = 2 2 f (ξ ) x 1 1 0.618 e f 00 ( x ) = − 2 + 2, da cui f 00 (1) = 1, per cui M = = 4 x 0.4245481.

f ( xc ) 1.155465108 0.205310180

appunti di calcolo numerico

Esercizio 5.14.5 Data la funzione f ( x ) = ln(3 + 2x − x2 ) − x (a) dimostrare esistenza della soluzione ξ dell’equazione f ( x ) = 0 nell’intervallo [0, 2.5]; (b) approssimare ξ con il metodo di Newton Raphson, a partire dal punto iniziale x0 = 1, arrestandosi quando il valore assoluto dello scarto è inferiore a 10−3 . Usando gli scarti, stimare la costante asintotica M e l’errore finale.

Svolgimento (a) La funzione è continua e assume segni opposti agli estremi dell’intervallo. f (0) = 1.09861228866811 > 0 f (2.5) = −1.94038421206458 < 0. Quindi esiste almeno una radice. Osserviamo che in questo esercizio è richiesta solo l’esistenza e non esistenza e unicità della radice.

(b) Per applicare il metodo di Newton-Raphson, consideriamo la derivata prima della f : 2 − 2x − 1. Si ha: f 0 (x) = 3 + 2x − x2 k 0 1 2 3

xk 1.00000000000000 0.1386294361E+01 0.1354628119E+01 0.1354392386E+01

f ( x k −1 )

f 0 ( x k −1 )

dk

0.3862943611E+00 -0.3801950159E-01 -0.2788886518E-03

-0.1000000000E+01 -0.1200631922E+01 -0.1183069825E+01

0.3862944E+00 0.3166624E-01 0.2357330E-03

Ci fermiamo alla terza iterazione, perchè lo scarto è diventato minore della tolleranza 10−3 richiesta.

| x3 − x2 | = | x2 − x1 |2 0.2350863. Per una stima dell’errore commesso, si può utilizzare il fatto che, per il metodo di Newton-Raphson vale ek < dk e, quindi, dire che e3 ≤ 0.2357330E − 03. Se si vuole essere particolarmente precisi, dalla relazione dk+1 ≈ ek (ricavata nell’Esemd pio 5.6), e considerando che k+2 1 ≈ M, abbiamo e3 ≈ d4 ≈ Md23 = dk 2 0.2350863 · (0.2357330E − 03) = 1.306375E − 08. Usando gli scarti, la stima per la costante asintotica vale

77

78

annamaria mazzia

Esercizio 5.14.6 Si vuole risolvere l’equazione x = g( x ) con lo schema del punto fisso. Sapendo che g( x ) = x2 − 8x + 20.25 calcolarne analiticamente il punto fisso e determinare: (a) il fattore di convergenza M1 dello schema del punto fisso e successivamente le approssimanti x1 , x2 , x3 usando prima x0 = 4 e poi x0 = 5.5, giustificandone il diverso comportamento. Risolvere quindi f ( x ) = 0 ove f ( x ) = g( x ) − x con lo schema di Newton-Raphson; calcolare (b) il fattore di convergenza M2 dello schema di Newton-Raphson e le approssimanti x1 , x2 , x3 ottenute con lo schema partendo da x0 = 4 (c) le approssimanti x1 , x2 , x3 ottenute con lo schema di NewtonRapshon modificato e x0 = 4.

Svolgimento Da g( x ) = x si ha x2 − 8x + 20.25 = x. Risolvendo l’equazione di secondo grado x2 − 9x + 20.25 = 0 si trova la radice doppia (con molteplicità r = 2) ξ = 4.5. (a) Conoscendo il punto fisso, possiamo calcolare M1 = | g0 (4.5)| = 1. A priori non possiamo dire nulla sulla convergenza dello schema. Partendo da x0 = 4 e applicando lo schema troviamo x1 = 4.25, x2 = 4.3125, x3 = 4.34765625. Si vede che lo schema va a convergenza. Partendo da x0 = 5.5 si ha x1 = 6.5, x2 = 10.5, x3 = 46.5. Il metodo sta divergendo. Il diverso comportamento è dovuto proprio al fatto che g0 (ξ ) = 1. Consideriamo ora f ( x ) = g( x ) − x = x2 − 9x + 20.25. Sappiamo già che questo polinomio ha una radice doppia e f ( x ) può essere riscritta come f ( x ) = ( x − 4.5)2 (quindi f 0 ( x ) = 2( x − 4.5)). (b) Se pensiamo che il metodo di Newton-Raphson abbia conver| f 00 (ξ ) genza quadratica, ci accorgiamo che la formula M2 = | 2| f 0 ( ξ ) non può essere applicata perché f 0 (ξ ) = f 0 (4.5) = 0 (e dovrebbe suonare un campanello di allarme). Se però ci ricordiamo che il punto fisso che abbiamo appena calcolato è una radice doppia per la f , allora sappiamo che il metodo sarà a convergenza lineare e che vale M2 = (r − 1)/r con r = 2 la molteplicità della radice. Quindi M2 = 0.5. Il metodo di Newton-Raphson è xn+1 = xn − ( xn − 4.5)/2. Partendo da x0 = 4 si ha x1 = 4.25 , x2 = 4.375, x3 = 4.4375 (si vede bene come la convergenza sia lineare.)

appunti di calcolo numerico

(c) Il metodo di Newton-Raphson modificato diventa xn+1 = xn − 2( xn − 4.5)/2 = xn − ( xn − 4.5) = 4.5 Partendo da x0 = 4 otteniamo x1 = x2 = x3 = 4.5, cioè arriviamo a convergenza in una sola iterazione.

5.15

Domande di riepilogo

1. Cosa significa che ξ è uno zero di una funzione f ? 2. Nell’applicare il metodo delle bisezioni ad una funzione f ( x ) in un certo intervallo [ a, b], quante iterazioni occorre fare per ricavare un’approssimazione di una radice della f a meno di una tolleranza tol? Ricavare la formula spiegando tutti i passaggi. 3. Data una funzione y = g( x ), cosa è un punto fisso della g? Come si può riconoscere, graficamente, se una funzione g ha un punto fisso? 4. Qual è lo schema iterativo del metodo di punto fisso? Quali sono le ipotesi che devono valere perchè lo schema di punto fisso, applicato ad una funzione g, converga ad un punto fisso ξ della g? Dimostrare. 5. Dato un metodo iterativo (per approssimare le radici o il punto fisso di una funzione), che significa che il metodo ha ordine di convergenza p? Qual è la costante asintotica o fattore di convergenza associato a p? 6. Si ricavi l’ordine di convergenza e la costante asintotica per lo schema di punto fisso applicato ad una funzione g( x ) con punto fisso ξ per il quale g0 (ξ ) 6= 0. 7. Si ricavi l’ordine di convergenza e la costante asintotica per lo schema di punto fisso applicato ad una funzione g( x ) con punto fisso ξ per il quale g0 (ξ ) = 0 e g00 (ξ ) 6= 0. 8. Qual è la formula del metodo di Newton-Raphson e come si può ricavare la formula partendo dalla formula di Taylor? 9. Qual è la formula del metodo di Newton-Raphson e come si può ricavare la formula partendo da una rappresentazione grafica? 10. Il metodo di Newton-Raphson si può vedere come un caso particolare di schema di punto fisso? Che cosa si può dedurre? Perché diciamo che lo schema di Newton-Raphson è generalmente convergente? 11. Si ricavi l’ordine di convergenza e la costante asintotica del metodo di Newton-Raphson, nel caso generale. Quale ipotesi viene fatta?

79

80

annamaria mazzia

12. Si ricavi l’ordine di convergenza e la costante asintotica del metodo di Newton-Raphson nel caso in cui la radice ξ ha molteplicità 2. 13. Cosa significa che ξ è una radice con molteplicità r (r intero maggiore o uguale a 2) per una funzione f ? 14. Se una radice ξ ha molteplicità r cosa succede al metodo di Newton-Raphson? Cosa si deve fare per ripristinare l’ordine di convergenza? 15. Si ricavi l’ordine di convergenza e la costante asintotica del metodo di Newton-Raphson nel caso in cui la radice ξ è un punto di flesso non orizzontale e f 000 (ξ ) 6= 0. 16. Descrivere geometricamente il metodo delle secanti variabili (detto anche Regula Falsi). 17. In genere che ordine ha il metodo delle secanti variabili e qual è la costante asintotica? (Dire solo i valori: non abbiamo dimostrato nessun teorema.) 18. Se si applica il metodo delle secanti variabili per approssimare una radice con molteplicità r, che ordine di convergenza ha il metodo? (Dire solo che cosa succede.) 19. Qual è la definizione di scarto all’iterazione n? 20. Qual è l’indice di efficienza di un metodo iterativo? 21. Nel fare un grafico di convergenza in scala logaritmica sull’asse delle ordinate (sull’asse delle ascisse si pongono gli indici delle iterazioni e sull’asse delle ordinate i logaritmi degli scarti), per un metodo a convergenza lineare, cosa si può dire sulla pendenza della retta e perché? 22. Se non si conosce l’ordine di convergenza di un metodo e lo si vuole ricavare facendo riferimento esclusivamente ai valori degli scarti, quale formula va applicata? Da dove si ricava?

6 Interpolazione 6.1

Un problema reale

I termistori (o termoresistenze) sono apparecchi che misurano la temperatura, basati sul principio che un materiale termoresistente mostra una variazione nella resistenza elettrica al variare della temperatura. Perciò, misurando la resistenza di un materiale termistore, si puo’ determinare la temperatura. In genere, i termistori sono fatti di materiali semiconduttori (manganese, nickel, cobalto, etc.). E si classificano secondo due tipi: i termoresistori NTC (coefficienti a temperatura negativa) e termoresistori PTC (coefficienti a temperatura positiva). Nei primi, i più usati, la resistenza decresce con l’aumentare della temperatura, nei secondi la resistenza aumenta all’aumentare della temperatura. I termistori possono essere utilizzati per misurare la temperatura, a motivo della loro alta sensibilità e della loro veloce risposta alle variazioni di temperatura. Quando viene preparato un termistore, l’industria che li prepara fornisce una curva della resistenza al variare della temperatura, data da

Non vi è alcuna incompatibilità fra l’esatto e il poetico. Il numero è nell’arte come nella scienza. L’algebra è nell’astronomia e l’astronomia confina con la poesia. L’anima dell’uomo ha tre chiavi che aprono tutto: la cifra, la lettera, la nota. Sapere, pensare, sognare. Victor Hugo

1 = a0 + a1 ln ( R) + a2 (ln ( R))2 + a3 (ln ( R))3 T nota come equazione di Steinhart-Hart e nella quale T è la temperatura (in Kelvin), R è la resistenza (in Ohm), mentre a0 , a1 , a2 e a3 sono le costanti della curva di calibrazione. Facendo un cambiamento di 1 variabile e, precisamente, ponendo y = e x = ln ( R), la curva di T calibrazione diventa il polinomio y = a0 + a1 x + a2 x 2 + a3 x 3 Se si riescono a calcolare le costanti a0 , a1 , a2 e a3 , allora si può usare la curva di calibrazione per trovare la temperatura al variare della resistenza. Supponiamo di essere in possesso dei dati espressi in Tabella 6.1 per un determinato termistore. Come possiamo usare questi valori per trovare le costanti della curva di calibrazione? Per prima cosa, si passa dai valori della temperatura in gradi Celsius ai gradi Kelvin, mediante la formula K =o C + 273.15, poi dai valori R e T, passiamo alle variabili x e y (costruendo la nuova Tabella, riportata di lato).

R

T

oC Ohm 1101.0 25.113 911.3 30.131 636.0 40.120 451.1 50.128 Tabella 6.1: Valori di Resistenza e Temperatura di un termistore.

x = ln ( R)

y = 1/T

7.0040 3.3527×10−3 6.8149 3.2973×10−3 6.4552 3.1921×10−3 6.1117 3.0933×10−3 Tabella 6.2: Tabella con le nuove variabili x e y.

82

annamaria mazzia

Successivamente, cerchiamo una funzione (nell’esempio che stiamo considerando, un polinomio di grado 3) che passi esattamente per i dati assegnati (detti anche punti di appoggio), in modo da ricavare le costanti incognite: questo procedimento prende il nome di interpolazione ed è il soggetto di questo Capitolo. In particolare, dato l’insieme dei punti ( xi , yi ), i = 0, 1, . . . , n, dove yi è il valore assunto da una funzione f in xi o il valore di un dato sperimentale, cerchiamo una funzione v( x ) che, in maniera ragionevole si addica all’insieme dei dati. Se i dati sono accurati, ha senso richiedere che la funzione interpoli i dati (cioè passi esattamente per le coppie di punti): v( xi ) = yi .

6.2

Figura 6.1: I valori x e y della Tabella messi in grafico. Le ascisse xi sono dette anche nodi di interpolazione.

Interpolazione

Una funzione di interpolazione v( x ) serve per vari scopi.

x

Possiamo usare la v( x ) per trovare valori approssimati y in punti x diversi da quelli assegnati x0 , x1 , . . . xn . Se x si trova all’interno dell’intervallo che contiene le ascisse dei dati assegnati si parla di interpolazione. Se invece x si trova all’esterno dell’intervallo si parla di estrapolazione.

Figura 6.2: Il polinomio che passa esattamente per i dati x e y assegnati è

y = 3.0091 × 10−3 − 4.5307 × 10−4 x + 1.0853 × 10−4 x2 − 5.26 × 10−6 x3 .

x

Se le coppie di dati assegnati si riferiscono ad una funzione f ( x ), la funzione di interpolazione può essere utile per approssimare le derivate o gli integrali della f .

Assumiamo che la funzione v di interpolazione sia una combinazione lineare di funzioni base di un qualche appropriato spazio di funzioni, cioè si possa scrivere come v( x ) = c0 φ0 ( x ) + . . . + cn φn ( x ) dove ci , i = 0, 1, . . . , n sono i coefficienti incogniti (o parametri) da determinare in base ai dati in possesso, mentre φi sono le funzioni base che assumiamo linearmente indipendenti. Esempi di interpolazione sono dati dall’interpolazione polinomiale, dall’interpolazione polinomiale a tratti, dall’interpolazione trigonometrica. Noi ci limitiamo a studiare l’interpolazione polinomiale e a vedere dei cenni di interpolazione polinomiale a tratti. Consideriamo, per prima, l’interpolazione polinomiale: date n + 1 coppie di punti ( xi , yi ), per i = 0, 1, . . . , n, andremo a cercare un polinomio p( x ) di grado n per cui p( xi ) = yi . Parleremo, dunque, di polinomio di interpolazione p( x ) (v( x ) ≡ p( x )). Il processo di interpolazione si basa su due stadi:

x

costruire la funzione interpolante, cioè determinare i coefficienti c0 , c1 , . . . , cn per un’assegnata base φ0 , φ1 , . . . , φn ;

x

valutare la funzione interpolante in un assegnato punto x.

funzioni φ0 , φ1 , . . . , φn si dicolinearmente indipendenti se c0 φ0 ( x ) + . . . cn φn ( x ) ≡ 0 per ogni x 6= 0 se e solo se tutti i coefficienti sono nulli c0 = . . . = cn = 0. Le no

Il primo punto è fatto una volta per tutte, una volta fissata la base e noto l’insieme dei punti da interpolare. Il secondo punto può essere applicato tutte le volte che si vuole valutare la funzione interpolante.

appunti di calcolo numerico

6.3

83

Interpolazione polinomiale

L’interpolazione polinomiale è il tipo di interpolazione più semplice. I polinomi, infatti, sono facili da costruire e da valutare, sono facili da sommare e moltiplicare (e il risultato è sempre un polinomio) e sono altrettanto facili da differenziare e integrare (e il risultato è sempre un polinomio). Sia p( x ) = pn ( x ) un polinomio di grado n dato da p n ( x ) = c0 + c1 x + . . . + c n x n Date n + 1 coppie di punti ( x0 , y0 ), ( x1 , y1 ), . . ., ( xn , yn ), vogliamo trovare gli n + 1 coefficienti c0 , c1 , . . . cn tali che p( xi ) = yi , i = 0, . . . , n. Assumiamo, inoltre, che le ascisse delle coppie dei punti siano distinte, cioè xi 6= x j , per i 6= j.

6.3.1

Ricordiamo che, un polinomio di grado n ha n + 1 coefficienti e che, date n + 1 coppie di punti, il polinomio interpolatore sarà di grado n.

Funzioni base monomiali Utilizziamo come funzioni base i monomi x0 , x1 , x2 , . . . , x n .

In questo caso, le funzioni base φi ( x ) sono date da φi ( x ) = xi , per i = 0, 1, . . . , n.

Esempio Sia n + 1 = 2: abbiamo quindi due coppie di dati xi yi

1 1

2 3

Cerchiamo quindi un polinomio di primo grado (una retta) che passi per i punti assegnati, della forma p( x ) = p1 ( x ) = c0 + c1 x. Le condizioni di interpolazione diventano: p1 ( x0 ) = y0 ⇐⇒ c0 + 1c1 = 1 p1 ( x1 ) = y1 ⇐⇒ c0 + 2c1 = 3 Abbiamo due equazioni in due incognite c0 e c1 . Risolvendo il sistema 2 × 2 otteniamo c1 = 2 e c0 = −1, quindi p1 ( x ) = 2x − 1. _ Esempio Consideriamo adesso un ulteriore coppia di punti per cui i dati che abbiamo sono n + 1 = 3 e xi yi

1 1

2 3

4 3

Il problema è ora diverso rispetto a quello appena risolto, perchè la terza coppia di punti specifica una valore y2 ben diverso da quello predetto da p1 in x2 = 4. Difatti p1 ( x2 ) = 7, nell’esempio precedente, mentre ora al valore di x2 = 4 deve corrispondere y2 = 3. Cerchiamo il polinomio di grado 2, quindi, della forma p2 ( x ) = c0 + c1 x + c2 x2 che passa attraverso i punti dati. Le condizioni di interpolazione adesso sono:     p2 ( x0 ) = c0 + 1c1 + 1c2 = 1 p2 ( x1 ) = c0 + 2c1 + 4c2 = 3

  

p2 ( x2 ) = c0 + 4c1 + 16c2 = 3

84

annamaria mazzia

Abbiamo un sistema lineare di 3 equazioni in 3 incognite, la cui 7 2 soluzione è: c0 = − , c1 = 4, c2 = − . 3 3 Il polinomio è p2 ( x ) = (−2x2 + 12x − 7)/3. Per x = 3 si ha 11 = 3.666666667, valore ben diverso da p1 (3) = 5. Del resto p2 (3) = 3 le curve che abbiamo ottenuto coincidono solo nei punti d’appoggio comuni a entrambe, una è una retta, l’altra è un polinomio di secondo grado (si veda Figura 6.3). _ Generalizzando gli esempi precedenti, date n + 1 coppie di punti, il polinomio di interpolazione di grado n sarà costruito risolvendo un sistema lineare di n equazioni nelle n incognite c0 , c1 , . . . , cn :   pn ( x0 ) = y0 ⇐⇒ c0 + c1 x0 + c2 x02 + . . . + cn x0n = y0      p ( x ) = y1 ⇐⇒ c0 + c1 x1 + c2 x12 + . . . + cn x1n = y1    n 1 pn ( x2 ) = y2 ⇐⇒ c0 + c1 x2 + c2 x22 + . . . + cn x2n = y2   ..  ...  .     pn ( xn ) = yn ⇐⇒ c0 + c1 xn + c2 xn2 + . . . + cn xnn = yn In forma compatta, sotto forma matriciale le equazioni del sistema si possono scrivere come      1 x0 x02 . . . x0n c0 y0 1 x y  2 . . . xn   c  x 1   1 1 1   1      1 x2 x22 . . . x2n   c2  =  y2       .. .. ..   ..   ..   .. . . . .  .   .  2 1 xn xn . . . xnn cn yn La matrice dei coefficienti è una matrice ben nota in letteratura e prende il nome di matrice di Vandermonde. È una matrice con determinante diverso da zero, e quindi il sistema ammette una ed una sola soluzione. Osserviamo che la prima colonna ha tutti gli elementi uguali a 1, la seconda colonna ha le ascisse dei punti di appoggio, la terza colonna ha i quadrati di esse, e così via.

Figura 6.3: Interpolazione lineare e quadratica

Questo argomento verrà approfondito nel Capitolo 9, dove rimandiamo per i dettagli.

Alexandre-Theophile Vandermonde, (17351796), abbandonò una carriera da violinista per dedicarsi alla matematica quando aveva 35 anni. Si occupò di vari problemi di algebra, di topologia, calcolo combinatoriale, e teoria dei determinanti.

Perciò, date n + 1 coppie di punti di appoggio ( xi , yi ), i = 0, . . . , n, con ascisse distinte xi , esiste un unico polinomio interpolatore p( x ) di grado al più n tale che p( xi ) = yi , i = 0, . . . , n. Tuttavia, la matrice di Vandermonde non ha buone proprietà: difatti è una matrice malcondizionata, e questo lo si osserva al crescere di n in quanto la soluzione del sistema diventa inaccurata, qualunque metodo venga utilizzato per risolverlo. Questo approccio ci è servito per dimostrare che il polinomio di interpolazione esiste ed è unico, ma non è utile nella pratica a causa del malcondizionamento. Sarebbe preferibile, quindi, poter usare funzioni base diverse dai monomi in modo da evitare il malcondizionamento, avere meno operazioni dal punto di vista computazionale e poter manipolare in maniera più efficiente le funzioni basi φi in vista di una loro applicazione nella differenziazione e integrazione numerica.

Una matrice A è malcondizionata quando, a piccole variazioni sui coefficienti della matrice, corrispondono grandi variazioni nella soluzione del sistema lineare Ax = b

appunti di calcolo numerico

6.3.2

85

Polinomi di Lagrange

Scriviamo il polinomio p( x ) con i coefficienti ci uguali alle ordinate dei punti d’appoggio yi , ci ≡ yi :

Così facendo i coefficienti ci non sono incognite! Bisogna ora capire come scrivere le funzioni di base φi ( x ).

p( x ) = pn ( x ) = y0 φ0 ( x ) + . . . yn φn ( x ) Una base di funzioni che ci permette una simile rappresentazione è data dai polinomi di Lagrange. I polinomi di Lagrange L j ( x ), per j = 0, 1, . . . , n sono polinomi di grado n che, nei nodi xi , soddisfano la relazione  0 se i 6= j L j ( xi ) = 1 se i = j

Joseph Louis Lagrange (1736-1813) nacque a Torino (come Giuseppe Luigi Lagrangia) e si trasferì in Francia, a Parigi, dove divenne cittadino francese adottando la traduzione francese del suo nome. Matematico e astronomo, diede un importante contributo alla meccanica classica e celeste e alla teoria dei numeri.

In questo modo, il polinomio pn ( x ) = ∑nj=0 L j ( x ) · y j è tale che pn ( xi ) = yi cioè soddisfa la condizione di interpolazione, per ogni i = 0, . . . , n. I polinomi di Lagrange sono definiti dalla relazione: n

L j (x) =

Ricordiamo che, dati n valori w1 , w2 , . . . , wn usiamo la seguente simbologia per indicare la loro somma e il loro prodotto, rispettivamente:

(x − x )

∏ (x j − xkk )

k =0 k6= j

n

∑ w i = w1 + w2 + w3 + . . . + w n

In forma estesa abbiamo

i =1 n

n

L j (x) =

( x − x0 ) · · · ( x − x j−1 )( x − x j+1 ) · · · ( x − xn ) x − xk = ( x j − x0 ) · · · ( x j − x j−1 )( x j − x j+1 ) · · · ( x j − xn ) k∏ x − xk =0 j

∏ w i = w1 · w2 · w3 · . . . · w n

.

i =1

k6= j

Esempio Siano date le tre coppie di punti dell’esempio precedente (1, 1), (2, 3), (4, 3). I polinomi di Lagrange sono:

( x − 2)( x − 4) ( x − 2)( x − 4) = (1 − 2)(1 − 4) 3 ( x − 1)( x − 4) ( x − 1)( x − 4) L1 ( x ) = =− (2 − 1)(2 − 4) 2 ( x − 1)( x − 2) ( x − 1)( x − 2) L2 ( x ) = = (4 − 1)(4 − 2) 6 L0 ( x ) =

Figura 6.4: Polinomi di Lagrange L0 ( x ), L1 ( x ), L2 ( x ), con x0 = 1, x1 = 2, x2 = 4. Si osservi, per ciascuno di essi, la proprietà per la quale L j ( xi ) = 1 se i = j e L j ( xi ) = 0 se i 6= j.

Il polinomio si scrive, quindi, come p2 ( x ) = L0 ( x ) · 1 + L1 ( x ) · 3 + L2 ( x ) · 3 =

1 3 3 ( x − 2)( x − 4) − ( x − 1)( x − 4) + ( x − 1)( x − 2) 3 2 6

Raccogliendo i termini ritroviamo p2 ( x ) = (−2x2 + 12x − 7)/3, lo stesso polinomio ottenuto con le funzioni base monomiali, e ciò è dovuto all’unicità del polinomio interpolatore. _

6.3.3

Formula dell’errore

Supponiamo, ora, che le ordinate yi siano i valori di una funzione f continua in un intervallo [ a, b] (e con le derivate fino all’ordine n + 1

86

annamaria mazzia

continue) valutata nei punti di appoggio xi . Per ipotesi, i punti xi siano distinti tra loro. Conosciamo, quindi, una funzione f e di questa funzione vogliamo fare l’interpolazione sostituendola mediante un polinomio di grado n tale che p( xi ) = f ( xi ) = yi , i = 0, . . . , n. In queste ipotesi, l’errore che si commette interpolando la funzione f con un polinomio p( x ) di grado n vale f ( x ) − p( x ) =

f (n+1) (ξ ( x )) ( n + 1) !

n

∏ ( x − xi )

i =0

dove ξ ( x ) è un punto, che non conosciamo e che dipende da x, che si trova all’interno dell’intervallo [ a, b]. La formula che abbiamo scritto per l’errore è anche chiamata formula del resto di Lagrange. Dimostrazione della formula del resto di Lagrange. Proviamo questo risultato introducendo il polinomio F ( x ) di grado n + 1 che si annulla nelle n + 1 ascisse dei dati assegnati. n

F(x) =

∏ ( x − xk )

k =0

Consideriamo, inoltre, un punto t distinto dai punti di appoggio e compreso nell’intervallo individuato dai valori minimo e massimo delle ascisse dei punti di appoggio. f (t) − p(t) Definiamo la quantità S che dipende da t, data da S = F (t) e la funzione G ( x ) = f ( x ) − p( x ) − SF ( x ). La funzione G si annulla non solo negli n + 1 punti d’appoggio poichè G ( xi ) = f ( xi ) − p( xi ) − SF ( xi ) = 0 per i = 0, . . . , n ma anche in t a causa di come è stato definito S. Si annulla, quindi, in n + 2 punti. Per il teorema di Rolle, la derivata prima si annulla n + 1 volte nell’intervallo (individuato dalle ascisse dei punti di appoggio). Applicando ripetutamente il teorema di Rolle sulle derivate successive, si arriva alla derivata n + 1-sima di G, che si annulla almeno 1 volta nell’intervallo. Sia ξ il punto in cui G (n+1) (ξ ) = 0. Ma G ( n +1) ( ξ ) = f ( n +1) ( ξ ) − S ( n + 1 ) ! Si ha perciò: f ( n +1) ( ξ ) − S ( n + 1 ) ! = 0

ovvero

f (t) − p(t) f ( n +1) ( ξ ) =S= F (t) ( n + 1) !

Considerando, ora, x al posto di t, e scrivendo ξ come funzione di x (in quanto il valore di ξ dipende da x) e scrivendo in forma estesa il polinomio F ( x ), otteniamo f ( x ) − p( x ) =

f (n+1) (ξ ( x )) ( n + 1) !

n

∏ ( x − xk )

k =0

Il resto normalmente è incognito ma se conosciamo la f e una maggion

razione della f (n+1) , e abbiamo un limite superiore per | ∏ ( x − xk )|, k =0

allora possiamo maggiorare l’errore di interpolazione.

La derivata n + 1-sima di un polinomio di grado n è una quantità nulla, mentre la derivata n + 1-sima di un polinomio di grado n + 1, quale è F ( x ), vale (n + 1)!.

appunti di calcolo numerico

6.3.4

87

Differenze divise e formula di Newton

Uno dei punti forti della rappresentazione di Lagrange è che se alcuni dati cambiano (ad esempio il valore di y j per un certo j) allora il cambiamento è immediatamente visibile nell’intero polinomio di interpolazione. Uno dei punti deboli, invece, è la procedura per valutare pn ( x ). Con la formula di Newton, al contrario, abbiamo un utile compromesso. Le funzioni base che ora consideriamo sono j −1

φj ( x ) =

∏ ( x − xi )

j = 0, 1, . . . , n

i =0

Questa volta, scriveremo il polinomio di interpolazione come: p( x ) = c0 + c1 ( x − x0 ) + c2 ( x − x0 )( x − x1 ) + . . . + cn ( x − x0 )( x − x1 ) · . . . ( x − xn−1 ) dove c0 , c1 . . . cn sono delle costanti da definire in modo opportuno. Vediamo in che modo con l’esempio che segue. Esempio Consideriamo sempre le tre coppie di punti degli esempi precedenti, (1, 1), (2, 3) e (4, 3). Per costruire p2 ( x ) abbiamo bisogno di φ0 , φ1 e φ2 :

Questo esempio ci permette di capire come si costruiscono i coefficienti c0 , c1 , ....

φ0 ( x ) = 1 φ1 ( x ) = ( x − x0 ) = ( x − 1) φ2 ( x ) = ( x − x0 )( x − x1 ) = ( x − 1)( x − 2) La condizione di interpolazione in x0 = 1 porta a: f ( x0 ) = 1 = p2 ( x0 ) = p2 (1) = c0 φ0 (1) + c1 φ1 (1) + c2 φ2 (1) = c0 · 1 + c1 · 0 + c2 · 0 Quindi c1 = 1 = f ( x0 ). In x1 = 2 abbiamo: f ( x1 ) = 3 = p2 ( x1 ) = p2 (3) = f ( x0 ) + c1 φ1 (2) + c2 φ2 (2) = f ( x0 ) + c1 · 1 + c2 · 0 f ( x1 ) − f ( x0 ) 3−1 = = 2. Chiamiamo x1 − x0 2−1 questa quantità differenza divisa del primo ordine tra x0 e x1 e la indichiamo con f [ x0 , x1 ]. Quindi Ricaviamo quindi c1 =

c1 = f [ x0 , x1 ] =

f ( x1 ) − f ( x0 ) x1 − x0

Infine, f ( x2 ) = 3 = p2 ( x2 ) = p2 (4) = f ( x0 ) + f [ x0 , x1 ]φ1 (4) + c2 φ2 (4)

= f ( x0 ) + f [ x0 , x1 ](4 − 1) + c2 (4 − 1)(4 − 2) Per ottenere una formula per c2 che abbia carattere generale, riscriviamo l’equazione precedente utilizzando i simboli x0 , x1 , x2 per le ascisse. In x1 si ha f ( x1 ) = p2 ( x1 ) = f ( x0 ) + f [ x0 , x1 ]( x1 − x0 ).

88

annamaria mazzia

In x2 si ha f ( x2 ) = p2 ( x2 ) = f ( x0 ) + f [ x0 , x1 ]( x2 − x0 ) + c2 ( x2 − x0 )( x2 − x1 ). Sottraendo membro a membro la prima equazione dalla seconda si ricava: f ( x2 ) − f ( x1 ) = f [ x0 , x1 ] [( x2 − x0 ) − ( x1 − x0 )] + c2 ( x2 − x0 )( x2 − x1 ) vale a dire f ( x2 ) − f ( x1 ) = f [ x0 , x1 ]( x2 − x1 ) + c2 ( x2 − x0 )( x2 − x1 ) Quindi f ( x2 ) − f ( x1 ) − f [ x0 , x1 ]( x2 − x1 ) = c2 ( x2 − x0 )( x2 − x1 ) f ( x2 ) − f ( x1 ) x − x1 − f [ x0 , x1 ] 2 = c2 ( x2 − x0 ) x2 − x1 x2 − x1 f ( x2 ) − f ( x1 ) − f [ x0 , x1 ] = c2 ( x2 − x0 ) x2 − x1 f ( x2 ) − f ( x1 ) = f [ x1 , x2 ] è la differenza divisa del primo ordine x2 − x1 tra x1 e x2 da cui Ma

f [ x1 , x2 ] − f [ x0 , x1 ] = c2 ( x2 − x0 )

=⇒ c2 =

f [ x1 , x2 ] − f [ x0 , x1 ] x2 − x0

La quantità chiamata c2 prende il nome di differenza divisa del secondo ordine e si indica con f [ x0 , x1 , x2 ] =

f [ x1 , x2 ] − f [ x0 , x1 ] . x2 − x0

4 2 = − . Quin6 3 di, p2 ( x ) = f ( x0 ) + f [ x0 , x1 ]( x − x0 ) + f [ x0 , x1 , x2 ]( x − x0 )( x − x1 ) 2 Nell’esempio considerato: p2 ( x ) = 1 + 2( x − 1) − ( x − 1)( x − 2) 3 _ Da questo esempio, si può vedere come la rappresentazione secondo Newton sia di tipo ricorsivo: il polinomio p1 ( x ) = f ( x0 ) + f [ x0 , x1 ]( x − x0 ) (che si ha arrestandosi ai primi due passi del procedimento appena effettuato) è un polinomio, in tal caso una retta, che interpola i dati ( x0 , y0 ), e ( x1 , y1 ). Il polinomio p2 ( x ) è dato dalla somma di p1 ( x ) e del termine f [ x0 , x1 , x2 ]( x − x0 )( x − x1 ). Quindi, una volta determinato il polinomio pn−1 che interpola i primi n dati, possiamo usare questa rappresentazione per costruire pn che interpola i dati precedenti cui si aggiunge la coppia ( xn , yn ). Il coefficiente c j del polinomio interpolatore di Newton si chiama differenza divisa di ordine j e viene indicata con f [ x0 , x1 , . . . , x j ]. Perciò: Facendo le opportune sostituzioni si ricava c2 = −

f [ x0 ] = c0 , f [ x0 , x1 ] = c1 , . . . , f [ x0 , x1 , . . . , x n ] = c n La notazione utilizzata ci permette di capire anche da quali coppie di punti dipende il coefficiente c j .

Date le stesse coppie di punti, cambia il modo per arrivare al polinomio di interpolazione, usando come funzioni base i monomi, o i polinomi di Lagrange e ora la formulazione di Newton, ma il polinomio finale è sempre lo stesso essendo unico il polinomio interpolatore.

appunti di calcolo numerico

89

Dati i punti x0 , x1 , . . . , xn , per indici i e j arbitrari con 0 ≤ i ≤ j ≤ n, si ha f [ xi ] = f ( xi ) f [ xi , . . . , x j ] =

f [ x i +1 , . . . x j ] − f [ x i , . . . , x j −1 ] x j − xi

La formula interpolatoria alle differenze divise di Newton è dunque data da pn ( x ) = f [ x0 ] + f [ x0 , x1 ]( x − x0 ) + f [ x0 , x1 , x2 ]( x − x0 )( x − x1 ) + . . .

+ f [ x0 , x1 , . . . , xn ]( x − x0 )( x − x1 ) · · · ( x − xn−1 ) Da un punto di vista computazionale i coefficienti si ricavano mediante la tabella delle differenze divise, tenendo presente che per calcolare f [ x0 , x1 , . . . , xn ] dobbiamo aver calcolato tutte le differenze divise f [ x j−k , . . . , x j ], con 0 ≤ k ≤ j ≤ n. xi x0

f [·] f ( x0 )

f [·, ·]

f [ x0 , x1 ] = x1

f [·, ·, ·]

f [·, ·, ·, ·]

f [ x1 ] − f [ x0 ] x1 − x0

f ( x1 )

f [ x0 , x1 , x2 ] = f [ x1 , x2 ] − f [ x0 , x1 ] = x2 − x0 f [ x1 , x2 ] =

f [ x2 ] − f [ x1 ] x2 − x1

f [ x0 , x1 , x2 , x3 ] =

= x2

f ( x2 )

f [ x0 , x1 , x2 , x3 , x4 ] =

=

f [ x3 ] − f [ x2 ] x3 − x2

f ( x3 )

f [ x2 ,x3 ,x4 ]− f [ x1 ,x2 ,x3 ] x4 − x1

f [ x2 , x3 , x4 ] = f [ x3 , x4 ] − f [ x2 , x3 ] = x4 − x2 f [ x3 , x4 ] =

.. .

f [ x4 ] − f [ x3 ] x4 − x3 .. .

f ( x4 ) .. .

.. .

f [ x1 ,x2 ,x3 ,x4 ]− f [ x0 ,x1 ,x2 ,x3 ] x4 − x0

f [ x1 , x2 , x3 , x4 ] =

=

x4

f [ x1 ,x2 ,x3 ]− f [ x0 ,x1 ,x2 ] x3 − x0

f [ x1 , x2 , x3 ] = f [ x2 , x3 ] − f [ x1 , x2 ] = x3 − x1 f [ x2 , x3 ] =

x3

f [·, ·, ·, ·, ·]

.. .

I coefficienti della diagonale principale sono i coefficienti c j del polinomio interpolatore di Newton. Esempio Costruiamo la tabella delle differenze divise per i dati (1, 1), (2, 3) e (4, 3).

.. .

90

annamaria mazzia

f [·] 1

xi 1

f [·, ·] 3−1 =2 2−1

3

2

3−3 =0 4−2

0−2 2 =− 4−1 3

3

4

2).

f [·, ·, ·]

2 Il polinomio p2 ( x ) si scrive: p2 ( x ) = 1 + 2( x − 1) − ( x − 1)( x − 3

Se vogliamo aggiungere altri dati, per esempio, la coppia (5, 4), dobbiamo aggiungere una riga alla tabella della differenza divisa e un termine al polinomio che abbiamo già ricavato per ottenere quello di grado superiore interpolante tutti i dati che abbiamo a disposizione. xi 1

f [·] 1

f [·, ·] 3−1 =2 2−1

2

3 3−3 =0 4−2

4

3 4−3 =1 5−4

5

f [·, ·, ·]

0−2 2 =− 4−1 3

1 1−0 = 5−2 3

f [·, ·, ·, ·]

1 −2 − 3 3 = 1 5−1 4

4

1 Il polinomio p3 ( x ) è p3 ( x ) = p2 ( x ) + ( x − 1)( x − 2)( x − 4). 4

_

Differenze divise e derivate. La differenza divisa k-sima e la derivata k-sima di f sono legate tra loro. Si può provare, infatti, per k ≥ 1 che vale la relazione f [ x0 , x1 , . . . , x k ] =

f (k) ( ξ ) k!

dove ξ è un punto appartente all’interno dell’intervallo individuato dai nodi x0 , . . . , xk . Quando i punti coincidono, si ha 0 ,...,x0 ] = f [ x|0 ,x{z }

k +1 volte

f ( k ) ( x0 ) k!

Questa formula serve per calcolare il polinomio di interpolazione che interpola non solo una certa funzione f ma anche le sue derivate in alcuni punti assegnati (si veda l’esercizio 6.6.3 a fine Capitolo). Relazione tra differenze divise ed errore di interpolazione. pn ( x ) aggiungiamo la coppia di dati ( x, f ( x )) si ha

Se al polinomio

pn+1 ( x ) = f ( x ) = pn ( x ) + f [ x0 , x1 , . . . , xn , x ]( x − x0 )( x − x1 ) · . . . ( x − xn ).

Il concetto di differenza divisa può essere visto come un’estensione del concetto di derivata di una funzione. Si ha, infatti, che, per f derivabile, la differenza divisa del primo ordine f [ x0 , x1 ] può essere vista come un rapporto incrementale e quindi, al limite per x1 → x0 , si ha f 0 ( x0 ). Il discorso si estende alle differenze divise di ordine superiore.

appunti di calcolo numerico

91

L’ultima differenza divisa non si può calcolare, poichè dipende da x (che è la nostra variabile), ma ci è utile per capire quanto vale l’errore che commettiamo nell’approssimare f ( x ) mediante il polinomio interpolatore, applicando la rappresentazione di Newton. Inoltre, dato che il polinomio interpolatore è unico (fissate le coppie di dati del problema), anche l’errore che si commette è lo stesso, qualunque sia la strategia utilizzata per arrivare ad esso. Quindi possiamo eguagliare l’errore trovato utilizzando i polinomi di Lagrange con l’errore trovato nella rappresentazione di Newton, ottenendo: f (n+1) (ξ ( x )) ( n + 1) !

6.4

6.4.1

n

∏ ( x − xi ) =

i =0

n

f [ x0 , x1 , . . . , x n , x ] ∏ ( x − x i ) i =0

Considerazioni sull’interpolazione polinomiale

Fenomeno di Runge

Data una funzione f , si pensa che il polinomio di interpolazione possa approssimare bene la funzione, soprattutto se si aumenta il numero dei punti di appoggio. In realtà questo non è sempre vero e un semplice e famoso esempio ce lo fa capire. Sia data la funzione di 1 Runge f ( x ) = e consideriamo il polinomio di interpolazione di 1 + x2 questa funzione per valori crescenti di n prendendo punti di appoggio equidistanti nell’intervallo [−5, 5]. Partiamo da n + 1 = 2 con i punti equidistanti x0 = −5, x1 = 0 e x2 = 5. Si ha la tabella xi yi = f ( xi )

−5 3.846154e − 2

0 1.

Carl Runge (1856-1927) fu un matematico tedesco. Fu studente di Weierstrass, Kirchhoff, Helmholtz. Iniziò poi a collaborare con Kronecker e poi si dedicò in particolare allo studio della soluzione numerica di equazioni algebriche e alla spettroscopia.

5 3.846154e − 2

Costruiamo quindi il polinomio di interpolazione p2 ( x ) (utilizzando uno degli approcci proposti, monomiale, Lagrange o Newton, i risultati non cambiano). Raddoppiamo il numero dei punti aggiungendo un punto tra x0 e x1 e uno tra x1 e x2 . Abbiamo n + 1 = 5 e i valori della tabella xi yi = f ( xi )

−5 3.846154e − 2

−2.5 1.379310e − 1

0 1.

2.5 1.379310e − 1

5 3.846154e − 2

Con lo stesso procedimento, costruiamo i polinomi di interpolazione di grado 8 e 16. In Figura 6.5 sono riportati i grafici della funzione di Runge (in nero) e dei polinomi interpolanti di grado 2, 4 e 8. Si può osservare che solo in un sottointervallo di [−5, 5] al crescere di n, i polinomi convergono alla funzione. Agli estremi dell’intervallo [−5, 5] si hanno oscillazioni che aumentano sempre più al crescere di n. Con n = 16 si ha il polinomio riportato in Figura 6.6 (in alto), che non permette di distinguere il profilo della funzione di Runge a causa delle oscillazioni molto forti. Solo se restringiamo il grafico in un intorno dell’origine, possiamo vedere come il profilo del polinomio p16 si avvicini bene alla funzione – si veda la Figura 6.6 (in basso)!

92

annamaria mazzia

Figura 6.5: Funzione di Runge e polinomi interpolanti di grado 2, 4 e 8.

L’esempio di Runge è utile per capire che la scelta dei nodi equidistanti non si rivela sempre la scelta giusta e che occorrono altre strategie nella scelta dei nodi per ottenere migliori risultati. Nell’ef (n+1) (ξ ( x )) sempio di Runge, infatti, il rapporto , che compare nella ( n + 1) ! formula dell’errore, cresce, al crescere di n, agli estremi dell’intervallo di interpolazione, perciò aumentando il grado del polinomio di interpolazione, aumenta l’errore! Per indagare ulteriormente su questo problema, si rimanda alla letteratura specializzata del settore.

6.4.2

Malcondizionamento nell’interpolazione con funzioni base monomiali

All’inizio di questo Capitolo, abbiamo introdotto il polinomio di interpolazione mediante funzioni base monomiali: utilizzando questa strada, i coefficienti del polinomio si ricavano risolvendo un sistema lineare la cui matrice, di Vandermonde, è malcondizionata. A causa del malcondizionamento, questo approccio può portare a risultati errati! Vediamo di capire il malcondizionamento mediante un esempio. Si voglia studiare l’interpolazione dei seguenti dati xi yi

1010.5 4

1011.5 2.5

1012.5 2.5

1013 2

1014 2

Figura 6.6: Funzione di Runge e polinomio interpolante di grado 16 su tutto l’intervallo [−5, 5] (in alto) e in un sottointervallo ristretto (in basso)

1015 0

Confrontando i vari algoritmi di interpolazione, osserveremo che gli algoritmi di Lagrange e delle differenze divise di Newton danno buoni risultati. Al contrario, il metodo che porta alla costruzione della matrice di Vandermonde dà risultati disastrosi, come si può vedere in Figura 6.7. Eppure, dal punto di vista teorico i risultati dovrebbero essere identici.

Figura 6.7: Effetti del malcondizionamento

appunti di calcolo numerico

93

Perchè si hanno questi risultati? Bisogna tener conto di tre aspetti: il calcolo della matrice di Vandermonde; la soluzione del sistema lineare per ricavare i coefficienti del polinomio con funzioni base monomiali; il calcolo dei valori del polinomio. La matrice di Vandermonde consiste di colonne i cui valori crescono di colonna in colonna - 1, xi , xi2 , xi3 , . . ., xi5 . Per questo caso test, si va da 1 a elementi dell’ordine di 1015 . La matrice è molto mal condizionata. Perciò la soluzione del sistema lineare non può dare risultati affidabili e il vettore che fornisce i coefficienti del polinomio interpolatore è completamente errato. Ciò porta anche al fenomeno della cancellazione numerica nel calcolo del polinomio di interpolazione, per cui si ha una significativa perdita di accuratezza e il grafico risultante presenta un profilo altamente oscillante.

6.5

Interpolazione polinomiale a tratti

Abbiamo visto, nell’esempio di Runge, che l’interpolazione polinomiale con nodi equidistanti non porta a una buona interpolazione, in quanto l’errore, che dipende dalla derivata f n+1 ( x ), aumenta al crescere di n. Nel caso dell’esempio di Runge, una diversa scelta di nodi può portare a buoni risultati, ma resta il fatto che se il rapporto f n +1 ( x ) aumenta al crescere di n, anche l’errore rimane elevato. ( n + 1) ! Aumentando il numero dei punti di appoggio, il polinomio di interpolazione porta forti e irragionevoli oscillazioni al di fuori dell’intervallo dei nodi, come si può vedere nell’esempio mostrato in Figura 6.8. A volte, se la funzione da interpolare è continua a tratti, il termine dell’errore può essere ancora grande anche all’interno dell’intervallo dei nodi. In Figura 6.9, sono messi a confronto il polinomio di interpolazione di grado n = 5 che interpola la funzione f ( x ) = p | x | + 1 prendendo 6 punti equidistanti nell’intervallo [−1, 1] e il polinomio di interpolazione della funzione f ( x ) = e x nello stesso intervallo e con gli stessi punti. Mentre nel caso della funzione f ( x ) = e x il polinomio di interpolazione, nell’intervallo dei nodi, si p sovrappone alla funzione interpolata, per la funzione f ( x ) = | x | + 1 l’errore è ben evidente.

Figura 6.8: Interpolazione della funzione f ( x ) = exp( x ) con n = 20 (in alto) e n = 40 (in basso). I nodi di interpolazione sono nell’intervallo [0, 1].

Figura 6.9: p Interpolazione della funzione f (x) = | x | + 1 (a sinistra) e della funzione f ( x ) = e x (a destra) con n = 5 nell’intervallo [−1, 1]

Se, in alcuni casi, la scelta dei nodi, fatta in maniera opportuna, può risolvere determinati problemi che si incontrano nell’interpolazione,

94

annamaria mazzia

altre volte il polinomio di interpolazione produce risultati comunque non buoni, indipendentemente dalla scelta dei nodi. La domanda, allora, è la seguente: come possiamo ridurre il termine dell’errore senza aumentare il grado n nell’interpolazione e, tuttavia, mantenendo un numero elevato di nodi? La risposta viene dall’interpolazione polinomiale a tratti. Supponiamo di voler costruire una curva che interpola dei dati che si trovano all’interno di un certo intervallo [ a, b]. Prenderemo dei punti all’interno di questo intervallo, in modo che il primo e l’ultimo punto coincidano con a e b rispettivamente: a = x1 < x2 < . . . < xm = b. Chiamiamo questi punti nodi o punti di appoggio. A ciascun nodo è associato il valore yi da interpolare. In questo modo abbiamo m nodi in [ a, b] e possiamo considerare gli m − 1 sottointervalli dati da [ x1 , x2 ], [ x2 , x3 ], . . . fino ad arrivare a [ xm−1 , xm ] (da cui il generico sottointervallo è dato da [ xi , xi+1 ] con i = 1, 2, . . . , m − 1). Su ciascun sottointervallo andremo a costruire un polinomio di interpolazione di grado basso (considereremo n = 1 e n = 3), che chiamamo si ( x ). La funzione di interpolazione "globale" sarà una curva v( x ) continua (in alcuni casi anche di classe C1 o C2 ) che soddisfa la relazione v ( x ) = si ( x ) ,

Come si può notare, abbiamo cambiato la numerazione dei nodi (non più da x0 a xn ma da x1 a xm ) per evitare confusioni con quanto detto prima sull’interpolazione polinomiale. Inoltre i nodi sono ordinati in modo crescente, ordine non necessario quando si fa l’interpolazione polinomiale.

xi ≤ x ≤ xi+1 , i = 1, 2, . . . , m − 1.

Ci sono diversi tipi di interpolazione polinomiale a tratti. Noi ne consideriamo solamente due: l’interpolazione lineare a tratti e le spline cubiche.

6.5.1

Interpolazione lineare a tratti

Il caso più semplice da considerare è prendere, su ciascun sottointervallo [ xi , xi+1 ] un polinomio di interpolazione lineare (grado n = 1), quindi una retta. Allora la funzione v( x ) sarà continua (ma non avrà le derivate continue) in tutto l’intervallo. Nell’intervallo [ xi , xi+1 ], il polinomio di interpolazione si ( x ) si può costruire facilmente applicando, ad esempio, la formula delle differenze divise di Newton, da cui si ( x ) = yi + f [ xi , xi+1 ]( x − xi ). Globalmente avremo v( x ) tale che v( x ) = si ( x ) = yi + f [ xi , xi+1 ]( x − xi ),

x i ≤ x ≤ x i +1 ,

i = 1, 2, . . . , m − 1.

Un esempio di interpolazione lineare a tratti si ha in Figura 6.10. Il grande vantaggio di usare questo tipo di interpolazione è la sua semplicità e facilità. Tuttavia spesso questo tipo di interpolazione non è sufficiente perchè non è abbastanza regolare (c’è discontinuità nelle derivate ai punti di appoggio) e in molte applicazioni, invece, serve che ci sia continuità anche nelle derivate. Per avere maggiore continuità (vogliamo ad esempio che la funzione di interpolazione v( x ) sia di classe C1 o C2 ), si deve aumentare il grado del polinomio si ( x ) su ciascun sottointervallo. La scelta più diffusa è quella di usare polinomi cubici. Tra i polinomi cubici c’è l’interpolazione cubica di Hermite a tratti (che non descriviamo) e l’interpolazione spline cubica (che vedremo più nei dettagli).

appunti di calcolo numerico

95

Figura 6.10: Esempio di interpolazione lineare a tratti

6.5.2

Interpolazione spline cubica

Su ciascun sottointervallo, consideriamo un polinomio di terzo grado (n = 3), da cui la funzione globale v( x ) sarà: v ( x ) = s i ( x ) = a i + bi ( x − x i ) + c i ( x − x i ) 2 + d i ( x − x i ) 3 ,

xi ≤ x ≤ xi+1 , i = 1, 2, . . . m − 1

Quindi su ciascun sottointervallo abbiamo un polinomio cubico, che dipende da quattro coefficienti (ai , bi , ci , di ). Per ora, questi coefficienti sono incogniti, e poichè abbiamo 4 incognite su m − 1 sottointervalli, abbiamo un totale di 4(m − 1) incognite. Come determinare queste incognite? Imponendo non solo le condizioni di interpolazione (ricordiamo che noi abbiamo non solo le ascisse xi ma anche le ordinate yi e la condizione di interpolazione si legge come v( xi ) = yi ), ma anche la continuità della derivata prima e della derivata seconda nei punti di raccordo tra un sottointervallo e il successivo. Abbiamo quindi le seguenti condizioni da imporre: si ( xi ) = yi ,

i = 1, 2, . . . , m − 1

s i ( x i +1 ) = y i +1 , 0 si ( xi+1 ) = si0+1 ( xi+1 ), si00 ( xi+1 ) = si00+1 ( xi+1 ),

i = 1, 2, . . . , m − 1 i = 1, 2, . . . , m − 2 i = 1, 2, . . . , m − 2

Osserviamo che le condizioni di continuità delle derivate prime e seconde le possiamo imporre solo nei punti interni, e non in x1 e xm , il primo e l’ultimo punto. Le condizioni che abbiamo appena scritto sono 2(m − 1) + 2(m − 2) = 4(m − 1) − 2. Abbiamo 2 condizioni in meno rispetto alle 4(m − 1) incognite che dobbiamo determinare! Le due condizioni che mancano vengono imposte su punti estremi x1 e xm e, in base alle condizioni imposte si hanno le cosiddette spline naturali, complete e not-a-knot. Nelle spline naturali si richiede s100 ( x1 ) = s00m−1 ( xm ) = 0. Nelle spline complete, vengono specificati i valori delle derivate prime per s10 ( x1 ) e per s0m−1 ( xm ). Invece per le spline not-a-knot si richiede la continuità della derivata terza di s1 e di sm−1 in x2 e in xm−1

Da un punto di vista storico, il termine spline deriva da un sottile e flessibile strumento per disegnare curve, fatto di legno o metallo, utilizzato prima dell’avvento dei computer, soprattutto nell’industria navale. Per poter passare per determinati punti, la spline era tenuta ferma da alcuni pesi, mentre alle estremità non aveva costrizioni (quindi derivata seconda nulla, come accade nelle spline naturali). La spline naturale minimizza l’energia di tensione tra tutte le funzioni che sono costrette a passare per quei punti e con la stessa continuità.

96

annamaria mazzia

Figura 6.11: Esempio di interpolazione spline cubica

rispettivamente: poichè la derivata terza è una costante (stiamo lavorando con polinomi cubici), questa condizione fa sì che s1 = s2 e che sm−2 = sm−1 e, in questo modo, il primo e l’ultimo nodo non sono attivi. Costruzione della spline cubica naturale. Tratteremo ora il caso delle spline cubiche naturali, per la loro semplicità di implementazione, cercando di capire come si ricavano i coefficienti incogniti. Poniamo hi = xi+1 − xi , i = 1, . . . , m − 1: hi rappresenta l’ampiezza del sottointervallo i-simo [ xi , xi+1 ]. Dalla relazione di interpolazione si ( xi ) = yi si ricava facilmente ai = yi ,

i = 1, 2, . . . , m − 1

Dall’altra relazione di interpolazione si ( xi+1 ) = yi+1 si ricava ai + bi hi + ci h2i + di h3i = yi+1 cioè (sostituendo il valore per ai ): yi + bi hi + ci h2i + di h3i = yi+1 ,

i = 1, 2, . . . , m − 1

(6.1)

Useremo l’equazione (6.1) successivamente. Per usare le altre relazioni, scriviamo la derivata prima e seconda di si . Si ha, per i = 1, 2, . . . , m − 1 si0 ( x ) = bi + 2ci ( x − xi ) + 3di ( x − xi )2 si00 ( x ) = 2ci + 6di ( x − xi ) A questo punto, dalla relazione si0 ( xi+1 ) = si0+1 ( xi+1 ), i = 1, 2, . . . , m − 2 ricaviamo (osserviamo che a destra dobbiamo valutare si0+1 ( xi+1 ): bi + 2ci hi + 3di h2i = bi+1 ,

i = 1, 2, . . . , m − 2

(6.2)

Dalla relazione si00 ( xi+1 ) = si00+1 ( xi+1 ), i = 1, 2, . . . , m − 2 ricaviamo 2ci + 6di hi = 2ci+1 ,

i = 1, 2, . . . , m − 2

che si semplifica in ci + 3di hi = ci+1 ,

i = 1, 2, . . . , m − 2

Osserviamo che, dalla relazione si00 ( xi ) = 2ci si ricava il significato geometrico dei s00 ( xi ) coefficienti ci = i . 2

appunti di calcolo numerico

97

Da quest’ultima otteniamo di =

c i +1 − c i , 3hi

i = 1, 2, . . . , m − 2

(6.3)

Adesso i coefficienti di sono in funzione dei coefficienti ci . Sostituiamo il valore di di appena ricavato nell’equazione (6.1) e ricaviamo bi in funzione dei coefficienti ci . abbiamo Dividiamo tutto per hi e per compattare i termini utilizziamo le differenze divise dove servono.

yi + bi hi + ci h2i + di h3i = yi+1 c − ci 3 bi hi + ci h2i + ( i+1 ) h i = y i +1 − y i 3hi c − ci bi + c i h i + ( i + 1 ) h i = f [ x i , x i +1 ] 3 Otteniamo, per bi , la relazione bi = f [ x i , x i + 1 ] −

(2ci + ci+1 )hi , 3

i = 1, . . . , m − 1

(6.4)

Sostituiamo ora i valori per bi e per di nell’equazione (6.2): bi + 2ci hi + 3di h2i = bi+1 , i = 1, 2, . . . , m − 2 f [ x i , x i +1 ] −

(2ci + ci+1 )hi c − ci 2 (2ci+1 + ci+2 )hi+1 h i = f [ x i +1 , x i +2 ] − + 2ci hi + 3 i+1 3 3hi 3 Raccogliamo i termini in hi a sinistra.

(c + 2ci+1 )hi (2ci+1 + ci+2 )hi+1 f [ x i , x i +1 ] + i = f [ x i +1 , x i +2 ] − 3 3 Moltiplichiamo ambo i membri per 3 e portiamo le differenze divise a destra.

ci hi + 2ci+1 (hi + hi+1 ) + ci+2 hi+1 = 3( f [ xi+1 , xi+2 ] − f [ xi , xi+1 ]) (6.5) Questa equazione si ha per i = 1, . . . , m − 2, quindi abbiamo un sistema di m − 2 equazioni, ma le incognite ci che abbiamo introdotto sono m: c1 , c2 , . . . , cm . Aggiungiamo, allora, le condizioni per le spline naturali: deve essere s100 ( x1 ) = s00m−1 ( xm ) = 0. Si ha s100 ( x1 ) = 2c1 = 0 s00m−1 ( xm ) = 2cm−1 + 6dm−1 hm−1 = 0 c m −1 . Di conseguenza, ponendo cm = 3hm−1 0 possiamo estendere all’indice i = m − 1 la relazione (6.3) per i c m − c m −1 coefficienti di : dm−1 = . 3hm−1 Con la posizione c1 = cm = 0 le equazioni (6.5), per i = 1 e per i = m − 2 si semplificano, rispettivamente, in da cui c1 = 0 e, dm−1 = −

2c2 (h1 + h2 ) + c3 h2 =3( f [ x2 , x3 ] − f [ x1 , x2 ]),

(6.6)

cm−2 hm−2 + 2cm−1 (hm−2 + hm−1 ) =3( f [ xm−1 , xm ] − f [ xm−2 , xm−1 ]), (6.7)

Il procedimento seguito fino a questo punto è valido qualunque sia il tipo di spline che vogliamo generare. Aggiungendo le due condizioni che mancano, il procedimento si distingue da spline a spline.

98

annamaria mazzia

Perciò il sistema da risolvere per trovare i coefficienti c2 , c3 , . . . , cm−1 , mettendo insieme le equazioni (6.5), (6.6),(6.7), è dato da Ac = ψ dove 

2( h1 + h2 )

h2

0

···

h2 0

2( h2 + h3 ) h3 .. .

h3 2( h3 + h4 ) .. .

0 h4 .. .

···

h m −3 0

2 ( h m −3 + h m −2 ) h m −2

     A=     

   c=  

0 .. . 0 

c2 c3 .. .

    

c m −1

0 .. . ... 0 h m −2 2 ( h m −2 + h m −1 )

           



 3( f [ x2 , x3 ] − f [ x1 , x2 ])   3( f [ x3 , x4 ] − f [ x2 , x3 ])    ψ= ..     . 3( f [ xm−1 , xm ] − f [ xm−2 , xm−1 ])

Una volta ricavati i coefficienti ci , usando le equazioni (6.3) e (6.4), per i = 1, . . . , m − 1, si trovano tutti i coefficienti delle cubiche si . Ricapitolando, per trovare i coefficienti delle spline cubiche naturali si deve: 1. risolvere il sistema Ac = ψ che, risolto, fornisce i coefficienti c2 , c3 , . . . , cm−1 delle spline; 2. aggiungere al vettore c, i valori c1 = cm = 0 3. applicare, per i = 1, . . . , m − 1 le relazioni ai = yi bi = f [ x i , x i + 1 ] − di =

6.5.3

c i +1 − c i 3hi

(2ci + ci+1 )hi 3

Curve parametriche

Supponiamo di avere un insieme di punti in cui le ascisse possono ripetersi e in cui si vuole che i punti vengano messi insieme per formare una particolare curva. In Figura 6.12 vediamo un esempio di punti e di curva che vogliamo ottenere: in questo caso andiamo a unire i punti nell’ordine considerato mediante segmenti di retta. Questa curva, tuttavia, non può essere espressa come funzione di x o di y perchè non è una funzione (ad ogni valore di x non corrisponde un solo valore sull’asse delle ordinate, come deve accadere per funzioni del tipo y = f ( x )). Ci troviamo di fronte ad un esempio di curva. Possiamo pensare alla curva come il percorso di una particella che si muove in funzione del tempo t e, di conseguenza, le coordinate

Figura 6.12: Esempio di curva parametrica.

appunti di calcolo numerico

99

della particella sono funzioni di t ( x = x (t), y = y(t)). Abbiamo le cosiddette equazioni parametriche di una curva. Per poter costruire la curva di interpolazione, come nell’esempio proposto, dobbiamo, quindi, parametrizzare le coordinate ( xi , yi ), i = 1, 2, . . . , m. Dobbiamo cercare, quindi dei valori t1 , t2 , . . . tm tali che xi è il risultato di una certa funzione x al tempo ti mentre yi è il risultato di una certa funzione y allo stesso tempo ti . Dobbiamo dunque avere una rappresentazione del tipo:

( t1 , x1 ) , ( t2 , x2 ) . . . ( t m , x m ) ( t1 , y1 ) , ( t2 , y2 ) . . . ( t m , y m ) In tal caso, possiamo approssimare la curva x mediante le condizioni di interpolazione x (ti ) = xi mentre la curva y dovrà verificare y(ti ) = yi . Se abbiamo m punti a disposizione, possiamo fissare i valori ti i come ti = i, per i = 1, 2, . . . , m (si può anche scegliere ti = ): m l’importante è avere dei valori crescenti per la variabile t. La curva in forma parametrica è dunque espressa da ( x (t), y(t)). Per costruire x (t) e y(t) usiamo le tecniche di interpolazione a tratti (per esempio di interpolazione lineare a tratti o di spline cubiche a tratti) in modo da ottenere il risultato finale. In figura 6.13 vediamo un esempio di interpolazione spline a tratti con gli stessi nodi usati per ottenere la curva di figura 6.12.

6.6

Figura 6.13: Esempio di curva parametrica con interpolazione spline cubica a tratti (stessi nodi della figura 6.12).

Esercizi

Esercizio 6.6.1 Sia data la tabella seguente: xi f ( xi )

-1 9

0 0

2 0

3 15

4 84

(a) Scrivere la tabella delle differenze divise. (b) Trovare il polinomio interpolatore (con la formula di Newton) di grado non superiore a 4.

Svolgimento (a) La tabella delle differenza divise è: (b) Il polinomio di Newton di grado 4 che interpola i dati assegnati è dunque (prendendo i valori della diagonale 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) =

= x4 − 3.5x3 + 3.5x2 − x

100

annamaria mazzia

f (·, ·)

f (·, ·, ·)

f (·, ·, ·, ·)

xi -1

f ( xi ) 9

0

0

0−9 = −9 0 − (−1)

2

0

0−0 =0 2−0

0+9 = 3 2 − (−1)

3

15

15 − 0 = 15 3−2

15 − 0 =5 3−0

5−3 = 0.5 3 − (−1)

4

84

84 − 15 = 69 4−3

69 − 15 = 27 4−2

27 − 5 11 = 4−0 2

Esercizio 6.6.2 Sia data la tabella seguente: xi f ( xi )

0 1

0.1 0.48

0.8 1.32

1.2 5.32

(a) Scrivere la tabella delle differenze divise. (b) Usando i quattro punti in successione, scrivere i polinomi interpolanti (di Newton) pn ( x ) di grado non superiore ad n (con n=0,1,2,3); commentare il risultato. (c) Usando pn ( x ) stimare, per ogni n, f (0.6) e f 0 (0.6). (d) scrivere il polinomio p2 ( x ) con la formula di Lagrange.

Svolgimento

(a) La tabella delle differenza divise è:

f (·, ·)

f (·, ·, ·)

xi 0

f ( xi ) 1

0.1

0.48

0.48 − 1 = −5.2 0.1

0.8

1.32

1.32 − 0.48 = 1.2 0.7

1.2 + 5.2 =8 0.8

1.2

5.32

5.32 − 1.32 = 10 0.4

10 − 1.2 =8 1.1

f (·, ·, ·, ·)

8−8 =0 1.2

f (·, ·, ·, ·, ·)

11/2 − 1/2 =1 4 − (−1)

appunti di calcolo numerico

(b) I polinomi di Newton di grado 0,1,2 e 3 sono: p0 ( x ) = 1 p1 ( x ) = 1 − 5.2x p2 ( x ) = 1 − 5.2x + 8x ( x − 0.1) = 8x2 − 6x + 1 p3 ( x ) = 1 − 5.2x + 8x ( x − 0.1) + 0x ( x − 0.1)( x − 0.8) = 1 − 5.2x + 8x ( x − 0.1) = p2 ( x ) Il polinomio p3 ( x ) coincide con p2 ( x ) in quanto p2 ( x3 ) = p2 (1.2) = f (1.2) = f ( x3 ) cioè il polinomio di grado 2 interpola non solo i dati ( x0 , f ( x0 )), ( x1 , f ( x1 )) e ( x2 , f ( x2 )) ma anche ( x3 , f ( x3 )). (c) Per le derivate di pn ( x ), n = 0,1,2 si ha p00 ( x ) = 0 p10 ( x ) = −5.2 p20 ( x ) = 16x − 6 La stima di f (0.6) e f 0 (0.6) è: n 0 1 2

pn (0.6) 1 -2.12 0.28

p0n (0.6) 0 -5.2 3.6

(d) I polimoni di Lagrange per ricavare il polinomio p2 sono dati considerando i valori x0 , x1 e x2 :

( x − 0.1)( x − 0.8) x2 − 0.9x + 0.08 = (−0.1)(−0.8) 0.08 2 x ( x − 0.8) x − 0.8x L1 ( x ) = = 0.1(0.1 − 0.8) −0.07 2 x ( x − 0.1) x − 0.1x L2 ( x ) = = 0.8(0.8 − 0.1) 0.56 L0 ( x ) =

Il polinomio è: p2 ( x ) = 1L0 ( x ) + 0.48L1 ( x ) + 1.32L2 ( x ) x2 − 0.9x + 0.08 x2 − 0.8x x2 − 0.1x − 0.48 + 1.32 0.08 0.07 0.56 = 12.5( x2 − 0.9x + 0.08) − 6.857142857( x2 − 0.8x ) + 2.357142857( x2 − 0.1x )

=

e raccogliendo i termini p2 ( x ) = 8x2 − 6x + 1

Esercizio 6.6.3 Trovare il polinomio di grado non superiore a 4 che interpola i dati seguenti: f (0) = 2, f 0 (0) = 7, f 00 (0) = 18, f (1) = 27 f 0 (1) = 60. Stimare f (0.2) e f 0 (0.2).

101

102

annamaria mazzia

Svolgimento Costruiamo la tabella delle differenze divise tenendo presente che le derivate di una funzione f si possono avere come limite delle differenze divise: f [0, 0] = f 0 (0) = 7

f 00 (0) =9 2!

f [0, 0, 0] =

f [1, 1] = f 0 (1) = 60

Tenendo conto di queste relazioni tra differenze divise e derivate, nella tabella delle differenze divise, dobbiamo ripetere per tre volte l’ascissa 0 e due volte l’ascissa 1. Si ottiene: 0

2 f 0 (0)=7

0

f 00 (0)/2=9

2 f 0 (0)=7

0

2 27 − 2 =25 1−0

1

27 f 0 (1)= 60

1

25 − 7 =18 1−0 60 − 25 =35 1−0

18 − 9 =9 1−0 35 − 18 =17 1−0

17 − 9 =8 1−0

27

Il polinomio è dunque p( x ) = 2 + 7x + 9x2 + 9x3 + 8x3 ( x − 1), vale a dire p( x ) = 8x4 + x3 + 9x2 + 7x + 2. La stima di f (0.2) è data da: f (0.2) ≈ p(0.2) = 3.7808. Per stimare f 0 (0.2) dobbiamo prima calcolare la derivata prima di p. Si ha p0 ( x ) = 32x3 + 3x2 + 18x + 7, da cui f 0 (0.2) ≈ p0 (0.2) = 12.056.

Esercizio 6.6.4 Sia data la tabella seguente di dati sperimentali xi f ( xi )

0.4 17.62

1 23.5

2.8 92.98

3.8 165.18

(a) Costruire la tabella delle differenze divise. (b) Usando i quattro punti in successione, scrivere i polinomi di interpolazione di Newton pn di grado n = 0, 1, 2, 3. Commentare il risultato.

Svolgimento La tabella delle differenze divise è:

appunti di calcolo numerico

f (·, ·)

f (·, ·, ·)

xi 0.4

f ( xi ) 17.62

1.

23.5

23.5 − 17.62 = 9.8 1 − 0.4

2.8

92.98

92.98 − 23.5 = 38.6 2.8 − 1

38.6 − 9.8 = 12 2.8 − 0.4

3.8

165.18

165.18 − 92.98 = 72.2 3.8 − 2.8

72.2 − 38.6 = 12 3.8 − 1

f (·, ·, ·, ·)

12 − 12 =0 3.8 − 0.4

I polinomi da costruire sono

x x x x

p0 ( x ) = 17.62 p1 ( x ) = p0 ( x ) + 9.8( x − 0.4) = 17.62 + 9.8( x − 0.4) = 9.8x + 13.7 p2 ( x ) = p1 ( x ) + 12( x − 0.4)( x − 1) = .... = 12x2 − 7x + 18.5 p3 ( x ) = p2 ( x ) + 0( x − 0.4)( x − 1)( x − 2.8) = p2 ( x )

Il polinomio p3 coincide con il polinomio p2 perchè il punto (3.8, 165.18) appartiene già al polinomio p2 .

6.7

Domande di riepilogo

1. Date n + 1 coppie di punti da interpolare, di che grado è il polinomio di interpolazione? 2. Se si cerca di ricavare i coefficienti del polinomio di interpolazione scritto come p( x ) = a0 + a1 x + a2 x2 + . . . + an x n , utlizzando come funzioni base i monomi 1, x, . . ., x n , si deve risolvere un sistema lineare in cui la matrice dei coefficienti ha un nome ben preciso. Come si chiama questa matrice e quali caratteristiche ha? 3. Come si definiscono i polinomi di Lagrange? Dati n + 1 nodi x0 , x1 , . . . , xn , quanti polinomi di Lagrange possiamo costruire? Che caratteristica ha ciascun polinomio di Lagrange? Provare a fare il grafico di questi polinomi per n = 3 e per n = 4. 4. I polinomi di Lagrange sono utilizzati per costruire il polinomio di interpolazione. Che forma assume il polinomio di interpolazione utilizzando i polinomi di Lagrange? 5. Data una funzione f e date le coppie di punti ( xi , f ( xi )), i = 0, 1, . . . , n, si può costruire il polinomio che interpola queste n + 1 coppie di punti. Preso un generico punto x compreso nell’intervallo individuato dalle ascisse di interpolazione, qual è la formula dell’errore che si commette sostituendo a f ( x ) il valore del polinomio valutato in x? Quali sono le ipotesi che devono valere perché valga questa formula dell’errore?

103

104

annamaria mazzia

6. Spiegare come si costruisce la tabella delle differenze divise di Newton e a cosa serve. 7. Quali sono i vantaggi dell’approccio delle differenze divise nel costruire il polinomio di interpolazione? 8. Che relazione c’è tra differenze divise e derivate di una funzione? 9. L’approccio delle differenze divise di Newton serve anche se si vogliono interpolare non sono i valori di una certa funzione f ma anche valori delle sue derivate. Spiegare con un esempio come si deve procedere e per quale motivo. 10. Spiegare il fenomeno di Runge nell’interpolazione polinomiale. 11. Ci possono essere casi in cui la matrice di Vandermonde è molto malcondizionata. In questo caso, tutti gli approcci per arrivare allo stesso polinomio di interpolazione vanno bene o no? E perché? 12. Che differenza c’è tra interpolazione polinomiale e interpolazione polinomiale a tratti? 13. Spiegare come si arriva a costruire la funzione di interpolazione lineare a tratti. 14. Spiegare cosa è una spline e quali sono le condizioni che vanno imposte per ottenere i coefficienti delle spline. 15. Quanti tipi di spline abbiamo? 16. Come si può ottenere una curva parametrica?

7 Approssimazione 7.1

I numeri governano il mondo. Platone

Perchè approssimare dati?

La legge di Hooke stabilisce che l’allungamento subito da una molla, costruita con materiale uniforme, è direttamente proporzionale alla forza applicata: F ( x ) = kx dove k è la costante di proporzionalità, detta costante elastica, e x rappresenta l’allungamento della molla. Supponiamo di voler determinare k per una molla che, quando è a riposo, esercita una forza di 1.4724811N. Se applichiamo una forza pari a 2.418165N si misura un allungamento pari a 0.042m. Siano effettuate diverse misure, ricavando i dati mostrati in Tabella. x F

0.00000 1.472481

0.04200 2.418165

0.08000 3.363849

0.11800 4.309533

0.15600 5.255217

I dati raccolti non giacciono esattamente su una linea retta. Per approssimare la costante elastica k, potremmo prendere una qualunque coppia di dati e fare il rapporto tra la forza e l’allungamento. In questo modo, tuttavia, non terremmo conto di tutte le misure effettuate. È più ragionevole trovare la linea retta che meglio approssima tutti i dati sperimentali e utilizzarla per approssimare il valore di k. Questo tipo di approssimazione sarà l’argomento di questo Capitolo. A differenza dell’interpolazione, in cui si cerca una funzione che passi esattamente per i dati assegnati, nell’approssimazione si cerca una funzione (più semplice di quella data, se vi è una funzione di partenza) che approssimi al meglio i dati assegnati, senza passare esattamente per questi. Alcuni dei motivi che spingono a cercare una funzione di approssimazione piuttosto che di interpolazione sono questi:

x i dati a disposizione sono affetti da errore; x siamo interessati a vedere l’andamento dei dati su lunga scala, in una visione globale

x

vogliamo che la funzione dipenda da pochi parametri, sebbene questi siano determinati considerando tutti i dati a disposizione. Nel seguito studieremo l’approssimazione ai minimi quadrati.

Tabella 7.1: Dati sperimentali per la legge di Hooke

Figura 7.1: sperimentali

Legge di Hooke:

i dati

Se si hanno a disposizione 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.

106

7.2

annamaria mazzia

Retta di regressione lineare

Supponiamo di avere i 10 dati sperimentali della Tabella 7.2 ( abbiamo quindi le coppie di dati ( xi , yi ) con i = 1, . . . , n, dove n = 10). xi yi

1 1.2

2 2.3

3 4.5

4 5.1

5 7

6 8.5

7 10.2

8 13.1

9 12.5

10 16.5

Tabella 7.2: Dati sperimentali

La Figura 7.2 (a sinistra) mostra il grafico delle coppie di punti: appare evidente che la relazione tra x e y è di tipo lineare. Il motivo per cui i dati non sono esattamente su una retta è dovuto ad errori nei dati. Non ha senso, quindi, cercare una funzione che passi esattamente per i dati assegnati (come accade nell’interpolazione), perchè una funzione del genere introdurrebbe oscillazioni prive di significato fisico: lo vediamo andando a costruire il polinomio di interpolazione di grado 9 che passa esattamente per i dati e che vediamo in Figura 7.2 (a destra). Figura 7.2: Dati sperimentali (a sinistra) della Tabella precedente e polinomio di interpolazione (a destra).

Cerchiamo allora una retta (funzione lineare, poichè abbiamo visto che i dati hanno una relazione di tipo lineare) che meglio approssima i dati senza dover passare esattamente per essi. Sia p1 ( x ) = a0 + a1 x la retta che andiamo cercando (dobbiamo quindi capire come trovare i due coefficienti a0 e a1 ). Allora p1 ( xi ) = a0 + a1 xi , per i = 1, . . . , n rappresenta il valore sulla retta che deve approssimare il valore yi dato dal problema. Per ogni dato sperimentale, per i = 1, . . . , n, possiamo misurare lo scarto che scaturisce dall’approssimare yi mediante a0 + a1 xi . Nell’approccio ai minimi quadrati, si cerca di minimizzare la somma dei quadrati degli scarti, cioè la somma dei quadrati delle differenze tra i valori assegnati yi e i valori corrispondenti p1 ( xi ) sulla retta. Introduciamo, quindi la funzione che dipende dai coefficienti incogniti a0 e a1 . n

S ( a0 , a1 ) =

∑ [(a0 + a1 xi ) − yi ]2

i =1

Per minimizzare questa funzione, occorre porre le derivate parziali della S rispetto ad a0 e a1 uguali a zero. Si pone dunque

In questo caso, lo scarto sul dato i-simo rappresenta la differenza tra il valore dato yi e il valore approssimato dal polinomio, a0 + a1 xi , vale a dire yi − ( a0 + a1 xi ).

Per funzioni f ( x ) di una variabile reale, i punti di massimo o minimo si trovano tra i punti critici della f , per i quali f 0 ( x ) = 0, studiando il segno della f 00 . Analogo procedimento si segue per funzioni di due variabili. Per la funzione S( a0 , a1 ) che stiamo studiando, si può provare che i valori ( a0 , a1 ) che annullano le derivate parziali della S rappresentano i valori che minimizzano la S stessa. Questo argomento viene approfondito nei corsi di Analisi Matematica.

appunti di calcolo numerico

0=

∂S( a0 , a1 ) ∂ = ∂a0 ∂a0

∂ ∂S( a0 , a1 ) = 0= ∂a1 ∂a1

n

n

i =1 n

i =1 n

∑ [(a0 + a1 xi ) − yi ]2 = 2 ∑ [(a0 + a1 xi ) − yi ] ∑ [(a0 + a1 xi ) − yi ]

i =1

2

= 2 ∑ [( a0 + a1 xi ) − yi ] xi i =1

Queste equazioni si semplificano nel sistema delle cosiddette equazioni normali:  na + a ∑n x = ∑n y 0 1 i =1 i i =1 i  a0 ∑ n x i + a1 ∑ n x 2 = ∑ n x i y i i =1

i =1

i

i =1

107

Data una funzione f ( x, y) che dipende da due variabili, il simbolo

∂f rappresenta la ∂x

derivata parziale della f rispetto alla variabile x, che altro non è che la derivata della funzione g( x ) = f ( x, y) considerando y come una costante. Viceversa, con il simbolo

∂f si ∂y

indica la derivata parziale della f rispetto alla variabile y, che, per definizione, è la derivata della funzione h(y) = f ( x, y), dove ora x è considerata costante. L’argomento viene trattato nei dettagli in Analisi Matematica 2.

Introducendo la notazione A12 = ∑in=1 xi , A22 = ∑in=1 xi2 , b1 = ∑in=1 yi e b2 = ∑in=1 xi yi e osservando che la matrice del sistema è simmetrica (A12 = A21 ), la soluzione è data da: a0 =

A22 b1 − A12 b2 nA22 − A212

a1 =

nb2 − A12 b1 nA22 − A212

Nell’esempio proposto, per calcolare la retta di approssimazione ai minimi quadrati, dobbiamo calcolare i coefficienti delle equazioni normali. In Tabella 7.3 poniamo i valori che servono per risolvere il sistema: la soluzione è a0 = −0.87333333 e a1 = 1.62969697. La retta è rappresentata in Figura 7.3. La retta che abbiamo appena costruito è la retta che minimizza gli scarti verticali, supponendo affetti da errore le ordinate delle coppie di punti a disposizione. Essa prende pure il nome di retta di regressione lineare sugli scarti verticali. Osserviamo che il baricentro dei punti assegnati giace sulla retta ai minimi quadrati, in quanto considerando la prima equazione del sistema si ha, per X = ∑in=1 xi /n e Y = ∑in=1 yi /n (le coordinate del baricentro dei punti assegnati):

xi

yi

xi2

xi yi

1 2 3 4 5 6 7 8 9 10

1.2 2.3 4.5 5.1 7 8.5 10.2 13.1 12.5 16.5

1 4 9 16 25 36 49 64 81 100

1.2 4.6 13.5 20.4 35 51 71.4 104.8 112.5 165

A12 = 55

b1 = 80.9

A22 = 385

b2 = 579.4

Tabella 7.3: Tabella per il calcolo della retta di approssimazione ai minimi quadrati

a0 + a1 X = Y Se invece sono affetti da errore le ascisse delle coppie di punti, si può cercare la retta che minimizza gli scarti orizzontali, detta anche retta di regressione lineare sugli scarti orizzontali, (basta scambiare il ruolo delle x con quello delle y per ricavare, con lo stesso procedimento, la retta p1 (y) = b0 + b1 y). Il baricentro dei punti assegnati giace anche su questa retta, da cui possiamo concludere che esso è il punto di intersezione delle due rette che minimizzano gli scarti verticali e orizzontali.

7.3

Approssimazione polinomiale ai minimi quadrati

In generale, avendo a disposizione n coppie di punti, il problema di approssimazione si può ricondurre alla ricerca di un polinomio di approssimazione di grado m, pm ( x ) = a0 + a1 x + a2 x2 + . . . + am x m con m < (n − 1). Quando n − 1 = m il polinomio d’approssimazione coincide con quello d’interpolazione.

Figura 7.3: Retta di approssimazione sugli scarti verticali.

108

annamaria mazzia

La funzione da minimizzare è i2 n h S( a0 , a1 , . . . , am ) = ∑ ( a0 + a1 xi + a2 xi2 + . . . + am xim ) − yi i =1

La procedura seguita per la retta viene generalizzata. Questa volta bisogna porre uguali a zero le m + 1 derivate parziali della S rispetto ai coefficienti del polinomio pm . ∂S =0 ∂a j

j = 0, 1, . . . , m

Ricaviamo, quindi n

2 ∑ ( a0 + a1 xi + . . . + am xim − yi ) xi = 0 j

per j = 0, 1, . . . , m

i =1

In forma estesa possiamo scrivere n

a0

n

∑ x i + a1 ∑ x i j

i =1

j +1

i =1

n

+ . . . + a m ∑ xi

j+m

i =1

n

=

∑ xi yi j

per j = 0, 1, . . . , m

i =1

Poichè queste equazioni si hanno per j = 0, 1 . . . , m, si ha da risolvere un sistema, che, scritto in forma matriciale, è: A T Aa = A T b dove A è una matrice rettangolare n × (m + 1), data da   1 x1 x12 . . . x1m   1 x2 x22 . . . x2m  A= .. .. ..   ..  . . . .  1

xn

xn2

...

xnm

Le equazioni del sistema sono dette equazioni normali. Si può provare che la matrice Q = A T A è simmetrica, definita positiva ed è non singolare, quindi il sistema ammette soluzione.

7.4

Approssimazioni di tipo esponenziale e potenza

Può capitare che i dati sperimentali abbiano un andamento di tipo esponenziale o ricordino una funzione potenza della variabile x. Allora si può richiedere che la funzione approssimante abbia una delle forme seguenti (a seconda della rappresentazione, si ha un diverso modello): y( x ) = aebx y( x ) = ax

b

modello esponenziale modello potenza

con a e b opportune costanti. Per ottenere i valori incogniti di a e b si passa ai logaritmi, trasformando il modello di partenza nell’equazione di una retta i cui coefficienti possono essere ricavati applicando la procedura di minimizzazione ai minimi quadrati. Da questi, si ritorna poi ai valori a e b della funzione di partenza. Vediamo nei dettagli come fare.

Le definizioni di matrice simmetrica e matrice definita positiva sono date nel Capitolo 9.

appunti di calcolo numerico

x

Nel caso del modello esponenziale, passando ai logaritmi (in base naturale) si ha: ln (y) = ln ( a) + bx Ponendo X = x, Y = ln (y), a0 = ln ( a) e a1 = b, si ha un’equazione del tipo Y = a0 + a1 X. Quindi, dalle coppie di dati ( xi , yi ) i = 1, . . . , n, si deve passare alle coppie ( Xi = xi , Yi = ln (yi )) e su queste coppie si costruisce la retta di approssimazione ai minimi quadrati con la procedura che abbiamo studiato in Sezione 7.2. Una volta ricavati i coefficienti a0 e a1 , si ha a = e a0 e b = a1 .

x

Nel caso del modello potenza, passando ai logaritmi (qualunque sia la base usata, il risultato non cambia) si ha: log (y) = log ( a) + b log ( x ) Ponendo X = log ( x ), Y = log (y), a0 = log ( a) e a1 = b, si ha un’equazione del tipo Y = a0 + a1 X.

Quindi, dalle coppie di dati ( xi , yi ) i = 1, . . . , n, si deve passare alle coppie ( Xi = log ( xi ), Yi = log (yi )) e su queste coppie si costruisce la retta di approssimazione ai minimi quadrati. Una volta ricavati i coefficienti a0 e a1 , si ha b = a1 mentre, con gli opportuni passaggi, si trova il valore di a.

7.5

Esercizi

Esercizio 7.5.1 Sia data la tabella seguente: xi f ( xi )

-1 9

0 0

2 0

3 15

4 84

(a) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati degli scarti verticali. (b) Trovare la retta ai minimi quadrati che minimizza la somma dei quadrati degli scarti orizzontali. (c) Calcolare il punto di intersezione delle due rette e dire di che punto si tratta. Svolgimento (a) Il sistema da risolvere per ottenere la retta di approssimazione ai minimi quadrati è:  na + ∑n x a = ∑n y 0 i =1 i 1 i =1 i  ∑ n x i a0 + ∑ n x 2 a1 = ∑ n x i y i i =1

i =1

i

i =1

109

110

annamaria mazzia

dove n = 5. Poichè ∑5i=1 xi = 8, ∑5i=1 xi2 = 30, ∑5i=1 yi = 108 e ∑5i=1 xi yi = 372, si ha il sistema  5a + 8a = 108 0 1 8a0 + 30a1 = 372 La soluzione è a0 = 3.069767442, a1 = 11.581395349. La retta ai minimi quadrati che minimizza gli scarti verticali è: y = 3.069767442 + 11.581395349x. (b) Ricaviamo la retta di approssimazione che minimizza gli scarti orizzontali.  nb + ∑n y b = ∑n x 0 i =1 i 1 i =1 i ∑n yi b0 + ∑n y2 b1 = ∑n yi xi i =1

i =1 i

i =1

dove n = 5. Poichè ∑5i=1 yi = 108, ∑5i=1 y2i = 7362, ∑5i=1 xi = 8 e ∑5i=1 xi yi = 372, si ha il sistema  5b + 108b = 8 0 1 108b0 + 7362b1 = 372 La soluzione è b0 = 0.744452398, b1 = 0.03960868528. La retta ai minimi quadrati che minimizza gli scarti orizzontali è: x = 0.744452398 + 0.03960868528y. (c) Troviamo il punto di intersezione delle due rette:  y = 3.069767442 + 11.581395349x  x = 0.744452398 + 0.03960868528y Ricaviamo x = 1.6 e y = 21.6 Se calcoliamo il baricentro dei punti assegnati, troviamo X=

−1 + 2 + 3 + 4 ∑5i=1 xi = = 1.6 5 5

Y=

9 + 15 + 84 ∑5i=1 yi = ) = 21.6 5 5

Il punto di intersezione delle due rette è il baricentro dei punti assegnati.

Esercizio 7.5.2 Sono assegnati i seguenti dati sperimentali xi yi

4.0 102.56

4.2 113.18

4.5 131.2

4.7 142

5.1 168

5.5 196.2

5.9 225

6.3 256.8

6.8 299.51

Costruire la curva di approssimazione ai minimi quadrati della forma ax b .

Svolgimento Per trovare la curva di approssimazione del tipo y = ax b , dobbiamo prima passare ai logaritmi: log(y) = log( ax b ) = log( a) + b log( x )

7.1 325.6

appunti di calcolo numerico

In questo modo ci riconduciamo ad una retta di approssimazione ai minimi quadrati sui logaritmi dei punti assegnati. Consideriamo il logaritmo naturale (ma i risultati non cambiano con i logaritmi in un’altra base). I dati su cui lavorare sono dunque: ln( xi ) 1.386294361 1.435084525 1.504077397 1.547562509 3.931825633 1.704748092 1.774952351 1.840549633 1.916922612 1.960094784

ln(yi ) 4.630447993 4.728979472 4.876722876 4.955827058 5.123963980 5.279134547 5.416100402 5.548297572 5.702147806 5.785669634

Calcoliamo la retta di approssimazione ai minimi quadrati, ponendo Xi = ln( xi ) e Yi = ln(yi ). Il sistema da risolvere è  na + ∑n X a = ∑n Y 0 i =1 i 1 i =1 i ∑n Xi a0 + ∑n X 2 a1 = ∑n Xi Yi i =1

i =1

i =1

i

dove n = 10. Si ha ∑in=1 Xi = 16.6995268, ∑in=1 Xi2 = 28.2537116, ∑in=1 Yi = 52.0472913, ∑in=1 Xi Yi = 87.6541085 Il sistema da risolvere diventa  10a + 16.6995268a = 52.0472913 0 1 16.6995268a0 + 28.2537116a1 = 87.6541085 che ha come soluzione a0 = 1.84197978 e a1 = 2.013679425. Ora a0 = ln( a) da cui a = e a0 = 6.30901637 Invece a1 = b. Il modello y = ax b diventa quindi y = 6.30901637x2.013679425 .

Esercizio 7.5.3 Sia data la tabella seguente di dati sperimentali xi f ( xi )

0.2 15.02

1 15.5

2.4 40.98

3.4 78.38

Trovare la curva di approssimazione ai minimi quadrati y = cx d che minimizza gli scarti verticali.

Svolgimento Per la curva di approssimazione y = cx d si passa ai logaritmi, in modo da ricondursi all’equazione della retta log y = log c + d log x. Si pone poi Y = log y e X = log x; a0 = log c e a1 = d. Considerando i logaritmi naturali si ha Xi = [−1.609437912434 0.0 0.8754687373539 1.223775431622]

111

112

annamaria mazzia

Yi = [2.70938264633 2.7408400239 3.7130841428 4.36156879277] Il sistema da risolvere è  4a + 0.48980625654a = 13.52487560584 0 1 0.48980625654a0 + 4.854362211106a1 = 4.22768666781 Risolvendo si trova a0 = 3.3155400568494 da cui c = 27.537261656285 e a1 = d = 0.53636590986. La curva è y = 27.537261656285x0.53636590986 .

7.6

Domande di riepilogo

1. Che differenza si ha tra interpolazione e approssimazione di dati? 2. Se si vogliono approssimare n coppie di dati attraverso una retta di approssimazione che minimizza gli scarti verticali, va minimizzata una certa funzione S. Qual è questa funzione e come viene costruita? 3. Quali sono le derivate parziali di questa funzione S e per quale motivo vengono poste uguali a zero? 4. Qual è il sistema di equazioni da risolvere per ricavare i coefficienti della retta di approssimazione che minimizza gli scarti verticali? 5. Qual è il sistema di equazioni da risolvere per ricavare i coefficienti della retta di approssimazione che minimizza gli scarti orizzontali? 6. Che proprietà possiede il baricentro delle coppie di punti che vengono approssimati tramite una retta di approssimazione? 7. Che procedimento va fatto per ricondursi al caso della retta di approssimazione se si vogliono approssimare i dati attraverso un modello esponenziale del tipo y = ae xb ? 8. Che procedimento va fatto per ricondursi al caso della retta di approssimazione se si vogliono approssimare i dati attraverso un modello potenza del tipo y = ax b ? 9. Che procedimento va fatto per ricondursi al caso della retta di approssimazione se si vogliono approssimare i dati attraverso un modello del tipo y = a + bx m , con m intero maggiore o uguale a 2?

8 Integrazione numerica 8.1

Integrazione numerica e... farmaci

Per molti farmaci, il profilo di rilascio del principio attivo dipende sia dalle caratteristiche chimico-fisiche del principio attivo sia dalle caratteristiche tecnologiche della formulazione. In tal modo il rilascio del farmaco può essere accelerato o ritardato (pensiamo alle compresse gastroresistenti), e può avvenire in particolari siti dell’organismo. È importante dunque il polimero che incapsula il farmaco. Supponiamo di avere un farmaco incapsulato in un polimero che viene rilasciato lentamente nel sistema sanguigno del paziente. In particolare, in una capsula ci siano 100µg di farmaco a rilascio controllato. Il farmaco sia rilasciato alla velocità di 8e−0.1t µg/h dove t rappresenta il tempo in ore. Possiamo chiederci: quanto farmaco rimane ancora all’interno della capsula dopo 24 ore? Indicando con m0 il farmaco all’istante iniziale t0 , in cui viene assunto il medicinale (quindi m0 = 100µg) e con m f ciò che rimane all’istante finale t f = 24 ore, possiamo dire che vale la seguente relazione m f − m0 = −

Z t f dm ( t ) t0

dt

Ad una festa matematica si incontrano √ diverse funzioni come x2 , 3 sin ( x ), 4 2 + x e molte altre... Ad un certo punto x2 vede in un angolino, mogia mogia, la funzione

ln (5x sin ( x2 /2)) p , e le chie10sin(2x3 )))

7 cos (e x + ln (

de:" Perchè te ne stai qui tutta sola e triste?". Lei risponde: " Sai, io non mi INTEGRO facilmente!" Umorismo in rete

dt

Abbiamo messo il segno meno all’integrale in quanto sappiamo che la quantità di farmaco all’istante finale è inferiore a quella dell’istante iniziale e quindi la velocità di rilascio (che è stata data come velocità positiva) va intesa, invece, con il segno negativo. Sostituendo le quantità note, si ha m f − 100 = −

Z 24 0

8e−0.1t dt

L’integrale può essere calcolato facilmente e si ha m f = 100 −

8 (e−0.1·24 − e0 ) = 100 + 80(e−2.4 − 1) = 100 − 72.743 = 27.257 −0.1

Quindi rimangono ancora circa 27µg di farmaco dop 24 ore. Supponiamo ora che, per lo stesso problema, la velocità di rilascio 2 sia di 8e−0.1t µg/h. Ciò che rimane nella capsula dopo un certo istante di tempo t f sarà m f = 100 −

Z t f t0

2

8e−0.1t dt

114

annamaria mazzia

Rispetto al primo esempio, questo integrale non può essere calcolato analiticamente! Ciò non significa che il problema non possa essere risolto. Ma dovrà essere affrontato per via numerica. Ed è proprio quello che faremo in questo capitolo. Ci occuperemo, infatti, di approssimare numericamente l’integrale definito I=

Z b a

f ( x )dx

dove f è una funzione definita nell’intervallo [ a, b]. Una formula di integrazione numerica (detta anche formula di Rb quadratura numerica) approssima l’integrale esatto I = a f ( x )dx mediante una sommatoria data da ∑nj=0 a j f ( x j ): I=

Z b a

La funzione f può essere nota, come nell’esempio appena visto, oppure assegnata su determinati punti dell’intervallo, come vedremo alla fine del capitolo.

n

f ( x )dx ≈

∑ aj f (xj )

j =0

dove x j , j = 0, . . . , n sono le ascisse o punti di appoggio della formula di quadratura e a j sono i pesi della formula. In questo Capitolo studieremo i metodi più semplici da applicare.

8.2

Formula dei trapezi

Consideriamo la retta che interpola la f negli estremi dell’intervallo di integrazione. Per semplicità, costruiamo la retta partendo dalla tabella delle differenze divise di Newton: a

f ( a)

b

f (b)

f (b) − f ( a) b−a

Il polinomio di interpolazione (retta) che interpola la f in a e in b (gli estremi dell’intervallo di integrazione) è dato da p( x ) = f ( a) +

f (b) − f ( a) ( x − a) b−a

L’errore di interpolazione, utilizzando l’espressione del resto di Lagrange (e, quindi, considerando valide le ipotesi, per questo caso, di f continua fino alla derivata seconda) è dato da E( x ) =

f 00 (ξ x ) ( x − a)( x − b) 2

dove ξ x è un punto incognito dell’intervallo [ a, b] che varia al variare di x. Per quanto abbiamo studiato sull’interpolazione, sappiamo che la funzione f ( x ) si può scrivere come somma del polinomio e dell’errore: f ( x ) = p( x ) + E( x ). Nel nostro caso, abbiamo f ( x ) = f ( a) +

f (b) − f ( a) f 00 (ξ x ) ( x − a) + ( x − a)( x − b) b−a 2

Dovendo integrare la f tra a e b e valendo l’uguaglianza precedente, integrando ambo i membri, otteniamo:  Z b Z b Z b f (b) − f ( a) f 00 (ξ x ) f ( x )dx = f ( a) + ( x − a) dx + ( x − a)( x − b) dx b−a 2 a a a

appunti di calcolo numerico

115

ovvero Z b a

f ( x )dx = (b − a)

f ( a) + f (b) 1 + 2 2

Z b a

( x − a)( x − b) f 00 (ξ x ))dx

Poichè il prodotto ( x − a)( x − b) ha segno costante in [ a, b], per il teorema del Valor Medio del calcolo integrale (si veda il Teorema 3.6.6) si ha 1 2

Z b a

( x − a)( x − b) f 00 (ξ x ))dx =

1 00 f (ξ ) 2

Z b a

1 ( b − a )3 ( x − a)( x − b)dx = − f 00 (ξ ) 2 3!

dove ξ è un punto interno all’intervallo [ a, b], incognito ma che non dipende più da x! Possiamo dunque scrivere, Z b a

f ( x )dx = (b − a)

f ( a) + f (b) 1 00 ( b − a )3 − f (ξ ) 2 2 3!

L’integrale della funzione f può essere visto, dunque, come la somma f ( a) + f (b) di due termini, il primo dato da (b − a) che riusciamo 2 1 ( b − a )3 facilmente a calcolare e il secondo dato da − f 00 (ξ ) il cui 2 3! valore dipende da un punto ξ che non conosciamo. Perciò, noi possiamo approssimare l’integrale utilizzando il primo termine della somma, cioè calcolando l’integrale della retta passante per f ( a) e f (b). L’errore che commetteremo sarà dato dal termine che non possiamo calcolare, vale a dire dalla quantità Eint = 1 − f 00 (ξ )(b − a)3 . 12 Indicando con M = maxa≤ x≤b | f 00 ( x )| possiamo maggiorare l’errore mediante la relazione

| Eint | ≤ M

( b − a )3 12

La formula dei trapezi approssima l’integrale di f in [ a, b] mediante l’integrale della retta passante passante per i punti ( a, f ( a)) e (b, f (b)): I=

8.3

Z b a

f ( x )dx ≈ Itrap =

b−a [ f ( a) + f (b)] 2

Formule di Newton-Cotes

Se, al posto di una retta, prendiamo come funzione interpolante la f un polinomio di grado più elevato, otterremo altre formule di quadrature. Supponiamo di poter valutare la f in n + 1 punti x0 , x1 , . . . , xn e costruiamo il polinomio interpolatore di grado n utilizzando la formula di Lagrange.

Se la funzione f ( x ) ≥ 0 si può vedere facilmente che l’integrale della retta che passa per i punti ( a, f ( a)) e (b, f (b)), altro non è che l’area del trapezio sottesa alla corda passante per f ( a) e f (b). Da qui il nome della formula come formula dei trapezi.

116

annamaria mazzia

Figura 8.1: Formula dei trapezi: l’integrale della funzione f (zona tratteggiata in blu) viene approssimata mediante l’area del trapezio sotteso alla retta di interpolazione per f ( a) e f (b) (zona verde).

Avremo pn ( x ) = ∑in=0 f ( xi ) Li ( x ), dove i polinomi di Lagrange sono dati dalla nota formula n

Li ( x ) =

x − xj

∏ xi − x j j =0 j 6 =i

x j = x0 + jh, con j = 0, 1, . . . , n e per un generico punto x compreso tra x0 e xn vale x = x0 + sh con 0 ≤ s ≤ n, s numero reale. Quindi x − x j = x0 + sh − ( x0 + jh) = (s − j)h e xi − x j = (i − j)h, da cui il polinomio di Lagrange si può scrivere come n

Li ( x ) =

s−j

∏ i−j

= Li ( s )

j =0 j 6 =i

Scrivere il polinomio di Lagrange in funzione di s e non di x ci “libera” dall’intervallo [ a, b] in cui dobbiamo integrare e tiene conto soltanto del grado del polinomio che viene considerato. Infatti, tenendo conto che, f ( x ) = pn ( x ) + E( x ) dove E( x ) è l’errore della formula di interpolazione, passando all’integrale, abbiamo Z b a

f ( x )dx =

Z b a

pn ( x )dx +

Z b a

E( x )dx

Il primo integrale a secondo membro rappresenta la formula che approssima l’integrale della f mentre il secondo integrale rappresenta l’errore della formula di quadratura. La formula di quadratura è quindi data dal valore dell’integrale di pn : I=

Z b a

f ( x )dx ≈

Z b n

n

Z b

i =0

a

∑ f (xi ) Li (x)dx = ∑ f (xi )

a i =0

Li ( x )dx

La formula di quadratura ha dunque come nodi i punti xi e come Rb pesi gli integrali a Li ( x )dx.

appunti di calcolo numerico

117

Gli estremi a e b variano al variare dell’integrale da approssimare, ma se vogliamo utilizzare un polinomio di grado n, allora, ponendo, x0 = a e xn = b e tenendo presente che Li ( x ) = Li (s) con x = x0 + sh, Rb possiamo fare un cambiamento di variabile negli integrali a Li ( x )dx. Dal momento che dx = hds abbiamo Z b a

Li ( x )dx =

Z xn

Li ( x )dx =

x0

Z n 0

Li (s)hds = h

Z n 0

Li (s)ds

La traccia dell’intervallo di integrazione è in h, mentre l’integrale da fare non dipende ora dall’intervallo [ a, b]. Questo permette di calcolare una volta per sempre questi integrali e dare una formula di integrazione numerica. Infatti I=

Z b a

n

Z n

i =0

0

f ( x )dx ≈ h ∑ f ( xi )

Li (s)ds

Definiamo coefficienti di Newton-Cotes le espressioni (n)

Ci

1 n

=

Z n 0

Li (s)ds

i = 0, 1, . . . , n

La formula precedente si scrive, quindi, come I=

Z b a

n

f ( x )dx ≈ nh ∑ f ( xi )Ci

(n)

i =0

n

= ( xn − x0 ) ∑ f ( xi )Ci

(n)

(8.1)

i =0

L’errore della formula di quadratura è dato da Eint =

Z b a

E( x )dx =

Z b ( n +1) f (ξ x ) a

( n + 1) !

( x − x0 )( x − x1 ) · · · ( x − xn )dx

Dato un polinomio di interpolazione di grado n mediante il procedimento di Lagrange è dunque possibile ricavare una formula di quadratura numerica che prende il nome di formula di Newton-Cotes. Per quanto riguarda l’errore si può osservare che le formule ottenute con un valore n dispari (cui corrisponde un numero n + 1 pari di punti di appoggio) è solo leggermente inferiore alle formule di ordine pari che le precedono immediatamente (cui corrisponde un numero dispari di punti di appoggio). Per questo motivo le formule di ordine pari sono le più usate. Osserviamo che per f ( x ) ≡ 1, qualunque sia il grado del polinomio utilizzato nelle formule di Newton-Cotes, l’errore di integrazione sarà zero. Applicando l’equazione (8.1) nell’intervallo [ a, b] ≡ [0, 1] si ha 1=

Z 1 0

n

dx =

∑ Ci

(n)

i =0

Troviamo che la somma dei coefficienti di Newton-Cotes vale 1. Formula di Newton-Cotes con n = 1. Per n = 1 (ci sono due punti di appoggio, x0 e x1 ) i coefficienti di Cotes sono quelli già ricavati nella formula dei trapezi

Roger Cotes (1682-1716) fu un matematico inglese che lavorò molto con Isaac Newton, in particolare per la correzione del suo famoso libro "Principia". Egli inventò le formule di quadratura che prendono il suo nome e per primo introdussse quella che oggi conosciamo come formula di Eulero, per cui e x = cos ( x ) + i sin ( x ) nel campo complesso.

118

annamaria mazzia

1 1 1 = L0 (s)ds = 1 0 0 Z 1 Z 1 1 L (s)ds = = 1 0 1 0

Z

(1) C0 (1)

C1

Z

( s − 1) 1 ds = −1 2 s 1 ds = 1 2

e la formula di integrazione diventa, appunto, la formula dei trapezi I=

8.3.1

Z b a

1

f ( x )dx ≈ h ∑ f ( xi )Ci

(1)

= ( x1 − x0 )

i =0

f ( x0 ) + f ( x1 ) 2

Formula di Cavalieri-Simpson

Considerando n = 2 (quindi 3 punti di appoggio nell’intervallo [ a, b], a+b x0 = a, x1 = e x2 = b, i due estremi dell’intervallo e il punto 2 centrale) la formula di quadratura prende il nome di formula di Cavalieri-Simpson (2) C0 (2)

C1

(2)

C2

1 2 1 2 L0 (s)ds = = 2 0 2 0 Z 2 Z 1 1 2 = L (s)ds = 2 0 1 2 0 Z 2 Z 1 1 2 = L2 (s)ds = 2 0 2 0 Z

Z

(s − 1)(s − 2) 1 ds = (−1)(−2) 6 (s)(s − 2) 4 ds = (1)(−1) 6 1 (s)(s − 1) ds = (2)(1) 6

Bonaventura Francesco Cavalieri (15981647) fu un matematico italiano. Studiò teologia e geometria. Lavorò su problemi di ottica e di cinematica. È famoso soprattutto per il cosiddetto principio di Cavalieri. Thomas Simpson (1710-1761) fu un matematico britannico, inventore della formula di quadratura per il calcolo di 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 riscoperta da James Gregory. I suoi studi riguardano anche l’astrologia.

La formula di Cavalieri-Simpson approssima l’integrale della f cona+b siderando come nodi x0 = a, x1 = c = e x2 = b e come pesi i 2 1 (2) 1 4 (2) (2) coefficienti di Cotes C0 = , C1 = , C2 = , ottenendo: 6 6 6 I=

Z b a

2

f ( x )dx ≈ ICS = ( x2 − x0 ) ∑ f ( xi )Ci

(2)

i =0

= (b − a)(

f ( a) 4 f (c) f (b) + + ) 6 6 6

b−a ( f ( a) + 4 f (c) + f (b)) = 6 Con la formula di Cavalieri-Simpson, dunque, l’integrale della f viene approssimato con l’integrale della parabola 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 di Cavalieri-Simpson, consideriamo, seguendo l’approccio visto per la formula dei trapezi, l’integrale dell’errore del polinomio di interpolazione di Lagrange. Per il polinomio di secondo grado p2 che interpola la f , l’errore è f 000 (ξ x ) dato da E( x ) = ( x − a)( x − c)( x − b). 3!

Osserviamo che i valori dei coefficienti di Newton-Cotes sia per n = 1 che per n = 2 sono simmetrici. Questo risultato va generalizzato a qualunque scelta di n: i coefficienti di Newton-Cotes sono simmetrici.

appunti di calcolo numerico

119

Figura 8.2: Formula di Cavalieri-Simpson: l’integrale della funzione f (zona tratteggiata in blu) viene approssimata mediante l’area della regione sottesa alla parabola passante per f ( a), f (c) e f (b) (zona verde).

Quando facciamo l’integrale, l’errore nell’approssimare l’integrale esatto con la formula di Cavalieri-Simpson è dunque dato da

Eint =

Z b 000 f (ξ x ) a

3!

( x − a)( x − c)( x − b)dx

Questa volta, la funzione ( x − a)( x − c)( x − b) cambia segno all’interno dell’intervallo [ a, b] e non possiamo più applicare il teorema del Valor Medio come nella formula dei trapezi. In maniera più laboriosa, tuttavia, si ricava per l’errore la seguente formula:

Eint

f IV (u) =− 90



b−a 2

5

=−

f IV (u) ( b − a )5 2880

dove u è un opportuno punto dell’intervallo ] a, b[.

8.3.2

Sull’errore della formula di Cavalieri-Simpson

Per capire l’errore che si ha nella formula di Cavalieri-Simpson, deduciamo la stessa formula seguendo un’altra strada. Per semplificare il discorso, scegliamo l’intervallo [ a, b] simmetrico rispetto all’origine, quindi del tipo [−t, t] con t ∈ R, sapendo che, se non fosse così, basta applicare una traslazione dell’asse x per ricondursi a questo caso. Scriviamo il polinomio di interpolazione che passa per i punti −t, 0 e t e che interpola anche la derivata prima della f in 0. Mediante la tabella delle differenza divise, il punto 0 va contato due volte e si ha:

120

annamaria mazzia

−t

f (−t)

0

f (0)

f (0) − f (−t) t

f (0) − f (−t) t f 0 (0) − f (0) + f (−t) t 0 f (0) = t t2 f ( t ) − f (0) − f 0 (0) f ( t ) − f (0) f ( t ) − f (0) − t f 0 (0) t t f (t) = t t t2 Il polinomio di interpolazione è, dunque f 0 (0) −

f 0 (0)

f (t) − 2t f 0 (0) − f (−t) 2t3

f (t) − 2t f 0 (0) − f (−t) f (0) − f (−t) t f 0 (0) − f (0) + f (−t) ( x + t ) x + ( x + t) x2 ( x + t) + t t2 2t3 L’errore di interpolazione per questo polinomio di grado 3 vale

p( x ) = f (−t) +

f ( IV ) (ξ x ) ( x + t) x2 ( x − t) 4! Quindi da f ( x ) = p( x ) + E( x ), andando a integrare tra −t e t si ha: E( x ) =

Z t −t

f ( x )dx =

Z t −t

p( x )dx +

Z t −t

E( x )dx

Nell’integrazione del polinomio p( x ) è facile vedere che i termini che dipendono da f 0 (0) portano un contributo nullo. Infatti    Z t 0 Z t  0 f 0 (0) x3 f (0) f (0) ( x + t) x − 2 ( x + t) x2 dx = x2 + tx − − x2 dx t t t t −t −t   t f 0 (0) x 2 x4 = =0 t − t 2 4t −t Gli integrali degli altri termini del polinomio p( x ) portano alla formula di Cavalieri-Simpson. Infatti (omettendo i passaggi matematici e ricordando che l’ampiezza dell’intervallo su cui stiamo lavorando è h = 2t) si ha Z t  −t

f (−t) +

 f (t) − f (−t) f (0) − f (−t) f (−t) − f (0) 2 ( x + t ) x + ( x + t ) x dx = ( x + t) + t t2 2t3

2t ( f (−t) + 4 f (0) + f (t)) 6 h = ( f (−t) + 4 f (0) + f (t)) 6 Allora l’errore della formula di Cavalieri-Simpson coincide con l’integrale di E( x ). R t f ( IV ) (ξ x ) Quindi Eint = −t ( x + t) x2 ( x − t)dx 4! La funzione ( x + t) x2 ( x − t) = ( x2 − t2 ) x2 non cambia mai segno all’interno dell’intervallo [−t, t], quindi si può applicare il teorema del Valore Medio del calcolo integrale, per cui

=

Eint =

f ( IV ) (ξ ) 24

Z t −t

( x2 − t2 ) x2 dx =

 t f ( IV ) (ξ ) x5 x3 f ( IV ) (ξ ) 5 − t2 =− t 24 5 3 −t 90

Considerando che l’ampiezza dell’intervallo è h = 2t si ha f ( IV ) (ξ ) h 5 f ( IV ) (ξ ) 5 ( ) =− h 90 2 2880 Troviamo la formula dell’errore per Cavalieri-Simpson. Eint = −

appunti di calcolo numerico

Formule composte

8.4

Le formule di Newton-Cotes non vanno bene su intervalli molto ampi perchè per avere risultati più accurati dovremmo utilizzare formule di grado elevato (in modo da utilizzare un numero elevato di punti di appoggio). Ci sono vari motivi che sconsigliano questa procedura:

x

i valori dei coefficienti in formule di grado elevato sono difficili da ottenere;

x

le formule di Newton-Cotes, essendo basate su polinomi di interpolazione con nodi equidistanti, danno risultati inaccurati su intervalli ampi a causa della natura oscillatoria dei polinomi di grado elevato.

Conviene dunque utilizzare formule di grado basso ma scomponendo l’intervallo di integrazione in più sottointervalli e, in ciascuno di essi, applicare la stessa formula. Sfruttiamo il fatto che se l’intervallo [ a, b] viene diviso in n sottointervalli in modo che [ a, b] = [ a, x1 ] ∪ [ x1 , x2 ] ∪ [ x2 , x3 ] ∪ . . . ∪ [ xn−1 , b], allora Z b a

f ( x )dx =

Z x 1 a

f ( x )dx +

Z x2 x1

f ( x )dx +

Z x3 x2

f ( x )dx + . . . +

Z b x n −1

f ( x )dx

Su ciascuno intervallo [ xi−1 , xi ] per i = 1, 2, . . . , n, approssimiamo l’integrale della f mediante una formula di quadratura più semplice, utilizzando pochi punti.

8.4.1

Formula composta dei trapezi

Suddividiamo l’intervallo [ a, b] in n sottointervalli definiti dai punti d’appoggio x0 , x1 , . . . , xn (per semplicità supponiamo i punti equidib−a stanti con passo h = , in modo che x0 = a e xn = b, xi = x0 + ih, n i = 0, . . . , n). L’integrale su [ a, b] si può dunque ottenere come somma degli integrali su tali sottointervalli: Z b a

f ( x )dx =

n Z xi



i =1 x i −1

f ( x )dx

Ciascuno degli integrali su [ xi−1 , xi ] viene approssimato utilizzando la formula dei trapezi: n Z xi



i =1 x i −1

n

f ( x )dx ≈



i =1

n x i − x i −1 h [ f ( xi−1 ) + f ( xi )] = ∑ [ f ( xi−1 ) + f ( xi )] 2 2 i =1

In forma estesa abbiamo h I ≈ [ f ( x0 ) + 2 f ( x1 ) + 2 f ( x2 ) + . . . + 2 f ( xn−1 ) + f ( xn )] 2 f ( a) + f (b) = h[ + f ( x1 ) + f ( x2 ) + . . . f ( xn−1 )] 2

121

122

annamaria mazzia

Figura 8.3: Formula composta dei trapezi, utilizzando 3 sottointervalli (4 punti).

8.4.2

Errore nella formula composta dei trapezi

L’errore che si commette nella formula composta dei trapezi è dato dalla somma degli errori commessi sui singoli sottointervalli n

Eint =

n

h3

h3

∑ − f 00 (ξ i ) 12 = − ∑ f 00 (ξ i ) 12 i =1

i =1

Supponendo che la derivata seconda della f sia continua e limitata in [ a, b] e chiamando con m e M rispettivamente il minimo e il massimo di f 00 in [ a, b], si ha: m ≤ f 00 (ξ i ) ≤ M

i = 1, . . . , n

Considerando la somma di queste diseguaglianze, per i = 1, . . . , n si ricava n

nm ≤

∑ f 00 (ξ i ) ≤ nM

=⇒ m ≤

i =1

∑in=1 f 00 (ξ i ) ≤M n

∑in=1 f 00 (ξ i ) è n un valore assunto dalla funzione in qualche punto ξ di [ a, b], vale a dire, esiste un punto ξ che non conosciamo, all’interno dell’intervallo [ a, b] tale che Per il teorema del Valor Intermedio (teorema 3.6.3),

f 00 (ξ ) =

∑in=1 f 00 (ξ i ) ovvero n

n

∑ f 00 (ξ i ) = n f 00 (ξ ).

i =1

Sostituendo la relazione appena trovata nella formula dell’errore e b−a , si ricava ricordando che h = n n

Eint = − ∑ f 00 (ξ i ) i =1

h3 h3 f 00 (ξ ) f 00 (ξ ) (b − a)3 = −n f 00 (ξ ) = − ( b − a ) h2 = − 12 12 12 12 n2

appunti di calcolo numerico

Quindi per n → ∞ l’errore tende a zero come 1 mente, come 2 . n

h2

o, equivalente-

123

Da nh3 si ha n(b − a)/nh2 = (b − a) h2 o, in alternativa, nh3 = n(b − a)3 /n3 = (b − a)3 /n2 .

Formula composta di Cavalieri-Simpson

8.4.3

Suddividiamo l’intervallo [ a, b] in n sottointervalli di ampiezza costante uguale a h e su ciascuno di questi sottointervalli applichiamo la formula di Cavalieri-Simpson. Abbiamo, in questo modo, la formula composta di Cavalieri-Simpson. Su ogni intervallino, quindi, dobbiamo considerare gli estremi dell’intervallino e il punto centrale di esso. a + bi Siano ai e bi gli estremi di ciascuna suddivisione e sia ci = i 2 il punto medio di ciascuna suddivisione (per i = 1, . . . , n). In tal modo, seguendo lo stesso ragionamento fatto per i trapezi si ha: Z b a

f ( x )dx =

Z b 1 a1

f ( x )dx +

Z b2 a2

f ( x )dx + . . . +

Z bn an

L’estremo superiore bi di ciascun intervallino, con i = 1, n − 1 coincide con l’estremo inferiore dell’intervallino successivo: bi = a i + 1 .

f ( x )dx

Applicando la formula di Cavalieri-Simpson su ciascun intervallino risulta: Z b i ai

f ( x )dx ≈

bi − a i h ( f ( ai ) + 4 f (ci ) + f (bi )) = ( f ( ai ) + 4 f (ci ) + f (bi )) 6 6

In tal modo Z b a

n

f ( x )dx ≈

h

∑ 6 ( f (ai ) + 4 f (ci ) + f (bi ))

i =1

Se gli intervallini non sono uniformi, la formula va scritta considerando il valore hi per ciascun intervallino.

Si ha la formula composta di Cavalieri-Simpson. Figura 8.4: Formula composta di CavalieriSimpson, utilizzando 3 sottointervalli (7 punti).

124

annamaria mazzia

Formula composta di Cavalieri-Simpson in forma compatta. Possiamo vedere la formula composta di Cavalieri-Simpson anche in una forma compatta. Considerando che, su ogni sottointervallo, dobbiamo prendere il punto medio, facciamo una numerazione progressiva dei punti di integrazione nel modo seguente: x0 = a x2i = x0 + ih x2i+1

i = 0, . . . n

1 = x0 + ( i + ) h 2

I nodi pari corrispondono agli estremi dei sottointervalli, mentre i nodi dispari sono i punti centrali di ogni sottointervallo.

i = 0, . . . , n − 1

Per la formula di quadratura otteniamo I=

Z b a

f ( x )dx =

n−1 Z x2i+2



x2i

i =0 n −1





i =0

f ( x )dx

h [ f ( x2i ) + 4 f ( x2i+1 ) + f ( x2i+2 )] 6

h [ f ( x0 ) + 4 f ( x1 ) + 2 f ( x2 ) + 4 f ( x3 ) + . . . + 2 f ( x2n−2 ) + 4 f ( x2n−1 ) + f ( x2n )] 6 n −1 n −1 h = [ f ( x0 ) + 4 ∑ f ( x2i+1 ) + 2 ∑ f ( x2i ) + f ( x2n )] 6 i =0 i =0

=

8.4.4

Errore nella formula composta di Cavalieri-Simpson

Per quanto riguarda l’errore nella formula composta di CavalieriSimpson, sarà dato dall somma degli errori di integrazione sugli n sottointervalli. Nell’ipotesi che la derivata quarta sia continua e limitata, si ha:   1 h 5 IV Eint = − ( f (ξ 1 ) + f IV (ξ 2 ) + . . . + f IV (ξ n )) 90 2

=−

h5 n−1 IV ( b − a )5 f (ξ i ) = − ∑ 2880 i=0 2880n5

n −1



1 n

i =0

n

∑ f IV (ξ i )

i =1

Allora Eint = −

b−a . n

f IV (ξ i )

Si considera quindi il punto ξ tale che f IV (ξ ) =

Ricordiamo che stiamo considerando sottointervalli della stessa ampiezza h =

(b − a)5 IV (b − a)h4 IV f (ξ ) f ( ξ ) = − 2880 2880n4

1 o, equivalentemente, n4 1 come h4 . Nella formula dei trapezi l’errore invece decresce come 2 . n Ci aspettiamo quindi che il maggiore sforzo computazionale dia una maggiore accuratezza nei risultati quando si applica la formula di Cavalieri-Simpson rispetto alla formula dei trapezi. Quindi per n → ∞ l’errore tende a zero come

Per arrivare a questi risultati, il ragionamento è del tutto analogo a quanto è stato fatto sulla derivata seconda nella formula composta dei trapezi. Questa volta, però, si deve considerare la derivata quarta. Per esercizio, si consiglia di ripetere tutti i passaggi per arrivare al risultato.

appunti di calcolo numerico

8.4.5

Confronti tra la formula dei trapezi e di CavalieriSimpson

Esempio Consideriamo f ( x ) = e x . Sia a = 0 e b = 1. Allora, per l’integrale esatto e per le formule dei trapezi e di Cavalieri-Simpson, si ha, rispettivamente: I=

Z 1 0

e x dx = [e x ]10 = e − 1 = 1.718281828

1 (1 + e) = 1.859140914 2 1 1 = (1 + 4e1/2 + e) = (1 + 6.594885083 + 2.718281828) = 1.718861152 6 6

Itrap = IC−S

La formula di Cavalieri-Simpson dà il risultato migliore. Sia ancora f ( x ) = e x ma gli estremi di integrazione siano a = 0.9 e b = 1. Allora I=

Z 1 0.9

e x dx = e − e0.9 = 0.2586787173

0.1 0.9 (e + e) = −2.2 × 10−4 2 0.1 0.9 (e + 4e0.95 + e) = −9.0 × 10−9 = I− 6

I − Itrap = I − I − IC−S

Ora la formula di Cavalieri-Simpson si rivela particolarmente accurata. Ciò non deve sorprendere se si va a vedere la formula dell’errore, con l’ampiezza dell’intervallo che da 1 si è ridotta a 0.1, per cui (b − a)5 da 1 vale ora 10−5 . Considerato che f 00 = f e f IV = f , queste derivate possono essere maggiorate dal valore assunto nell’estremo superiore dell’intervallo, cioè e. Quindi gli errori delle formule dei trapezi e di Cavalieri-Simpson sono maggiorate da e (b − a)3 = 2.265 × 10−1 (b − a)3 12 e | EC−S | ≤ (b − a)5 = 9.438 × 10−4 (b − a)5 2880

| Etrap | ≤

Perciò per a = 0 e b = 1 gli errori sono maggiorati da

| Etrap | ≤ 2.265 × 10−1 | EC−S | ≤ 9.438 × 10−4

Invece per a = 0.9 e b = 1, poichè b − a = 0.1 = 10−1 , abbiamo

| Etrap | ≤ 2.265 × 10−1 · 10−3 = 2.265 × 10−4 | EC−S | ≤ 9.438 × 10−4 · 10−5 = 9.438 × 10−9

_

125

126

annamaria mazzia

Esempio Si voglia approssimare l’integrale Z 1 0

2

e− x dx ≈ 0.746824.

È un integrale che non può essere risolto analiticamente. Se si vuole calcolare una sua approssimazione senza fare uso di formule di quadrature, possiamo, ad esempio, pensare di applicare la

Suddividiamo l’intervallo [0, 1] in 4 sottointervalli. Sia h = 1/4 = 0.25. Per la formula composta dei trapezi abbiamo Itrap =

2 2 2 2 h 0 [e + 2e−h + 2e−(2h) + 2e−(3h) + e−(4h) ] 2 2

2

2

= 0.125[1 + 2e−0.125 + 2e−0.5 + 2e−0.75 + e−1 ]

limn→∞ ∑in=0

approssimazione dell’integrale la somma parziale ∑in=0 f ( a + ih(n)) · h(n) con un valore di n molto grande. Per esempio, con n = 107 otteniamo il valore 0.74682420125254.

= 0.742984

Applichiamo ora la formula di Cavalieri-Simpson su soli 2 sottointervalli, in modo da valutare la funzione negli stessi punti precedenti. L’ampiezza di ciascun sottointervallo è dunque h = 0.5. 3 2 2 2 2 h 0 [e + 4e−(h/2) + 2e−(h) + 4e−( 2 h) + e−(2h) ] 6 2 2 2 0.25 [1 + 4e−0.125 + 2e−0.5 + 4e−0.75 + e−1 ] = 3 = 0.746855

IC−S =

A parità di punti (e non di sottointervalli) la formula di CavalieriSimpson è più accurata di quella dei trapezi. Invece considerando 4 sottointervalli nella formula di CavalieriSimpson dobbiamo considerare anche i punti interni di ascisse 0.125, 0.375, 0.625, 0.875 e il risultato che otteniamo è 0.746826, evidentemente maggiormente accurato. _ Se la funzione integranda ha le derivate che sono facili da determinare e da maggiorare, la formula dell’errore può essere utile per determinare il numero di sottointervalli su cui applicare una formula composta di quadratura in modo da ottenere un’approssimazione con un errore minore di una tolleranza prefissata.

R1 2 Esempio Consideriamo 0 e− x dx. In quanti sottointervalli bisogna suddividere l’intervallo di integrazione per applicare la formula dei trapezi e di Cavalieri-Simpson e ottenere un errore che sia minore di una tolleranza e = 10−5 ? Per i trapezi, l’errore è maggiorato da | Etrap | ≤

max0≤ x≤1 | f 00 ( x )| (b − a)3 12 n2

Per Cavalieri-Simpson si ha

| EC−S | ≤

max0≤ x≤1 | f IV ( x )| (b − a)5 2880 n4

Rb

= a f ( x ) dx f ( a + ih(n)) · h(n), con h(n) = (b − a)/n, e considerare come

definizione di integrale

appunti di calcolo numerico

2

Da f ( x ) = e− x abbiamo, per le derivate: f 0 ( x ) = −2xe− x

2

f 00 ( x ) = (−2 + 4x2 )e− x

2

f 000 ( x ) = (12x − 8x3 )e− x

2

f IV ( x ) = (12 − 48x2 + 16x4 )e− x

2

Si trova che il massimo di | f 00 | e | f IV | in [0, 1] è dato dal loro valore in x = 0, quindi abbiamo:

| Etrap | ≤

1 2 = 2 12n2 6n

| EC−S | ≤

12 1 = 2880n4 240n4

La richiesta dell’accuratezza per l’errore diventa:

| Etrap | ≤ 10−5

| EC−S | ≤ 10−5

vale a dire, rispettivamente, 1 ≤ 10−5 240n4

1 ≤ 10−5 6n2

Per i trapezi, il primo intero n che verifica la disuguaglianza è 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 i risultati: Itrap = 0.74682050480289

IC−S = 0.7468249482544 _

8.5

Estrapolazione di Richardson

Applichiamo la formula di Cavalieri-Simpson sull’intero intervallo [ a, b]. L’errore che si commette, come sappiamo, vale f IV (ξ 1 ) E1 = − 90



b−a 2

5

=−

f IV (ξ 1 ) ( b − a )5 2880

Suddividiamo ora l’intervallo [ a, b] in due sottointervalli e applichiamo la formula composta di Cavalieri-Simpson. L’errore che otteniamo vale E2 = −

f IV (ξ 2 ) (b − a)5 2880 24

e, supponendo che le derivate quarte della f non siano molto diverse E tra loro, si ha E2 ≈ 1 . 16

127

128

annamaria mazzia

L’errore, quindi, diventa 16 volte più piccolo passando dalla formula di Cavalieri-Simpson in un intervallo alla formula applicata in due sottointervalli. Sia I il valore esatto dell’integrale e Q1 e Q2 i due valori approssimati ottenuti considerando la formula di Cavalieri-Simpson con n = 1 e n = 2 sottointervalli. Sia e l’errore, cambiato di segno, che si ha con n = 2, e = − E2 ≈ − E1 /16. Possiamo scrivere I + e = Q2 per n = 2 I + 16e = Q1 per n = 1

Si può ricavare e dalle due relazioni ottenendo e=

Q1 − Q2 15

Quindi I ≈ Q2 +

Q2 − Q1 15

Utilizzando le due approssimazioni Q1 e Q2 possiamo approssimare l’integrale esatto con una maggiore accuratezza mediante la formula appena scritta. Questo procedimento prende il nome di estrapolazione di Richardson. Può essere utilizzato per migliorare l’approssimazione di un integrale ma è basato sull’ipotesi che le derivate quarte della funzione integranda siano circa uguali e, quindi, va usato con cautela.

8.6

Si può dimostrare che la nuova approssimazione ottenuta coincide con la formula di Newton-Cotes con n = 4, dove l’errore è proporzionale a 1/n6 e alla derivata sesta di f.

Integrare dati tabulati

A volte non si conosce la funzione da integrare ma si hanno a disposizione solo dei dati che rappresentano valori discreti di una funzione non nota. In questi casi, non si può applicare una formula di quadratura su sottointervalli della stessa ampiezza ma bisogna tener conto dei dati a disposizione. Vediamo un esempio, supponendo di voler determinare la distanza percorsa da un veicolo di cui si conosce la velocità in alcuni istanti di tempo. In particolare, si hanno i dati che vediamo in Tabella 8.6. ds Sapendo che la velocità v è data da v(t) = (dove s rappresenta lo dt spostamento e t il tempo), per calcolare la distanza percorsa dobbiamo integrare la velocità tra il tempo iniziale e quello finale. In questo esempio, dobbiamo anche avere unità di misure omogenee perciò il tempo in minuti va trasformato in ore in modo che ci sia consistenza con la velocità espressa in chilometri orari: a tale scopo basterà dividere per 60 gli istanti di tempo. Tra le formule che abbiamo studiato, applicheremo la formula composta dei trapezi, considerando i sottointervalli non uniformi che vengono generati prendendo istanti di tempo successivi ([1, 2],

t

v

1 20 2 40 3.25 45 4.5 58 6 65 7.2 70 7.5 70 8 68 9.2 60 10 52 Tabella 8.1: Il tempo (t) è espresso in minuti e la velocità (v) è data in chilometri all’ora.

appunti di calcolo numerico

[2, 3.25], [3.25, 4.5]...) e applicando su ciascuno di essi la formula dei trapezi. Abbiamo il seguente risultato:

Z 10 1

129

In questo problema gli istanti di tempo ci permettono di applicare solo la formula dei trapezi e non quella di Cavalieri-Simpson. Per applicare la formula di Cavalieri-Simpson dovremmo poter considerare tre istanti successivi di tempo alla volta, in cui il punto centrale sia il punto medio del sottointervallo: ad esempio se abbiamo un intervallo con i punti [1, 1.5, 2, 3, 4, 4.2, 4.4], allora possiamo suddividerlo nei sottointervalli [1, 2] con punto medio 1.5, [2, 4] con punto medio 3 e [4, 4.4] con punto medio 4.2. E potremo applicare la formula di Cavalieri-Simpson su ciascuno di questi sottointervalli.

(2 − 1) (20 + 40) (3.25 − 2) (40 + 45) + 60 2 60 2 (4.5 − 3.25) (45 + 58) (6 − 4.5) (58 + 65) + + 60 2 60 2 (7.2 − 6) (65 + 70) (7.5 − 7.2) (70 + 70) + + 60 2 60 2 (8 − 7.5) (70 + 68) (9.2 − 8) (68 + 60) + + 60 2 60 2 (10 − 9.2) (60 + 52) + 60 2 = 8.29750.

v(t)dt ≈

Sono stati percorsi circa 8.2975 km. Vediamo un altro esempio. t

Esempio Un’automobile effettua il giro di una pista in 84 secondi. La velocità dell’auto viene misurata ogni 6 secondi usando un’apparecchiatura radar per il controllo della velocità, ricavando i valori che si trovano in Tabella 8.6. In base ai dati in possesso, quanto è lunga la pista? Come nell’esempio precedente, si tratta di integrare la velocità tra il tempo iniziale e quello finale. Se applichiamo la formula composta dei trapezi sui 14 intervalli di ampiezza h = 6 secondi che ricaviamo dalla tabella (ponendo v1 = v(0), v2 = v(6), . . . , v13 = v(78), v14 = v(84)), abbiamo:

 L=6

v1 + v14 + v2 + v3 + . . . + v13 2

v

0 38 41 6 12 45 18 48 24 45 30 41 36 37 33 42 48 30 26 54 60 24 66 27 32 72 78 35 84 37 Tabella 8.2: Dati della velocità misurati ogni 6 secondi. Il tempo (t) è espresso in secondi e la velocità (v) è data in metri al secondo.



= 3009 metri

Possiamo anche applicare la formula di Cavalieri-Simpson, considerando ora 7 intervalli di ampiezza pari a h = 12 secondi. In tal caso, otteniamo:

L = 2 (v1 + 4v2 + 2v3 + 4v4 + 2v5 + . . . + 2v12 + 4v13 + v14 ) = 3010 metri

In questo caso entrambi i risultati sono accettabili. _

130

8.7

annamaria mazzia

Esercizi

Esercizio 8.7.1 Sia dato l’integrale I =

Z 0 −2

e− x ( x + 1) dx.

(a) Approssimare il valore dell’integrale applicando la formula dei trapezi con n = 5 suddivisioni in parti uguali dell’intervallo di integrazione. (b) Trovare una maggiorazione dell’errore commesso e, dopo aver calcolato analiticamente l’integrale esatto, confrontare tale stima con l’errore esatto. Svolgimento (a) Applichiamo la formula dei trapezi con n = 5 suddivisioni dell’intervallo dato. Vale, dunque, h = 0.4. I punti da considerare e il valore della f ( x ) = e− x ( x + 1), sono: i 0 1 2 3 4 5

xi -2 -1.6 -1.2 -0.8 -0.4 0

f ( xi ) -7.3890561 -2.97181945 -0.664023385 0.445108186 0.895094819 1

La formula dei trapezi è Itrap = h(

f ( x0 ) + f ( x5 ) + f ( x1 ) + f ( x2 ) + f ( x3 ) + f ( x4 )) = −2.19606715 2

(b) Per calcolare una maggiorazione dell’errore commesso, dobbiamo calcolare la derivata seconda della f . Da f ( x ) = e− x ( x + 1) segue f 0 ( x ) = −e− x ( x + 1) + e− x = −e− x x e f 00 ( x ) = e− x x − e− x = e− x ( x − 1). Poichè f 00 ( x ) è sempre negativa nell’intervallo di integrazione e a noi interessa la funzione valore assoluto della f 00 ( x ), studiamo la funzione g( x ) = | f 00 ( x )| = e− x (1 − x ). Si ha che g0 ( x ) = e− x ( x − 2) < 0 in [−2, 0], quindi g è decrescente e ha valore massimo per x = −2. Si ha dunque che M = max | f 00 ( x )| = | f 00 (−2)| = 22.1671682968 |(b − a)3 | Quindi | Etrap | ≤ M = 0.591124488 12 · 52 Analiticamente, è facile calcolare l’integrale esatto (per parti): I=

Z 0 −2

f ( x ) dx = −e− x ( x + 1)|0−2 +

Z 0 −2

e− x dx = −e− x ( x + 2)|0−2 = −2

Quindi l’errore esatto, in valore assoluto, è: | I − Itrap | = 0.196067154, un valore minore della maggiorazione trovata prima.

appunti di calcolo numerico

Esercizio 8.7.2 Sia dato l’integrale Z 2 2 dx 0 x−4 (a) Dare una sua approssimazione con la formula dei trapezi e n = 4 suddivisioni in parti uguali dell’intervallo di integrazione. (b) Trovare una maggiorazione dell’errore commesso. (c) Confrontare l’errore esatto con la stima precedentemente trovata. (d) Dire in quanti sottointervalli occorre suddividere l’intervallo di integrazione per ottenere una maggiorazione dell’errore minore della tolleranza e = 10−5 .

Svolgimento (a) Suddividendo l’intervallo di integrazione [0, 2] in n = 4 parti si trova un passo h = 2/4 = 1/2 = 0.5. La formula dei trapezi è: b − a f ( a) + f (b) ( + f ( x1 ) + f ( x2 ) + f ( x3 )) n 2 f (0) + f (2) = 0.5( + f (0.5) + f (1) + f (1.5)) 2 −0.5 − 1 = 0.5( − 0.571428571 − 0.666666667 − 0.8) 2 = −1.39404762

IT =

f 00 (ξ ) (b − a)3 12 n2 2 −2 4 Da f ( x ) = segue f 0 ( x ) = e f 00 ( x ) = . 2 x−4 ( x − 4) ( x − 4)3

(b) Consideriamo la formula dell’errore: E = −

Per maggiorare l’errore dobbiamo considerare che vale max0≤ x≤2 | f 00 ( x )| (b − a)3 | E| ≤ , da cui dobbiamo calcolare M = 12 n2 max0≤ x≤2 | f 00 ( x )|. La funzione ( x − 4)3 è continua, crescente e sempre negativa nel4 4 l’intervallo [0, 2]. Quindi | : osserviamo il | = ( x − 4)3 (4 − x )3 4 cambiamento al denominatore. Poniamo g( x ) = . Ri(4 − x )3 12 sulta g0 ( x ) = > 0 in [0, 2], quindi la g è crescente e (4 − x )4 ha valore massimo per x = 2. Perciò M = max0≤ x≤2 | f 00 ( x )| = 4 | f 00 (2)| = 3 = 1/2 = 0.5. Si ha allora la maggiorazione dell’errore 2 M 23 1 | E| ≤ = = 0.0208333333 12 42 48 (c) L’integrale esatto si calcola facilmente:

131

132

I=

annamaria mazzia

Z 2 0

2 dx = 2 ln (| x − 4|)|20 = 2 ln (| − 2|) − 2 ln (| − 4|) = 2 ln (1/2) = ln (1/4) − 1.386294361 x−4

L’errore esatto commesso con la formula dei trapezi, in valore assoluto, è | I − IT | = 0.00775325793 (d) Perchè la maggiorazione dell’errore sia minore della tolleranza M 23 M 3 5 ≤ 10−5 cioè n2 ≥ e = 10−5 deve essere | E| ≤ 2 10 = 2 12 n 12 5 10 = 33333.333333. Quindi n > 182.574186, vale a dire n = 183. 3

Esercizio 8.7.3 Dato l’integrale Z 0.5 1 √ dx I= 0 1 − x2 (a) si approssimi I con i valori Q1 e Q2 ottenuti applicando il metodo di Cavalieri-Simpson prima a tutto l’intervallo e poi suddividendo l’intervallo in due parti uguali; (b) si approssimi I usando la formula di estrapolazione di Richardson; (c) dopo aver calcolato analiticamente il valore esatto di I, determinare l’errore esatto commesso con l’estrapolazione di Richardson.

Svolgimento (a) Applichiamo la formula di Cavalieri-Simpson su tutto l’intervallo, considerando che l’ampiezza dell’intervallo è b − a = 0.5 0.5 ( f (0) + 4 f (0.25) + f (0.5)) = 0.523823565 6

Q1 =

Si ha, infatti, f (0) = 1, f (0.25) = 1.03279556 e f (0.5) = 1.15470054. Suddividendo l’intervallo in due parti uguali, abbiamo h = 0.25, da cui i punti: x0 = a = 0, x1 = 0.125, x2 = 0.25, x3 = 0.375, e x4 = b = 0.5. Q2 =

h ( f ( x0 ) + 4( f ( x1 ) + 4 f ( x3 )) + 2 f ( x2 ) + f ( x4 )) = 0.523616326 6

dove f (0.125) = 1.00790526, f (0.375) = 1.07871978 (essendo già in possesso degli altri valori, calcolati per Q1 ) (b) La formula di estrapolazione di Richardson è: IR = Q2 + da cui ricaviamo IR = 0.5236025101

Q2 − Q1 15

(c) Analiticamente l’integrale esatto è: I=

Z 0.5 0



1 1 − x2

dx = arcsin ( x )|0.5 0 = π/6 − 0 = 0.523598775

L’errore esatto commesso con l’estrapolazione di Richardson, in valore assoluto, è: | I − IR | = 3.7351 · 10−6 .

appunti di calcolo numerico

Esercizio 8.7.4 È data la seguente tabella di dati sperimentali xi yi

1 3.1

2 5

3 6.2

4 8.6

5 9.8

6 11.4

7 12.9

dove i valori yi approssimano il valore di una certa funzione f nei punti R7 xi . Calcolare il valore approssimato di I = 1 f ( x )dx impiegando la formula di Cavalieri-Simpson composta applicata su tutti i valori della tabella (vale a dire considerando le n = 3 suddivisioni dell’intervallo [1, 7] individuate dalla tabella).

Svolgimento In questo esercizio, non sappiamo chi sia la funzione f ma abbiamo solo dei dati sperimentali. Perciò dobbiamo applicare la formula di Cavalieri-Simpson utilizzando solo i dati a disposizione. D’altro canto, le ascisse dei punti, assegnati nell’intervallo [1, 7] ci permettono di avere n = 3 suddivisioni dell’intervallo su cui applicare la formula di Cavalieri-Simpson: la suddivisione [1, 3] (con punto centrale 2), la suddivisione [3, 5] (con punto centrale 4) e infine la suddivisione [5, 7] con punto centrale 6. Applicando la formula di Cavalieri-Simpson composta su questi n = 3 si ottiene come valore I = 49.333333333333333333.

Esercizio 8.7.5 Sia da calcolare il seguente integrale: I=

Z 2 1

1 + 6x2 − 10x4 dx

(a) si approssimi I con la formula di Cavalieri-Simpson applicata su n = 1 e n = 2 suddivisioni in parti uguali dell’intervallo di integrazione; (b) dare una maggiorazione dell’errore commesso nei due casi confrontandolo poi con l’errore esatto; (c) applicare il metodo di estrapolazione di Richardson e spiegare l’errore che si ottiene.

Svolgimento (a) Per n = 1 suddivisione dell’intervallo di integrazione, la formula di Cavalieri-Simpson è quella semplice: i punti da considerare sono gli estremi 1 e 2 e il punto centrale 1.5. Si ricava il valore In1 = −47.083333333333329. Per n = 2 suddivisioni dell’intervallo, si hanno i sottointervalli [1, 1.5] e [1.5, 2] che hanno rispettivamente, come punti centrali, i valori 1.25 e 1.75. L’ampiezza della singola suddivisione vale

133

134

annamaria mazzia

0.5. Applicando la formula di Cavalieri-Simpson composta di ha In2 = −47.005208333333329. (b) Per avere una maggiorazione dell’errore commesso, abbiamo bisogno della derivata quarta. Si ha f 0 ( x ) = 12x − 40x3 , f 00 ( x ) = 12 − 120x2 , f 000 ( x ) = −240x e f (iv) ( x ) = −240. La derivata quarta è costante. Il massimo di | f (iv) ( x )| vale 240. In questo caso la maggiorazione dell’errore, in valore assoluto, coincide esattamente con l’errore vero (proprio perché la derivata quarta è costante!). Quindi | En1 | = 240/2880 = 8.3333333E − 002 e | En2 | = 240/(2880 · 24 ) = 5.2083333E − 003. Quindi, nel calcolare l’errore vero come | I − In | ci aspettiamo di trovare gli stessi risultati. Infatti, l’integrale esatto vale I = R2 2 4 3 5 2 1 1 + 6x − 10x dx = | x + 2x − 2x |1 = −47. Se calcoliamo, ora, | I − In1 | e | I − In2 | ritroviamo gli stessi valori trovati prima. (c) Se applichiamo la formula di estrapolazione di Richardson otteniamo IRich = In2 + ( In2 − In1 )/15 = −47. Con Richardson otteniamo il valore esatto dell’integrale, dal momento che la relazione che ora lega il rapporto tra gli errori (tra n = 1 e n = 2 suddivisioni) e che porta alla formula di Richardson è una eguaglianza esatta, | En1 | = 4| En2 |!

8.8

Domande di riepilogo

1. Come si ricava la formula dei trapezi e quale significato geometrico ha? 2. Come si ricava l’errore nella formula dei trapezi? 3. Come sono legate le formule della famiglia di Newton-Cotes all’interpolazione secondo Lagrange? Come si ricavano le formule della famiglia di Newton-Cotes? Cosa sono i coefficienti di Newton-Cotes? 4. Spiegare la formula di Cavalieri-Simpson e il suo errore. 5. Cosa significa “formula composta”? Quali formule composte abbiamo studiato? 6. Spiegare la formula dei trapezi composta. 7. Ricavare la formula dell’errore quando si applica la formula dei trapezi composta. Quali ipotesi occorre fare? 8. Spiegare la formula di Cavalieri-Simpson composta. 9. Ricavare la formula dell’errore quando si applica la formula di Cavalieri-Simpson composta. Quali ipotesi occorre fare?

appunti di calcolo numerico

10. Cosa succede se si fa il rapporto tra gli errori passando da una formula composta con n suddivisioni in parti uguali dell’intervallo di integrazione ad una formula con 2n suddivisioni in parti uguali? Quali ipotesi devono essere verificate? Esaminare il caso in cui la formula composta è data dai trapezi e poi quello in cui si applica la formula composta di Cavalieri-Simpson. 11. Spiegare l’estrapolazione di Richardson. 12. Quando l’estrapolazione di Richardson dà il valore esatto dell’integrale? 13. Mostrare che il procedimento di estrapolazione di Richardson se applicato alla formula dei trapezi produce la formula di CavalieriSimpson.

135

9 Metodi diretti per la soluzione di sistemi lineari

9.1

Un esempio di sistema lineare

Si consideri la capacità C di un conduttore. Dall’elettrostatica, sappiamo che vale q = Cφ dove q rappresenta la carica del conduttore e φ il suo potenziale elettrostatico, quando il conduttore è isolato. Nel caso in cui il conduttore non sia isolato, la situazione cambia. Supponiamo di avere 4 conduttori in equilibrio elettrostatico all’interno di una cavità collegata a terra (a terra il potenziale elettrostatico vale zero). Supponendo di collegare i conduttori 2, 3 e 4 a terra, si ha φ2 = φ3 = φ4 = 0 e φ1 6= 0. Il conduttore 1 induce carica sugli altri conduttori, per cui, per ciascun conduttore vale, rispettivamente: q1 = C11 φ1 q2 = C21 φ1 q3 = C31 φ1 q4 = C41 φ1 Si ripete lo stesso discorso supponendo φ2 6= 0 e tutti gli altri potenziali nulli. Poi sia φ3 6= 0 e gli altri potenziali nulli. Infine φ4 6= 0 e tutti gli altri nulli. La sovrapposizione dei 4 stati considerati corrisponde alla situazione in cui φ1 , φ2 , φ3 , φ4 sono tutti diversi da zero. Si ha perciò: q1 = C11 φ1 + C12 φ2 + C13 φ3 + C14 φ4 q2 = C21 φ1 + C22 φ2 + C23 φ3 + C24 φ4 q3 = C31 φ1 + C32 φ2 + C33 φ3 + C34 φ4 q4 = C41 φ1 + C42 φ2 + C43 φ3 + C44 φ4 I coefficienti Cii si chiamano coefficienti di capacità, mentre i coefficienti Cij , con j 6= i si chiamano coefficienti di induzione. Si può presentare il problema inverso: note le cariche qi , si vuole determinare il valore dei φi . Si deve quindi risolvere un sistema lineare di 4 equazioni in 4 incognite.

All’inizio e alla fine abbiamo il mistero. Potremmo dire che abbiamo il disegno di Dio. A questo mistero la matematica si avvicina, senza penetrarlo. Ennio De Giorgi

138

annamaria mazzia

In questo Capitolo studieremo metodi diretti per la soluzione di sistemi lineari del tipo    a11 x1 + a12 x2 + . . . + a1n xn     a21 x1 + a22 x2 + . . . + a2n xn    a31 x1 + a32 x2 + . . . + a3n xn   ..    .     an1 x1 + an2 x2 + . . . + ann xn

= b1 = b2 = b3 . = ..

(9.1)

= bn

dove aij , per i, j = 1, 2, . . . , n e bi , per i = 1, 2, . . . , n sono assegnati e le incognite da determinare sono x1 , x2 , . . . , xn . I metodi diretti sono metodi che risolvono il problema in un numero fissato di passi, introducendo un errore dovuto solo all’arrotondamento.

9.2

Elementi di Algebra Lineare

Sia dato un sistema lineare come in (9.1). Per poterlo semplificare, possiamo eseguire le seguenti operazioni (trasformazioni elementari):

x

L’i-sima equazione del sistema può essere moltiplicata per una qualunque costante λ 6= 0 e l’equazione risultante può essere usata al posto di quella di partenza: la soluzione del sistema non cambia.

x

L’equazione j-sima, moltiplicata per una qualunque costante λ 6= 0 e sommata all’equazione i-sima, può essere usata al posto dell’equazione i-sima di partenza: la soluzione del sistema non cambia.

x

Le equazioni i-sima e j-sima possono essere scambiate: la soluzione del sistema non cambia.

In questa maniera, un sistema lineare può essere trasformato in uno di più facile soluzione, come vedremo nell’algoritmo di eliminazione di Gauss. Definizione 9.2.1 Si definisce matrice n × m una griglia rettangolare (o array) di elementi disposti su n righe e m colonne. Generalmente, una matrice si denota con una lettera maiuscola, per esempio A, mentre i suoi valori si indicano con la corrispondente lettera minuscola e i pedici che si riferiscono alla riga e colonna in cui si trova quel valore, per esempio aij si riferisce all’elemento di riga i e colonna j della matrice A. 

a11 a  21    a A = aij =   31  ..  . an1

a12 a22 a32 .. . an2

a13 a23 a33 .. . an3

... ... ... ... ...

 a1n a2n    a3n   ..  .  ann

Poichè le operazioni da fare coinvolgono i coefficienti aij e bi , conviene scrivere il sistema di equazioni lineari utilizzando una forma compatta mediante matrici e vettori.

appunti di calcolo numerico

Per indicare che una matrice A ha n righe e m colonne, diremo che A ha dimensione n × m. Quando lavoreremo con matrici quadrate di n righe e n colonne, parleremo di dimensione n della matrice per indicare che il numero di righe è uguale al numero di colonne e vale n. I vettori si possono vedere come un caso particolare delle matrici. Si parla di vettore riga se ci riferiamo a una matrice 1 × n e si parla di vettore colonna se ci si riferisce a una matrice n × 1. Per indicare un vettore colonna e un vettore riga si usa, rispettivamente, la notazione   x1 x   2     x3  x= x = x x x . . . x n 2 3 1    ..   .  xn Vediamo, nel seguito, alcune importanti definizioni e proprietà delle matrici.

x

Due matrici A e B, di dimensione n × m, sono uguali se hanno lo stesso numero di righe e di colonne, e, inoltre, vale, aij = bij per i, = 1, 2, . . . , n e j = 1, 2, . . . , m.

x

Date due matrici A e B, entrambe n × m, si definisce la matrice somma di A e B la matrice n × m A + B i cui elementi sono dati da aij + bij , per i, = 1, 2, . . . , n e j = 1, 2, . . . , m.

x

Se A è una matrice n × m e λ è un numero reale, la moltiplicazione scalare di λ per A, denotata con λA, è una matrice n × m i cui elementi sono λaij per i, = 1, 2, . . . , n e j = 1, 2, . . . , m.

x

Indichiamo con O la matrice cosiddetta nulla, i cui elementi sono tutti uguali a zero.

x

Data la matrice A, n × m, indichiamo con − A la matrice i cui elementi sono − aij .

Teorema 9.2.1 Date A, B e C tre matrici n × m, e λ e µ due numeri reali, valgono le seguenti proprietà:

GA + B = B + A GA + O = O + A = A Gλ( A + B) = λA + λB Gλ(µA) = (λµ) A

G( A + B ) + C = A + ( B + C ) G A + (− A) = − A + A = O G(λ + µ) A = λA + µA G1A = A

139

Esempio:

 A=

2 3

10 1

5 0



è una matrice 2 × 3 con elementi a11 = 2, a12 = 10, a13 = 5, a21 = 3, a22 = 1 e a23 = 0.

140

annamaria mazzia

x

Date due matrici A di dimensione n × m e B di dimensione m × p, la matrice prodotto di A e B, denotata con C = AB, è una matrice i cui elementi cij sono dati da: m

cij =

∑ aik bkj = ai1 b1j + ai2 b2j + . . . + aim bmj

k =1

per i = 1, 2, . . . , n e j = 1, 2, . . . , p.

x

Data una matrice A di dimensione n e un vettore colonna x di lunghezza n, si definisce il vettore y = Ax prodotto della matrice A per il vettore x, il vettore le cui componenti sono date da n

yi =

∑ aij x j

per i = 2, . . . , n

j =1

x

Dati due vettori x e y si definisce prodotto scalare x T y = ∑in=1 xi yi

.

x x

In generale, AB 6= BA.

Una matrice D si dice diagonale se è quadrata con dij = 0 per i 6= j. Gli elementi diversi da zero si trovano quindi sulla diagonale (detta diagonale principale) che si può tracciare partendo dall’elemento in alto a sinistra (di posto 11) e arrivando all’elemento in basso a destra (di posto nn).

x

Si chiama matrice identità e si indica con I, una matrice diagonale i cui elementi diagonali valgono 1.

x

Una matrice si dice tridiagonale se gli elementi non nulli si trovano sulla diagonale principale e sugli elementi delle diagonali che si trovano sopra e sotto la diagonale principale.

x

Una matrice si dice triangolare se ha tutti gli elementi nulli ad eccezione di quelli che si trovano tutti sopra (o tutti sotto) la diagonale principale.

Esempio:



1 0  D= 0 0

0 2 0 0

 0 0   0  −1

0 0 5 0

Esempio:



1 0  I= 0 0

0 1 0 0

0 0 1 0

 0 0  0 1

Esempio di matrice tridiagonale:

−2  1  A=  0  0 0 

1 −2 1 0 0

0 1 −2 1 0

0 0 1 −2 1

– Si definisce matrice triangolare superiore U (U sta per upper) di dimensione n, la matrice per la quale, per j = 1, 2, . . . , n, si ha uij = 0 per i = j + 1, j + 2, . . . , n – Si definisce matrice triangolare inferiore L (L sta per lower) di dimensione n, la matrice per la quale, per i = 1, 2, . . . , n, si ha lij = 0 per j = i + 1, i + 2, . . . , n Teorema 9.2.2 Date A matrice n × m, B matrice m × s, C matrice s × p, D matrice m × s, Im e Is le matrici identità, rispettivamente di dimensione m e s, e λ e µ due numeri reali, valgono le seguenti proprietà:

Esempi:



1 U = 0 0 

−2 3.2 0

1 L= 2 −3.4

 5.3 −4 10 0 −21 5.7

 0 0  −4

 0 0   0   1  −2

appunti di calcolo numerico

141

G A(BC) = ( AB)C G A(B + D) = AB + AD G I B = B BI = B Gλ( AB) = (λA)B = A(λB). m

s

A questo punto, il sistema lineare (9.1) può essere scritto in forma matriciale come Ax = b Collegata alla soluzione di un sistema lineare è l’inversa di una matrice. Definizione 9.2.2 Data una matrice A di dimensione n, A si dice nonsingolare (o invertibile o regolare) se esiste una matrice, che indichiamo come A−1 di dimensione n tale che AA−1 = A−1 A = I La matrice A−1 si chiama matrice inversa della A. Una matrice che non ha inversa si dice, invece, singolare (o non invertibile). Teorema 9.2.3 Per ogni matrice A di dimensione n nonsingolare si ha:

x A è unica x A è nonsigolare e ( A ) = A x Se B è non singolare, di dimensione n, allora ( AB) −1 −1

−1 −1

−1

= B −1 A −1

Dato 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 9.2.3 La trasposta di una matrice A di dimensione n × m è la matrice indicata con A T , di dimensione m × n, per la quale la colonna i della trasposta coincide con la riga i della matrice A di partenza: aijT = a ji . Legata alla trasposta di una matrice è la seguente definizione.

Esempio:



Definizione 9.2.4 Una matrice quadrata si dice simmetrica se A = A T . Teorema 9.2.4 Valgono le seguenti proprietà (per matrici per cui è possibile eseguire le seguenti operazioni):

G( A ) G( AB)

T T T

=A = BT AT

G( A + B ) = A + B GSe esiste A allora ( A T

T

T

−1

−1 ) T

= ( A T ) −1

Il determinante di una matrice permette di stabilire esistenza e unicità della soluzione nei sistemi lineari. Data una matrice quadrata A, il suo determinante si indica mediante la notazione det( A) o | A|.

x x

Se A = [ a] è una matrice 1 × 1, det( A) = a.

Se A è una matrice di dimensione n, si definisce minore Mij il determinante della sottomatrice di dimensione n − 1 ottenuta cancellando la i-sima riga e la j-sima colonna da A.

A=

1 2

2 5

3 6





1 A = 2 3

 2 5 6



4 2 6

T

Esempio:



1 A = 4 8

4 2 6

 8 6 5

1 A T = 4 8

 8 6 5

142

annamaria mazzia

x Il determinante di A è dato dalla formula n

det( A) =

∑ (−1)i+ j aij Mij

(fissato un qualunque i = 1, 2, . . . , n)

j =1 n

det( A) =

∑ (−1)i+ j aij Mij

(fissato un qualunque j = 1, 2, . . . , n)

i =1

Il calcolo del determinante di una matrice di dimensione n richiede O(n!) moltiplicazioni. Quindi, anche per valori piccoli di n, le operazioni da fare diventano proibitive. Teorema 9.2.5 Sia assegnata A una matrice quadrata di dimensione n.

x Se una riga o una colonna di A ha elementi tutti nulli, det( A) = 0. x Se A ha due righe o due colonne con gli stessi elementi, det( A) = 0. x Denotata con A˜ la matrice ottenuta scambiando due righe di A, si ha det( A˜ ) = −det( A).

x Denotata con A˜ la matrice ottenuta da A moltiplicando una sua riga per un numero reale λ, si ha det( A˜ ) = λdet( A).

x Denotata con A˜ la matrice ottenuta da A sommando una sua riga per un’altra che è stata moltiplicata per λ, si ha det( A˜ ) = det( A).

x Se B è un’altra matrice di dimensione n, si ha det( AB) = det( A)det(B) x det( A ) = det( A) T

x Se esiste A

−1 ,

si ha det( A−1 ) =

1 det( A)

x Se A è una matrice triangolare superiore o triangolare inferiore o diagonale, allora det( A) = ∏in=1 aii

9.3

Metodo di eliminazione di Gauss

Ritorniamo al sistema di equazioni (9.1), che possiamo scrivere in forma matriciale come Ax = b. Nel metodo di eliminazione di Gauss il sistema lineare di partenza viene trasformato in uno equivalente di più facile soluzione in quanto la matrice del nuovo sistema ha forma triangolare (superiore o inferiore) e può essere risolto facilmente mediante sostituzione (all’indietro o in avanti). Vediamo nel dettaglio come si risolve un sistema lineare di forma triangolare, utilizzando queste tecniche.

Carl Friedrich Gauss fu un matematico e fisico tedesco (1777-1855) che ha dato il suo contribuito in maniera significativa in numerosi campi: teoria dei numeri, analisi, geometria differenziale, geodesia, magnetismo, astronomia, ottica. Al pari di Eulero, Newton e Archimede è considerato uno dei più grandi matematici della storia. In suo onore è stato dato il suo nome a una nave di ricerca tedesca, a una montagna (Gaussberg) in Antartide, a un cratere sulla luna, e all’unità di misura della densità di flusso magnetico o di induzione magnetica.

appunti di calcolo numerico

9.3.1

Sostituzione all’indietro e in avanti La matrice A sia nonsingolare e triangolare superiore, cioè   a11 a12 . . . a1n   ..  . a2n  a22   A= ..  ..   . .   ann La soluzione del sistema Ax = b può dunque procedere dal basso verso l’alto, a partire dall’ultima riga. Le equazioni, infatti, sono   a11 x1 + a12 x2 + a13 x3 + . . . . . . + a1n xn = b1       a22 x2 + a23 x3 + . . . . . . + a2n xn = b2      a33 x3 + . . . . . . + a3n xn = b2 . . ..  = ..       = bn − 1  a n −1 n −1 x n −1 + a n −1 n x n    ann xn = bn L’ultima riga si legge come ann xn = bn . Quindi possiamo ricavare xn = bn /ann . Noto il valore di xn , possiamo ricavare xn−1 dalla riga n − 1 del 1 sistema ottenendo xn−1 = (b − a n −1 n x n ). a n −1 n −1 n −1 Si procede a ritroso in questo modo arrivando fino alla prima equazione che ci permette di calcolare il valore di x1 . Osserviamo che tutte le divisioni per i coefficienti aii sono possibili in quanto stiamo supponendo A non singolare e, poichè, in questo caso, det ( A) = ∏in=1 aii 6= 0, necessariamente ciascun aii 6= 0. Possiamo dunque scrivere l’algoritmo di sostituzione all’indietro: Per i = n fino a i = 1, procedendo all’indietro con passo −1 xi =

bi − ∑nj=i+1 aij x j aii

Un analogo algoritmo si ricava quando la matrice è triangolare inferiore. In tal caso, si parte dalla prima equazione per ricavare x1 e poi si va avanti nell’equazione successiva. Si ha l’algoritmo di sostituzione in avanti: Per i = 1 fino a i = n, procedendo in avanti con passo 1 xi =

9.3.2

1 bi − ∑ij− =1 aij x j

aii

Eliminazione di Gauss: esempio particolare Il metodo di eliminazione di Gauss trasforma il sistema di partenza in uno ad esso equivalente ma più facile da risolvere, perchè la

143

144

annamaria mazzia

matrice del sistema è di forma triangolare superiore, in modo da poter applicare il metodo di sostituzione all’indietro. Per capire come si applica questo metodo consideriamo un semplice esempio di sistema di 3 equazioni in 3 incognite, Ax = b dove 

2  A = 4 1

1 1 2

 2  2 5



 10   b = 12 20

Le equazioni del sistema sono, dunque,   2x1 + x2 + 2x3 = 10 

4x1 + x2 + 2x3 = 12

  

x1 + 2x2 + 5x3 = 20

x

Al primo passo del metodo, cerchiamo di annullare tutti i coefficienti dell’incognita x1 nella seconda e terza equazione. – Dividiamo il coefficiente 4 che moltiplica x1 nella seconda equazione con il coefficiente 2 che moltiplica x1 nella prima equa4 zione. Otteniamo il valore = 2. Adesso moltiplichiamo per 2 questo valore (2) la prima equazione, ricavando 2 (2x1 + x2 + 2x3 = 10) =⇒ 4x1 + 2x2 + 4x3 = 20 Se ora facciamo la sottrazione tra la seconda equazione del sistema e questa che abbiamo ricavato otteniamo 4x1 + x2 + 2x3 = 12



4x1 + 2x2 + 4x3 = 20

=

− x2 − 2x3 = −8 Sostituiamo questa equazione alla seconda del sistema (il sistema rimane equivalente), ricavando   2x1 + x2 + 2x3 = 10 

− x2 − 2x3 = −8

  

x1 + 2x2 + 5x3 = 20

Abbiamo eliminato, in questo modo, il coefficiente di x1 nella seconda equazione. – Alla stessa maniera, dividiamo il coefficiente di x1 nella terza equazione (che vale 1) con il coefficiente di x1 nella prima equa1 1 zione: abbiamo . Moltiplichiamo la prima equazione per 2 2 e poi facciamo la sottrazione tra la terza equazione e la prima

appunti di calcolo numerico

moltiplicata per

1 : 2

x1 + 2x2 + 5x3 = 20−

x1 + 2x2 + 5x3 = 20−

1 1 (2x1 + x2 + 2x3 = 10) ⇐⇒ x1 + x2 + x3 = 5 2 2

=

3 x2 + 4x3 = 15 2 Sostituiamo questa equazione alla terza del sistema. – A questo punto il sistema è   2x + x2 + 2x3 = 10    1 − x2 − 2x3 = −8     3 x2 + 4x3 = 15 2

x

Nella seconda e terza equazione non c’è più l’incognita x1 .

Per poter arrivare ad un sistema di equazioni triangolare superiore, dobbiamo eliminare il coefficiente di x2 nella terza equazione del sistema. Ripetiamo il ragionamento appena fatto, lavorando sulla seconda e terza equazione. 3 – Consideriamo il coefficiente di x2 della terza equazione ( ) e 2 lo dividiamo per il coefficiente di x2 della seconda equazione ( che vale −1). Moltiplichiamo la seconda equazione per questo 3 coefficiente (cioè per − ) e poi sottraiamo la terza equazione 2 3 dalla seconda moltiplicata per − : 2 3 x2 + 4x3 = 15− 2 3 3 − (− x2 − 2x3 = −8) ⇐⇒ x2 + 3x3 = 12 2 2 3 x2 + 4x3 = 15− 2

=

x3 = 3

– Sostituiamo questa equazione alla terza del sistema, ricavando il sistema equivalente    2x1 + x2 + 2x3 = 10

− x2 − 2x3 = −8

  

x3 = 3

Con tutte le trasformazioni effettuate, abbiamo trasformato il sistema di partenza in uno equivalente, che si può risolvere facilmente mediante sostituzioni all’indietro. Dall’ultima equazione abbiamo x3 = 3. Sostituendo questo valore nella seconda equazione otteniamo − x2 − 6 = −8 da cui x2 = 2. Infine, sostituendo i valori di x3 e x2 nella prima equazione abbiamo 2x1 + 2 + 6 = 10 da cui x1 = 1.

145

146

9.3.3

annamaria mazzia

Eliminazione di Gauss: caso generale Vediamo ora il caso generale, in cui il sistema di n equazioni ha la matrice dei coefficienti A piena (o densa, cioè abbia quasi tutti gli elementi non nulli). Applichiamo trasformazioni elementari per riga in modo da ridurre il sistema di partenza in uno equivalente di forma triangolare superiore, che potremo risolvere mediante sostituzioni all’indietro. La soluzione del problema Ax = b, infatti, non cambia se moltiplichiamo una riga per una costante, se sottraiamo il multiplo di una riga da un’altra riga o se facciamo scambi di righe, come abbiamo detto all’inizio della Sezione 9.2. Supponiamo, per il momento, che tutti gli elementi della diagonale principale di A siano non nulli.

x

Al primo passo vogliamo eliminare gli elementi della prima colonna al di sotto della diagonale principale: a21 dalla secona11

– sottraiamo la prima equazione moltiplicata per da equazione:

a21 x1 + a22 x2 + a23 x3 + . . . + a2n xn = b2 − a21 a21 ( a x + a12 x2 + a13 x3 + . . . + a1n xn ) = b = a11 11 1 a11 1

( a22 −

a a a a21 a ) x + ( a23 − 21 a13 ) x3 + . . . + ( a2n − 21 a1n ) xn = b2 − 21 b1 a11 12 2 a11 a11 a11

– sottraiamo la prima equazione moltiplicata per equazione.

a31 dalla terza a11

– ... – sottraiamo la prima equazione moltiplicata per equazione.

an1 dalla n-sima a11

Come risultato di questa operazione avremo una nuova matrice con gli elementi della prima colonna, eccetto quello di posto 11, tutti uguali a zero.

x



a11

a12

...

    

0 .. .

a22 .. .

(1)

...

0

(1) an2

...

...

   b1 x1 (1)     (1)  a2n   x2  b2      ..   ..  =   .  .   .   ..  (1) (1) xn ann bn a1n



Al secondo passo, consideriamo il sistema ridotto che si ha ignorando la prima equazione del sistema e la prima colonna della nuova matrice che abbiamo ottenuta (che ha tutti 0 al di sotto dell’elemento diagonale).

appunti di calcolo numerico

147

A questa sottomatrice applichiamo lo stesso procedimento di prima, sottraendo, quindi, la prima equazione della sottomatrice molti(1)

plicata per

a32

(1)

dalla seconda equazione della sottomatrice, e così

a22

via.

Dopo questo passo, il sistema sarà equivalente a:     a11 a12 . . . . . . a1n  x  b1 1   (1) (1) (1)    b (1)   0 a22 a23 . . . a2n      x2    2(2)   ..     (2) (2)  x   . b3  0 a33 . . . a3n      3 =     ..   ..   . . . .  .. .. .. ..   .   .   ...   (1) (2) (2) x n b n 0 0 a ... a nn

n3

x

Dopo aver applicato questo procedimento n − 1 volte, avremo un sistema triangolare superiore semplice da risolvere utilizzando l’algoritmo di sostituzione all’indietro.       a11 a12 . . . . . . a1n b1 x1   (1) (1) (1)    b (1)   0 a22 a23 . . . a2n      x2   2   ..    (2)   (2) (2)   .    x b3  3 = 0 a . . . a   33 3n     .   ..   . .. ..    ..   ..    .  . . . . . . . .   ( n −1) ( n −1) xn bn 0 0 ... 0 ann

9.4

Strategie di pivoting (k)

Gli elementi diagonali aii generati ad ogni passo del metodo di eliminazione sono detti elementi pivotali. Nel descrivere il metodo di eliminazione di Gauss abbiamo supposto, per semplicità, che tutti gli elementi diagonali fossero diversi da zero. Ma una matrice può essere non singolare senza che gli elementi della diagonale principale siano tutti diversi da zero. Inoltre, andando avanti nel procedimento di eliminazione, può succedere che un elemento pivotale diventi nullo – e quindi la corrispondente incognita non può essere eliminata attraverso quella equazione nel procedimento di sostituzione all’indietro. C’è, infine, da considerare il fatto che si possono avere grossi errori numerici quando un elemento pivotale è molto piccolo. Cosa fare in queste circostanze? In che modo applicare l’eliminazione di Gauss? Si hanno le cosiddette strategie di pivoting:

x pivoting parziale

Mano mano che si va avanti nell’eliminazione, per i = 1, 2, . . . , n − 1 a ciascuno stadio si sceglie il più piccolo intero q tale che ( i −1)

| aqi

( i −1)

| = max | a ji i ≤ j≤n

|

e si scambiano le righe i e q.

Si opera, dunque, un controllo sulla colonna i-sima dalla posizione i fino alla posizione n, andando a cercare il coefficiente massimo in modulo.

148

annamaria mazzia

x pivoting totale Nel pivoting totale, invece, la ricerca dell’elemento più grande in tutta la sottomatrice che si ha considerando le colonne e le righe rispettivamente a destra e sotto l’elemento diagonale i-simo. Si vanno quindi a cercare i più piccoli interi q e r tali che ( i −1)

| aqr

( i −1)

| = max | a jk i ≤k,j≤n

|

Il maggiore sforzo computazionale garantisce maggiore accuratezza e stabilità nei risultati, nel senso che gli errori di arrotondamento non sono così amplificati come potrebbe succedere senza l’adozione di una tecnica di pivoting. Esempio Consideriamo il sistema     x1 + x2 + x3 = 1 x1 + 1.0001x2 + 2x3 = 2

  

x1 + 2x2 + 2x3 = 1

L’esatta soluzione, corretta a 4 cifre decimali, è x = (1, −1.0001, 1.0001) T . L’eliminazione di Gauss senza pivoting porta, applicando il primo passo del metodo, al sistema     x1 + x2 + x3 = 1 0.0001x2 + 1x3 = 1

  

1x2 + 1x3 = 0

e, infine, a     x1 + x2 + x3 = 1

0.0001x2 + 1x3 = 1

  

−9999x3 = −10000

Se risolviamo il sistema utilizzando un’aritmetica in base 10 con 3 cifre decimali, la sostituzione all’indietro ci darà x3 =

−10000 = 1.000, −9999

x2 =

1−1 = 0, 0.0001

x1 = 0.

La soluzione è completamente sbagliata. Se, invece, facciamo lo scambio della seconda e terza riga adottando il pivoting parziale, allora avremo il sistema:     x1 + x2 + x3 = 1 1x2 + 1x3 = 0

  

0.0001x2 + 1x3 = 1

e, infine,     x1 + x2 + x3 = 1 1x2 + 1x3 = 0

  

0.9999x3 = 1

Con il pivoting totale, si opera uno scambio non solo di righe ma anche di colonne in modo da portare l’elemento pivotale dalla riga e colonna qr al posto ii. Di questo scambio di colonne bisogna conservare traccia perchè vengono scambiate anche le componenti del vettore soluzione, in modo da effettuare lo scambio inverso una volta risolto il sistema.

appunti di calcolo numerico

149

Questa volta si ha (sempre lavorando con 3 cifre decimali) x3 = 1.000, x2 = −1.000, x1 = 1.000, che è la soluzione corretta a 3 cifre decimali. _

9.5

Fattorizzazione triangolare

Il metodo di eliminazione di Gauss, visto in forma matriciale, decompone la matrice A nel prodotto LU di due matrici, la L triangolare inferiore, e la U triangolare superiore. Ad ogni passo, infatti, il metodo di eliminazione può essere visto introducendo la matrice   1   0 1  .   .  . 0 1     .. ..  . . 0 1     ( k −1) a k +1 k   .. .. ..  . . . − 1   ( k −1) (k) M =  akk   ( k −1)  . . . a ..  . . . k +2 k .   . . . − ( k −1)   akk    . . . .. ..  .. .. ..  . .     ( k − 1 )  . . .   .. .. .. − an k 1 ( k −1) akk Le matrici intermedie che vengono generate sono date da A(k) = M(k) A(k−1) = M(k) M(k−1) . . . M(1) A mentre il vettore termine noto è dato da b(k) = M(k) b(k−1) = M(k) M(k−1) · · · M(1) b. Dopo n − 1 passi, avremo un sistema la cui matrice finale è triangolare superiore (possiamo chiamare questa matrice U): U = A ( n −1) = M ( n −1) . . . M (2) M (1) A Per ritornare alla matrice di partenza A, possiamo moltiplicare ambo i membri dell’uguaglianza appena scritta con la matrice data da L = ( M ( n −1) · · · M (2) M (1) ) −1 = [ M (1) ] −1 · · · [ M ( n −2) ] −1 [ M ( n −1) ] −1 L è triangolare inferiore con elementi dati dal prodotto delle matrici M(k) generate durante l’eliminazione di Gauss. Otteniamo quindi A = LU.

9.5.1

Fattorizzazione LDU L’eliminazione di Gauss è un caso particolare di fattorizzazione LDU, nella quale la matrice A viene decomposta nel prodotto di 3 matrici, la L che è triangolare inferiore con elementi sulla diagonale principale (elementi diagonali) uguali a 1, la D che è una matrice diagonale e la U che è una triangolare superiore con elementi diagonali uguali a 1.

Si parla di fattorizzazione in quanto la matrice A viene decomposta nel prodotto di tre matrici (fattori).

150

annamaria mazzia

Nell’eliminazione di Gauss vista prima, nella U abbiamo inglobato anche la matrice D, per cui abbiamo una fattorizzazione LU. La decomposizione LDU è assicurata dal teorema LDU. Prima di vedere il teorema, definiamo i minori principali di una matrice A. Definizione 9.5.1 Data una matrice A si definisce minore principale di dimensione k (con 1 ≤ k ≤ n), la sottomatrice che si ha prendendo le prime k righe e k colonne di A.   a11 . . . a1k  . ..   .  .   . ak1 . . . akk Teorema 9.5.1 (LDU) Nell’ipotesi che tutti i minori principali di A, (per i = 1, 2, . . . , n) siano non-singolari, allora la matrice A è decomponibile in maniera univoca nel prodotto A = LDU Qualsiasi matrice non singolare può essere condotta sotto una forma tale da soddisfare il teorema LDU mediante opportuni scambi di righe e di colonne (abbiamo visto cosa fare quando un elemento pivotale è nullo). Fare uno scambio di righe o di colonne significa moltiplicare la matrice A con un’opportuna matrice di permutazione. Una matrice di permutazione P è una matrice ottenuta dalla matrice identità operando scambi di righe o di colonne in modo che la matrice risultante abbia esattamente un unico valore diverso da zero su ogni riga e colonna, e tale valore sia uguale a 1. Esempio Si consideri la matrice di permutazione P di dimensione 3 data da   1 0 0   P = 0 0 1 0 1 0 Qualunque sia la matrice A, di dimensione 3, moltiplicandola a sinistra per P si ottiene lo scambio della seconda e terza riga di A; invece, moltiplicandola a destra per P si ottiene lo scambio della seconda e terza colonna di A: 

1  PA = 0 0 

a11  AP =  a21 a31

0 0 1

 0 a11  1  a21 0 a31

a12 a22 a32

a12 a22 a32

 a13 1  a23  0 a33 0

0 0 1

  a13 a11   a23  =  a31 a33 a21

a12 a32 a22

 a13  a33  a23

  0 a11   1 =  a21 0 a31

a13 a23 a33

 a12  a22  a32 _

Quindi, il teorema LDU si può applicare alla matrice A o ad un’opportuna matrice PA, se si effettua il pivoting parziale, o a PAQ

appunti di calcolo numerico

151

se si effettua il pivoting totale (e quindi si considerano due matrici di permutazioni P e Q). In genere, la matrice D viene inglobata nella L o nella U (postmoltiplicando o pre-moltiplicando le L e le U definite prima per la D).

x

Nel caso in cui la matrice D viene inglobata nella matrice L, la L ha elementi diagonali lii 6= 0, mentre la U ha elementi diagonali unitari. Si parla di fattorizzazione di Crout.

x

Nel caso in cui la matrice D viene inglobata nella matrice U, la U ha elementi diagonali uii 6= 0, mentre la L ha elementi diagonali unitari. Si parla di fattorizzazione di Doolittle.

Scriviamo in forma estesa il prodotto operare la fattorizzazione di Crout:    a11 a12 . . . a1n l11 0 . . .     a21 a22 . . . a2n   l21 l22 . . .  .  .. ..  ..  .  =  ..  . . . .   . an1 an2 . . . ann ln1 ln2 . . .

tra matrici, nell’ipotesi di

0 0 .. .



1   0  .  .  . lnn 0

u12 1 .. . 0

... ... ...

 u1n  u2n  ..   .  1

Moltiplichiamo la prima riga di L per le colonne di U ed eguagliamo i termini con gli elementi della prima riga di A. Otteniamo: l11 · 1 = a11 l11 · u1k = a1k , k = 2, . . . , n Quindi: l11 = a11 e u1k = a1k /l11 . Abbiamo ricavato gli elementi della prima riga di L e U. Moltiplicando le successive righe di L per le colonne di U ed uguagliando i termini ai corrispondenti termini di A, abbiamo: j −1

lij = aij −



lim umj

i = 1, 2, . . . n

j = 1, 2, . . . , i

m =1

uij =

i −1 1 ( aij − ∑ lim umj ) lii m =1

i = 1, 2, . . . , n − 1

j = i + 1, . . . n

Si calcolano prima gli elementi della riga i-sima di L e poi quelli della riga i-sima di U, per i = 1, 2, . . . , n. Trovate le matrici L e U, il sistema di partenza Ax = b è equivalente a LUx = b. Si pone, dunque, y = Ux, ottenendo il sistema Ly = b. Si ricava facilmente y mediante sostituzione in avanti e da Ux = y si ricava x mediante sostituzione all’indietro. Lo sforzo computazionale maggiore è quindi quello per il calcolo dei coefficienti di L e U.

9.5.2

Fattorizzazione di Gauss senza pivoting Abbiamo visto che, a volte, il metodo di eliminazione di Gauss richiede scambi di righe per evitare divisioni per zero. Allo stesso modo, il

Nell’eliminazione di Gauss noi ricaviamo espressamente solo la U mentre le modifiche operate sulla colonna dei termini noti è equivalente al prodotto L−1 b (quindi da LUx = b risolviamo Ux = L−1 b).

152

annamaria mazzia

teorema di fattorizzazione LDU vale su matrici A non singolari o su matrici ottenute da A mediante moltiplicazioni a sinistra o a destra con opportune matrici di permutazione. Ci chiediamo se esistono matrici per le quali il metodo di eliminazione di Gauss possa essere implementato senza scambi di righe e per le quali l’algoritmo di eliminazione di Gauss sia stabile rispetto ad una crescita di errori di arrotondamento. Vediamo, nel seguito, alcune speciali classi di matrici per cui valgono le nostre richieste. Definizione 9.5.2 Una matrice A di dimensione n si dice diagonalmente dominante in senso stretto per righe se vale la relazione n

| aii | >

∑ |aij |

per ogni

i = 1, 2, . . . , n.

j =0 j 6 =i

Definizione 9.5.3 Una matrice A di dimensione n si dice diagonalmente dominante in senso stretto per colonne se vale la relazione n

| a jj | >

∑ |aij |

per ogni

j = 1, 2, . . . , n.

i =0 i6= j

Esempio   7 3 1   A = 2 10 −2 5 0 6 A è una matrice diagonalmente dominante in senso stretto per righe poichè vale:|7| > |3| + |1| = 4, |10| > |2| + | − 2| = 4 e |6| > |5| + |0|. Non è diagonalmente dominante in senso stretto per colonne in quanto sulla prima colonna si ha |7| = |2| + |5|. _ Esempio   6 3 −4   A= 3 9 5  −4 5 11 A non è diagonalmente dominante in senso stretto per righe poichè, sulla prima riga si ha |6| < |3| + | − 4| = 7. Essendo simmetrica, la matrice non può essere neanche diagonalmente dominante in senso stretto per colonne, perchè la relazione che abbiamo sulla prima riga vale sulla prima colonna. _ Le definizioni appena date si possono rilassare, definendo le matrici diagonalmente dominanti. Una matrice A di dimensione n si dice diagonalmente dominante per righe se vale la relazione n

| aii | ≥

∑ |aij |

j =0 j 6 =i

per ogni

i = 1, 2, . . . , n.

appunti di calcolo numerico

153

Analoga è la definizione di matrice diagonalmente dominante per colonne (basta applicare la definizione di matrice diagonalmente dominante per righe sulla matrice A T ) Si hanno i seguenti teoremi. Teorema 9.5.2 Se A è una matrice diagonalmente dominante e non singolare, allora il metodo di eliminazione di Gauss può essere implementato senza alcuno scambio di righe e di colonne e i calcoli sono stabili rispetto alla crescita degli errori di arrotondamento. Teorema 9.5.3 Se A è una matrice diagonalmente dominante in senso stretto (per righe o per colonne), allora A è non singolare. In questo caso il metodo di eliminazione di Gauss può essere implementato senza alcuno scambio di righe e di colonne e i calcoli sono stabili rispetto alla crescita degli errori di arrotondamento. Un’altra importante classe di matrici è data dalle matrici definite positive. Definizione 9.5.4 Una matrice A di dimensione n si dice

x definita positiva se è simmetrica e vale x

T Ax

> 0 qualunque sia il

vettore x 6= 0

x semidefinita positiva se x x indefinita altrimenti.

T Ax

≥ 0 qualunque sia il vettore x,

Si ha un’analoga definizione per matrici definite negative e semidefinite negative. Definizione 9.5.5 Una matrice A di dimensione n si dice

x definita negativa se è simmetrica e vale x

T Ax

Osserviamo che non tutti gli autori richiedono la simmetria per definire una matrice definita positiva, e distinguono tra matrici definite positive e matrici simmetriche definite positive.

< 0 qualunque sia il

vettore x 6= 0,

x semidefinita negativa se x

T Ax

≤ 0 qualunque sia il vettore x.

Dalla definizione di matrice definita positiva, deve essere x T Ax > 0 qualunque sia il vettore x, vale a dire:    x1 a11 a12 . . . a1n      a21 a22 . . . a2n   x2    x1 x2 . . . x m  .. ..   .   ..  . . ... .   ..  an1

an2

...

ann

xm

 ∑nj=1 a1j x j  n  n n  ∑ j=1 a2j x j    = ∑ ∑ aij xi x j > 0 xm  ..    i =1 j =1 . n ∑ j=1 anj x j 

 = x1

x2

...

Il seguente risultato ci permette di eliminare certe matrici dalla classe delle matrici definite positive, se non soddisfano certi requisiti.

Basarsi sulla definizione per verificare che una matrice sia o meno definita positiva può essere molto difficile. Fortunatamente, ci sono molti criteri che ci permettono di dire se una matrice è definita positiva oppure no.

154

annamaria mazzia

Teorema 9.5.4 Se una matrice A di dimensione n è definita positiva, allora

x x

A ammette la matrice inversa; aii > 0 per ogni i = 1, 2, . . . , n

Quindi se una matrice ha elementi aii ≤ 0, non è una matrice definita positiva, perché, se lo fosse, in base al teorema avrebbe elementi diagonali tutti positivi. Vediamo ora dei teoremi importanti per capire se una matrice è definita positiva. Teorema 9.5.5 Una matrice A simmetrica di dimensione n è definita positiva se e solo se tutti i suoi minori principali hanno determinante positivo. Teorema 9.5.6 Una matrice A simmetrica di dimensione n con elementi diagonali tutti positivi e diagonalmente dominante è definita positiva. Anche per matrici simmetriche definite positive, si può applicare il metodo di eliminazione di Gauss senza operare scambi di righe e di colonne e i calcoli rimangono stabili rispetto alla crescita degli errori di arrotondamento. Questo risultato ci serve per la fattorizzazione di Cholesky.

9.5.3

Fattorizzazione di Cholesky Nel caso in cui la matrice A sia simmetrica, il teorema LDU si presenta nel seguente modo Teorema 9.5.7 (LDU per matrici simmetriche) Se A è una matrice simmetrica e nessuno dei suoi minori principali è singolare, allora A si può decomporre nel prodotto A = LDL T , dove L è triangolare inferiore con elementi diagonali unitari ed è univocamente determinata, L T è la sua trasposta e D è matrice diagonale. Intanto valgono le ipotesi del teorema LDU e Dimostrazione. quindi si può scrivere in maniera univoca A = LDU con L matrice triangolare inferiore, D diagonale e U triangolare superiore. Inoltre, poichè A è simmetrica, e quindi A = A T , si ha pure LDU = ( LDU ) T vale a dire LDU = U T D T L T = U T DL T . Si deduce, dall’uguaglianza, che U = L T e la decomposizione diventa A = LDL T . 4 Proposizione 9.5.1 (Fattorizzazione di Cholesky) Nel caso particolare in cui A sia simmetrica e definita positiva, da x T Ax > 0 vale pure x 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. Essendo A è definita positiva, risulta anche D definita positiva. Perciò gli elementi di D (che è una matrice diagonale) devono necessariamente essere tutti positivi. In tal caso, si considera la matrice D1/2 che è la matrice diagonale con elementi dati dalle radici quadrate degli elementi diagonali di D (si prende il valore positivo della radice

appunti di calcolo numerico

155

quadrata, e il risultato è un numero reale in virtù del fatto che gli elementi diagonali di D sono tutti positivi). Si pone, quindi, M = LD1/2 e si ottiene A = MM T : abbiamo il prodotto di una matrice triangolare inferiore con coefficienti tutti reali per la sua trasposta. Se D non fosse definita positiva (ma avesse qualche elemento negativo), allora neanche A sarebbe definita positiva e la matrice M sarebbe non reale. Quindi se A è simmetrica, si ha la decomposizione nel prodotto LL T (chiamiamo di nuovo con L la matrice 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 ai corrispondenti elementi di A. Si ricava:

l11 =



a11

li1 = ai1 /l11 i = 2, 3, . . . , n v u i −1 u l = t( a − l2 ) i = 2, 3, . . . , n ii

ii



k =1

ik

j −1

lij =

1 (a − lik l jk ) l jj ij k∑ =1

j = 2, . . . , n

i = j + 1, . . . , n

. Tale fattorizzazione prende il nome di fattorizzazione di Cholesky.

André-Louis Cholesky (1875-1918) fu un matematico francese. Fu ufficiale ingegnere e morì alla fine della prima guerra mondiale.

Esercizi

9.6

Esercizio data la matrice  9.6.1 Sia 1 0 2   A = 0 4 8  2 8 29 Provare che verifica le condizioni del teorema LDU e trovare i fattori L e L T tali che A = LL T .

Svolgimento La matrice A è simmetrica ! e soddisfa le ipotesi del teorema LDU ( 1 0 infatti | a11 | = 1, det = 4 e det( A) = 116 − 16 − 64 = 36) per 0 4 cui è possibile scrivere la matrice A come A = LL T . Si ha, quindi: 

l11  l21 l31

0 l22 l32

 0 l11  0  0 l33 0

l21 l22 0

  l2 l31   11 l32  = l21 l11 l33 l31 l11

l11 l21 2 + l2 l21 22 l31 l21 + l32 l22

 l11 l31  l21 l31 + l22 l32  2 + l2 + l2 l31 32 33

156

annamaria mazzia

Devono quindi valere le relazioni: 2 l11 = 1 =⇒ l11 = 1

l21 l11 = 0 =⇒ l21 = 0 2 l21

l31 l11 = 2 =⇒ l31 = 2 √ 2 + l22 = 4 =⇒ l22 = 4 − 0 = 2

l21 l31 + l22 l32 = 8 =⇒ l32 = 8/2 = 4 p √ √ 2 2 2 l31 + l32 + l33 = 29 =⇒ l33 = 29 − 22 − 42 = 29 − 4 − 16 = 9 = 3 La matrice L è dunque 

1  0 2

0 2 4

 0  0 3

Esercizio   9.6.2 Data la matrice 0.2 1 0.2   A =  1 6.5 1.75 0 2 2.25 (a) verificare che A soddisfa le condizioni del teorema LDU; (b) fattorizzare secondo Crout A = LU (prendendo uii = 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 condizioni del teorema LDU in quanto i minori principali costruiti a partire dall’angolo superiore sinistro hanno tutti determinante diverso da zero: 0.2 det 1

a11 = 0.2 6= 0

1 6.5

!

= 0.3 6= 0

det A = 0.375 6= 0

(b) La fattorizzazione di A come A = LU si costruisce imponendo: 

0.2  A=1 0

1 6.5 2

  0.2 l11   1.75 = LU = l21 2.25 l31

0 l22 l32

 0 1  0  0 l33 0

u12 1 0

 u13  u23  1

appunti di calcolo numerico

Usando le formule di pag. 151, si ottiene l11 = 0.2 0.2u12 = 1 =⇒ u12 = 5 0.2u13 = 0.2 =⇒ u13 = 1 l21 = 1 1 · 5 + l22 = 6.5 =⇒ l22 = 1.5 1 · 1 + 1.5u23 = 1.75 =⇒ u23 = 0.5 l31 = 0 0 · 5 + l32 = 2 =⇒ l32 = 2 0 · 1 + 2 · 0.5 + l33 = 2.25 =⇒ l33 = 1.25 Le matrici L e U sono:   0.2 0 0   L =  1 1.5 0  0 2 1.25



1  U = 0 0

5 1 0

 1  0.5 1

(c) Si ha det A = det LU = det L det U = det L = 0.375. Quindi det ( A−2 ) = det ( A)−2 = 0.375−2 = 7.11111111. (d) Da Ax = b si ha LUx = b. Si pone Ux = y e si hanno i due sistemi da risolvere per sostituzione in avanti e all’indietro: Ly = b e Ux = y.



0.2  1 0

       0 0 y1 2.8 y1 = 2.8/0.2 = 14     1.5 0  y2  = 19.25 =⇒ y2 = (19.25 − 14)/1.5 = 3.5    2 1.25 y3 10.75 y3 = (10.75 − 2 · 3.5)1.25 = 3 

1  0 0

5 1 0

       1 x1 14  x3 = 3     0.5  x2  = 3.5 =⇒ x2 = 3.5 − 3 · 0.5 = 2    1 x3 3 x1 = 14 − 3 − 5 · 2 = 1

Quindi x = (1, 2, 3) T .

Esercizio  9.6.3 Sia data la  matrice 2 0.5 0.5   A = 0 1 −1  1 −0.5 10.5 (a) Calcolare k Ak∞ (norma massima per righe), k Ak1 (norma massima per colonne) e norma F ( A) (norma di Frobenius). (b) Fattorizzare la matrice A nel prodotto LU (con lii = 1). (c) Utilizzando la fattorizzazione trovata, risolvere il sistema lineare Ax = b con b = [4.5, −1, 31.5] T , e calcolare il determinante di A2 .

157

158

annamaria mazzia

Svolgimento (a) Applicando le definizioni per le diverse norme abbiamo: k Ak∞ = max (3, 2, 12) = 12, k Ak1 = max (3, 2, 12) = 12, √ √ F ( A) = 4 + 0.25 + 0.25 + 1 + 1 + 1 + 0.25 + 110.25 = 118 = 10.862780491. (b) Per la fattorizzazione nel prodotto LU con lii = 1, imponendo l’uguaglianza LU = A si ha:      1 0 0 u11 u12 u13 2 0.5 0.5      1 −1  l21 1 0  0 u22 u23  = 0 l31 l32 1 0 0 u33 1 −0.5 10.5 vale a dire 

u11  l21 u11 l31 u11

u12 l21 u12 + u22 l31 u12 + l32 u22

  u13 2   l21 u13 + u23  = 0 l31 u13 + l32 u23 + u33 1

0.5 1 −0.5

 0.5  −1  10.5

Uguagliando i termini e sostituendo i valori dei coefficienti via via che vengono ricavati si ha: u11 = 2 l21 = 0

u12 = 0.5 u22 = 1

u13 = 0.5 u23 = −1

Inoltre l31 2 = 1 =⇒ l31 = 0.5 0.5 · 0.5 + l32 = −0.5 =⇒ l32 = −0.75 u33 = 9.5 Quindi le due matrici sono   1 0 0   L=0 1 0 0.5 −0.75 1



2  U = 0 0

0.5 1 0

 0.5  −1 9.5

(c) Per risolvere il sistema, applichiamo i seguenti passaggi: Ax =  Ux = y b =⇒ LUx = b =⇒ .  Ly = b 

1  Ly = b =⇒  0 0.5 

2  Ux = y =⇒ 0 0

0.5 1 0

       0 0 y1 4.5 y1 = 4.5     1 0 y2  =  −1  =⇒ y2 = −1    −0.75 1 y3 31.5 y3 = 28.5        0.5 x1 4.5  x3 = 3     −1  x2  =  −1  =⇒ x2 = 2    9.5 x3 28.5 x1 = 1

  1   =⇒ x = 2 3

Per il determinante, risulta: det( A) = det( L) · det(U ) = 1 · (2 · 1 · 9.5) = 19, da cui det( A2 ) = (det( A))2 = 192 = 361.

appunti di calcolo numerico

Esercizio lineareAx =  b dove:  9.6.4 È dato il sistema  16 −8 4 20     A = −8 20 b =  28  4  4 4 12.25 28.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( A3 ).

Svolgimento (a) La matrice è simmetrica, definita positiva in quanto gli elementi della diagonale principale sono tutti positivi e la matrice è diagonalmente dominante in senso stretto: 16 > | − 8| + |4| = 12 20 > | − 8| + |4| = 12 12.25 > |4| + |4| = 8 (b) Ponendo A = LL T si ricava: 2 l11 = 16 =⇒ l11 = 4

l21 l11 = −8 =⇒ l21 = −2 2 l21

l31 l11 = 4 =⇒ l31 = 1 √ 2 + l22 = 20 =⇒ l22 = 20 − 4 = 4

l21 l31 + l22 l32 = 4 =⇒ l32 = (4 + 2)/4 = 1.5 √ √ 2 2 2 = 12.25 =⇒ l33 = 12.25 − 1 − 2.25 = 9 = 3 l31 + l32 + l33 La matrice L è dunque   4 0 0   L =  −2 4 0 1 1.5 3 (c) Per risolvere il sistema Ax = b, adoperiamo il metodo di sostituzione in avanti e all’indietro risolvendo i sistemi: Ly = b e poi L T x = y. Il primo sistema dà:      4 0 0 y1 20      −2 4 0 y2  =  28  1 1.5 3 y3 28.25 e otteniamo y1 = 20/4 = 5, y2 = (28 + 10)/4 = 9.5, y3 = (28.25 − 5 − 14.25)/3 = 3.

159

160

annamaria mazzia

Nel risolvere il sistema L T x = y si ha      4 −2 1 5 x1      0 4 1.5  x2  = 9.5 0 0 3 x3 3 da cui x3 = 1, x2 = (9.5 − 1.5)/4 = 2, x1 = (5 − 1 + 4)/4 = 2, quindi x = (2, 2, 1). Inoltre, da det( A) = det( LL T ) = det( L)2 = (4 · 4 · 3)2 = 482 = 2304 e da det( A3 ) = (det( A))3 si ha det( A3 ) = 23043 = 12230590464.

9.7

Domande di riepilogo

1. Quale è la definizione di una matrice e di un vettore? 2. Che differenza c’è tra matrici diagonali, tridiagonali, triangolari? 3. Cosa significa che una matrice è non singolare? 4. Come si definisce il determinante di una matrice? 5. Che cosa significa “sistema di equazioni lineari”? 6. Descrivere il procedimento di sostituzione in avanti e all’indietro. Su quali matrici può essere applicato? 7. Descrivere il metodo di eliminazione di Gauss. 8. A cosa servono le strategie di pivoting? 9. Enunciare e spiegare il teorema LDU. 10. Spieare le differenze tra fattorizzazione di Crout e fattorizzazione di Doolittle. 11. Per quali matrici la fattorizzazione LDU è stabile rispetto ad una crescita degli errori di arrotondamento e, quindi, viene fatta senza applicare tecniche di pivoting? 12. Come diventa il teorema di fattorizzazione LDU quando è applicato a matrici simmetriche? 13. Sotto quali ipotesi si parla di fattorizzazione di Cholesky e di cosa si tratta?

10 Metodi iterativi per la soluzione di sistemi lineari

10.1

Da un’equazione alle derivate parziali ad un sistema lineare

L’equazione che governa la conduzione del calore in una piastra metallica piana, omogenea e isotropa prende il nome di equazione di Poisson e si scrive come ∂2 T ∂2 T f ( x, y) + = 2 2 ρcK H ∂x ∂y In letteratura diverse tecniche numeriche permettono di risolvere il problema (ricordiamo i metodi alle differenze finite e i metodi agli elementi finiti), in determinati punti (detti nodi) della piastra. Qualunque sia il metodo utilizzato, si arriva ad un sistema di equazioni lineari del tipo HT = q dove H rappresenta la matrice di discretizzazione del metodo, T rappresenta il vettore delle temperature nei nodi e q è il vettore dei termini noti che deriva dal metodo applicato. La matrice H puó avere una dimensione molto elevata ma ha la caratteristica di essere sparsa, cioè di avere pochi elementi diversi da zero per ogni riga. Per risolvere sistemi lineari di questo tipo, si preferisce usare metodi iterativi piuttosto che diretti. In questo Capitolo presentiamo alcuni dei metodi iterativi per la risoluzione di sistemi lineari.

10.2

Metodi iterativi

Per risolvere un sistema di equazioni lineari Ax = b, applicando un metodo diretto, e trascurando gli errori di arrotondamento, si ottiene la soluzione esatta del problema in un numero finito (e noto a priori) di operazioni. Nei metodi iterativi, invece, si parte da un’approssimazione iniziale che viene migliorata, mediante un procedimento iterati-

Mi spiace ammettere che la materia che mi è piaciuta di meno è stata la matematica. Ci ho pensato su, e credo che la ragione sia che la matematica non lascia spazio alle discussioni. Se fai un errore, non puoi scamparla. Malcom X

Si tratta di un’equazione alle derivate parziali dove T [ o C] è la temperatura, K H [m2 /s] è il coefficiente di diffusività termica, ρ [Kg/m2 ] è la densità della piastra, c [Cal/Kg o C ] è il calore specifico, f ( x, y) [Cal/m2 s] è il calore aggiunto o sottratto alla piastra per unità di tempo e di area.

162

annamaria mazzia

vo, fino ad ottenere una approssimazione sufficientemente accurata della soluzione. Quando abbiamo studiato gli zeri di funzione nel Capitolo 5, data un’approssimazione iniziale, si procedeva nell’algoritmo iterativo fino a quando lo scarto tra due approssimazioni successive non diventava minore di una prefissata tolleranza. Nel caso dei sistemi lineari, l’approccio è simile. Si parte da un vettore iniziale che approssima la soluzione del sistema e, mediante un certo procedimento ricorsivo, si calcola una nuova approssimazione (un vettore). Dobbiamo dunque essere capaci di misurare lo scarto tra due vettori in modo da capire quando la successione dei vettori generati dall’algoritmo tende al vettore soluzione del sistema lineare. Abbiamo perciò bisogno di definire le norme di vettori e di matrici. Nel seguito, tratteremo solo norme di matrici e vettori definite nello spazio dei numeri reali (e non complessi).

10.3

Norme di vettori

Il concetto di norma generalizza quello di valore assoluto (o modulo) di un numero reale (o complesso). n Sia R lo spazio dei vettori colonna di lunghezza n. La norma di n n un vettore x ∈ R è una funzione, k · k, definita in R e a valori in R, che gode delle seguenti proprietà:

x x x x

kxk > 0 per ogni x 6= 0 kxk = 0 se e solo se x = 0 kαxk = |α|kxk dove α è un reale (o complesso) arbitrario kx + yk ≤ kxk + kyk

Le principali norme vettoriali sono:

x x

Norma assoluta (o norma l1 ), indicata con k · k1 : kxk1 = ∑in=1 | xi |

Norma massima (o norma infinito, l∞ ), indicata con k · k∞ : kxk∞ = max1≤i≤n | xi | √ Norma euclidea (o norma l ), indicata con k · k : k x k = xT x = 2 2 2 q n ∑ i =1 | x i | 2

x

Tra le norme 1, ∞ e 2 valgono le seguenti relazioni (che pongono n un’equivalenza tra esse). Dato un vettore x ∈ R : √ k x k ∞ ≤ k x k2 ≤ n k x k ∞

k x k ∞ ≤ k x k1 ≤ n k x k ∞ Esempio Il vettore x = (1, 5, −20) T ha norme:

kxk1 = |1| + |5| + | − 20| = 26 kxk∞ = max (|1|, |5|, | − 20|) = 20 q √ kxk2 = (12 + 52 + (−20)2 ) = 426 = 20.639767441

L’idea di risolvere sistemi lineri con metodi iterativi risale ai tempi di Gauss (1823), ma solo con l’avvento dei computers (negli anni cinquanta) si può osservare il loro sviluppo, visto che diventa possibile risolvere sistemi lineari dove la matrice A è sparsa e di grandi dimensioni – un particolare tipo di problema improponibile per i metodi diretti. Difatti, nei metodi diretti, il processo di eliminazione di Gauss (o la decomposizione della matrice di 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 diversi da zero là dove la matrice di partenza A ha elementi nulli. I metodi diretti diventano quindi proibitivi perchè troppo costosi per quanto riguarda il numero di operazioni aritmetiche e l’occupazione di dati che devono essere salvati per l’implementazione numerica del metodo stesso. I metodi iterativi, al contrario, lavorano direttamente sulla matrice A e, dal momento che A viene coinvolta solo in termini di prodotti matrice-vettore, non c’è neanche bisogno di memorizzare tutta la matrice (in genere, quando la matrice è sparsa, si lavora su memorizzazioni in forma compatta delle matrici, memorizzando solo gli elementi non nulli che servono per il prodotto matrice-vettore).

appunti di calcolo numerico

163

_

R2 con norma unitaria

Figura 10.1: Vettori in nelle norme 1, ∞ e 2.

Per la norma euclidea vale la diseguaglianza di Cauchy-Schwarz

x T y ≤ k x k2 k y k2 n

Dati due vettori x e y ∈ R , si definisce distanza tra i due vettori la norma della differenza tra i vettori. Quindi: n

k x − y k1 =

∑ | xi − yi |

i =1

kx − yk∞ = max | xi − yi | 1≤ i ≤ n s n

k x − y k2 =

∑ | x i − y i |2

i =1

Il concetto di distanza serve per definire il limite di una successione di vettori. n Data una successione di vettori in R , x(k) , per k = 1, 2, . . . , ∞, si n dice che la successione converge ad un vettore x di R e si scrive limk→∞ x(k) = x se, per ogni e > 0, esiste un intero m tale che

kx(k) − xk < e per tutti gli indici k ≥ m

10.4

Norme di matrici

Analogamente alla definizione di norma vettoriale, la norma di matrici quadrate di dimensione n è una funzione, che indichiamo con k · k che, per tutte le matrici A e B di dimensione n e per tutti i numeri reali (o complessi) α, soddisfa le seguenti proprietà:

x x x x x

k Ak > 0 per ogni A 6= 0 k Ak = 0 se e solo se A = 0 kαAk = |α|k Ak k A + Bk ≤ k Ak + k Bk k ABk ≤ k Akk Bk

Una proprietà importante che si richiede alle norme su matrici è che siano compatibili con norme vettoriali.

164

annamaria mazzia

Definizione 10.4.1 La norma k Ak di una matrice A si dice compatibile con la norma kxk di un vettore x se vale la relazione

k Axk ≤ k Akkxk Alcune norme su matrici sono generate da norme su vettori: si parla allora di norma naturale o indotta dalla norma di vettori. n

Definizione 10.4.2 Se k · k è una norma su vettori in R , si definisce come norma naturale o indotta su matrici la norma data da k Ak = maxkxk=1 k Axk. Le norme di matrici indotte dalla norma 1 e dalla norma infinito su vettori sono:

x

Norma 1: k Ak1 = max j ∑in=1 | aij | (data dal massimo sulla somma delle colonne)

x

Norma infinito: k Ak∞ = somma delle righe)

maxi ∑nj=1

| aij | (data dal massimo sulla

T A)

=

p

tr ( AA T ) =

r

∑ni=1 | aij |2 . j =1

Tra le norme naturali su matrici e le norme di vettori da cui sono generate, è facile provare la seguente proposizione. Proposizione 10.4.1 Le norme naturali su matrici sono norme compatibili con le norme di vettori da cui sono costruite. Dimostrazione. Dalla definizione alternativa che abbiamo dato di norma naturale (e chiamando il generico vettore con il simbolo x), segue per un vettore x diverso dal vettore nullo,

k Axk k Axk ≤ max = k Ak kxk x6=0 k x k da cui

k Axk ≤ k Akkxk Se invece il vettore x è il vettore nullo, la relazione di compatibilità è ovvia. 4

10.5

Autovalori e autovettori

Data una matrice quadrata A di ordine n, se esiste un numero (reale o complesso) λ e un vettore x 6= 0 tali che Ax = λx

k Ayk . Infatti, kyk preso un qualunque vettore y 6= 0, si può considerare il vettore x = y/kyk che ha è data da k Ak = maxy6=0

norma unitaria. Allora (sfruttando le proprietà delle norme su vettori e considerando la relazione che lega x a y) abbiamo



y

k Ak = max k Axk = max A

kyk y6=0 kxk=1 da cui

k Ak = max y6=0

La norma di matrice indotta dalla norma 2 è più complicata e vedremo in seguito come è definita. Una norma di matrici, che non è indotta, ma compatibile con la norma 2 è la cosiddetta norma euclidea (o di Frobenius). Tenendo presente che, data una matrice A, si chiama traccia della matrice o tr ( A) la somma degli elementi della diagonale principale di A, la norma euclidea (o di Frobenius) è data da

G N( A) = ptr( A

Una definizione alternativa a quella che abbiamo dato per la norma naturale su matrici

k Ayk kyk

appunti di calcolo numerico

allora λ è un autovalore e x il corrispondente autovettore della matrice A. Scritta in maniera equivalente, la relazione definisce il sistema lineare

( A − λI )x = 0 Poichè x 6= 0 e il termine noto del sistema è il vettore di tutti zeri, il determinante della matrice del sistema deve necessariamente essere uguale a zero, cioè det ( A − λI ) = 0. Lo sviluppo del determinante porta a un polinomio di grado n nell’incognita λ: λn − tr ( A)λn−1 + . . . + (−1)n det ( A) = 0 Questo polinomio si chiama polinomio caratteristico. Le sue n radici, che chiamiamo λ1 , λ2 , . . . , λn , sono gli n autovalori della matrice A. Per le proprietà dei polinomi vale: n

∑ λi = tr( A) = a11 + a22 + . . . + ann

i =1

n

e

∏ λi = det ( A)

i =1

Alcune proprietà sugli autovalori e autovettori sono le seguenti:

x

Se λ è autovalore della matrice A, allora λk è autovalore della matrice potenza Ak (cioè A · A · · · A k volte).

x

Se λ è autovalore della matrice A, e A è regolare, allora λ−1 è autovalore della matrice inversa A−1 .

x

Gli autovalori di una matrice A e della sua trasposta A T sono gli stessi (ma gli autovettori sono, in genere, diversi).

x

Se A e B sono due matrici arbitrarie regolari, allora gli autovalori di AB sono gli stessi di BA.

Se x è un autovettore associato alla matrice A, allora Ax = λx: la matrice A trasforma il vettore x in un vettore le cui componenti sono moltiplicate per λ: se λ > 1, allora A ha l’effetto di allungare x di un fattore λ; se invece 0 < λ < 1, allora x si restringe di un fattore λ; gli effetti sono simili, ma il verso del vettore risultante Ax è opposto, quando λ < 0. I quattro casi che si possono presentare sono illustrati in Figura 10.2. Figura 10.2: Autovalori e autovettori

Una strada per localizzare gli autovalori di una matrice è data dal teorema dei cerchi di Gershgorin.

165

166

annamaria mazzia

Teorema 10.5.1 Data una matrice A di dimensione n × n, ciascun autovalore di A giace nell’unione dei cerchi C1 , C2 , . . . , Cn dove Ci rappresenta la circonferenza di centro aii e raggio ri = ∑ j6=i | aij | (il raggio è uguale alla somma degli elementi della restante riga di A presi in valore assoluto). Dimostrazione. Sia x autovettore di A associato all’autovalore λ. Sia xi la componente con valore massimo di x. Allora da Ax = λx si ha

(λ − aii ) xi =

∑ aij x j j 6 =i

Ovvero, dividendo tutto per xi e considerando i valori assoluti: xj xj |λ − aii | = | ∑ aij | ≤ ∑ | aij | xi xi j 6 =i j 6 =i Nell’ipotesi che xi è la componente massima dell’autovettore abbiamo

|λ − aii | ≤

∑ |aij | = ri j 6 =i

Quindi l’autovalore λ si trova all’interno della circonferenza di centro aii e raggio ri . Non sapendo, a priori, chi sia questo indice i, possiamo concludere che ogni autovalore si trova nell’unione dei cerchi C1 , C2 , . . ., Cn . 4 Altre proprietà da tenere presenti sono le seguenti:

x

Se tutti gli n autovalori di una matrice A sono distinti, allora gli n autovettori u(1) , u(2) , . . . u(n) sono linearmente indipendenti.

x

Se A è una matrice simmetrica reale definita positiva, allora i suoi autovalori sono tutti reali e positivi.

Dati n vettori linearmente indipendenti di n

Rn ,

u(1) , u(2) , . . . u(n) , ogni vettore di si può scrivere come una loro combinazione lineare. Quindi esistono n coefficienti α1 , α2 , . . . , αn per cui x = α1 u(1) + α2 u(2) + . . . + αn u(n) . Inoltre, per vettori linearmente indipendenti vale 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.

R

Introduciamo ora il raggio spettrale di una matrice A Definizione 10.5.1 Il raggio spettrale ρ( A) di una matrice A è definito da ρ( A) =

max

λ autovalore di A

|λ|

Quindi il raggio spettrale è il massimo, in modulo, degli autovalori di A. Possiamo ora definire la norma 2 su matrici indotta dalla norma 2 su vettori. Si può, infatti, provare che

G k Ak

p = ρ ( A T A ). Inoltre, per ogni norma naturale, vale il risultato 2

ρ( A) ≤ k Ak Matrici convergenti. Nello studiare i metodi iterativi per risolvere i sistemi lineari, sarà di particolare importanza sapere quando le potenze di una matrice tendono alla matrice nulla. Matrici A, per cui ( Ak )ij → 0 per k → ∞, qualunque sia i, j = 1, 2, . . . , n, (consideriamo

Se λ è un numero complesso, si può scrivere come√λ = α + iβ, con α e β numeri reali e i = −1 la cosiddetta unità p immaginaria. Per il modulo si ha |λ| = α2 + β2 .

appunti di calcolo numerico

167

A · A · · · A k volte e gli elementi della matrice risultante tendono a zero per k → ∞) si dicono matrici convergenti. Diciamo che una matrice A di dimensione n è convergente se lim ( Ak )ij = 0, i, j = 1, 2, . . . , n

k→∞

Si ha il seguente teorema. Teorema 10.5.2 Data una matrice A di dimensione n, sono equivalenti le seguenti proposizioni 1. A è una matrice convergente. 2. limk→∞ k Ak k = 0, per qualche norma naturale. 3. limk→∞ k Ak k = 0, per tutte le norme naturali. 4. ρ( A) < 1. 5. limk→∞ Ak x = 0, qualunque sia il vettore x.

10.6

Metodi "classici"

I metodi iterativi "classici" per la risoluzione di un sistema di equazioni lineari del tipo Ax = b si basano su un’idea molto semplice.

x

Si parte da un’approssimazione iniziale x(0) , commettendo un’errore e(0) = x − x(0) . L’errore e(0) è soluzione del sistema Ae(0) = b − Ax(0) = r(0) , dove r(0) è il residuo (ciò che resta fuori, ci dice di quanto il vettore Ax(0) si discosta da b).

x

Successivamente si definisce il vettore x(1) come x(1) = x(0) + p(0) , dove ora p(0) è soluzione del sistema Mp(0) = r0 , in cui la matrice M è più semplice della A e, allo stesso tempo, M−1 approssima in qualche modo A−1 .

x Il procedimento viene iterato fino a convergenza. Da queste richieste tra loro contradditorie, si sviluppa una strategia che porta alla soluzione esatta x come limite 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 del tipo 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 di iterazione del metodo. Nel seguito, per semplicità, poniamo q = M−1 b.

Lo schema iterativo appena descritto è un metodo stazionario (cioè non dipende dall’iterazione k) e può essere visto come caso particolare di uno schema di punto fisso per equazioni nonlineari: la funzione g tale che x(k+1) = g(x(k) ) converga alla soluzione del sistema Ax = b, è data da g(x) = x + M−1 (b − Ax) o equivalentemente da g(x) = Ex + q.

168

10.6.1

annamaria mazzia

Convergenza Per studiare la convergenza di 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) . Infatti Ae(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 quando limk→∞ 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 ha

Il vettore soluzione x è punto fisso della funzione vettoriale g(x) = Ex + q. Infatti ponendo E = I − M−1 A e q = M−1 b si ha Ex + q = ( I − M−1 A)x + M−1 b = x − M−1 Ax + M−1 b. Dal momento che x è il vettore soluzione si ha Ax = b perciò la relazione precedente diventa Ex + q = x − M−1 b + M−1 b = x. Il vettore soluzione è punto fisso!

x = Ex + q x(k) = Exk−1 + q e sottraendo si ricava e(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 possiamo scrivere e(k−1) = Ee(k−2) . Scriviamo queste relazioni dall’iterazione k fino ad arrivare all’iterazione 0. e(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 relazione successiva, si ha: e(k) = Ee(k−1) = E( Ee(k−2) ) = E2 e(k−2) = E2 ( Ee(k−3) ) = E3 e(k−3) = . . . = Ek e(0) Osserviamo che Ek 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 limk→∞ e(k) = limk→∞ Ek e(0) = 0 se e solo se limk→∞ Ek = 0. Per il teorema sulla convergenza di matrici (si veda pag. 167), questo si ha se e solo se ρ( E) < 1. Si può dunque stabilire il seguente teorema. Teorema 10.6.1 Lo schema iterativo x(k+1) = Ex(k) + q

k≥0

appunti di calcolo numerico

169

converge qualunque sia il vettore iniziale x0 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 di iterazione E abbia n autovalori distinti e, quindi, possieda n autovettori linearmente indipendenti, per cui l’errore iniziale e(0) si può scrivere come 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) sono gli autovettori associati, rispettivamente, a λ1 , λ2 , . . . , λn . Supponiamo che gli autovalori siano in ordine decrescente in modulo, cioè: |λ1 | > |λ2 | > . . . > |λn |, per cui ρ( E) = |λ1 |. In tal caso si può scrivere e ( k ) = E k e (0) = E k ( α 1 u (1) + α 2 u (2) + . . . + α n u ( n ) )

Ricordiamo che, se λ è un autovalore associato alla matrice A, con u un autovettore ad esso associato, si ha Ak u = λk u).

= α 1 E k u (1) + α 2 E k u (2) + . . . + α n E k u ( n ) = α1 λ1k u(1) + α2 λ2k u(2) + . . . + αn λkn u(n) mettiamo in evidenza λ1k

=

λ1k

α1 u

(1)

+ α2

per k → ∞ si ha

λ2k λ1k

λik λ1k

u

(2)

λk + . . . + αn nk u(n) λ1

!

→ 0 per i = 2, 3, . . . , n

≈ λ1k α1 u(1) Perciò limk→∞ e(k) = limk→∞ λ1k α1 u(1) = 0 se e solo se λ1k → 0 e questo si ha se e solo se |λ1 | < 1. Ma |λ1 | = ρ( E): ritroviamo il risultato visto prima.

10.6.2

Controllo della convergenza Oltre a sapere che lo schema iterativo converge, è importante conoscere quanto velocemente lo schema converge. A tal proposito osserviamo che, in condizioni asintotiche (per k → +∞) vale il seguente risultato

k e ( k ) k ≈ ρ ( E ) k k e (0) k

(10.1)

Scrivendo l’equazione (10.1) per l’iterazione k − 1 e facendo il rapporto tra le norme degli errori a due passi successivi si ha:

k e(k) k ≈ ρ( E) k e ( k −1) k Ricaviamo, quindi, che il metodo iterativo ha convergenza lineare con costante asintotica uguale al raggio spettrale della matrice di iterazione. La relazione appena trovata è utile per stabilire quanto veloce è il metodo iterativo per approssimare la soluzione del sistema con una certa accuratezza. Ad esempio, vogliamo stabilire a priori quante iterazioni occorrono per ridurre la norma dell’errore iniziale di un

Questa relazione vale anche per matrici con autovalori non distinti tra loro.

170

annamaria mazzia

certo fattore, ad esempio 10 (il che vuol dire ridurre l’errore di un ordine di grandezza). Vogliamo dunque capire quale deve essere il k e (0) k valore di k per cui ke(k) k = . Ma ke(k) k ≈ ρ( E)k ke(0) k da cui 10 ρ ( E ) k k e (0) k ≈

k e (0) k 1 =⇒ ρ( E)k ≈ 10 10

Applicando il logaritmo in base 10 ad ambo i membri si ha k log10 (ρ( E)) ≈ −1 =⇒ k ≈ −

1 log10 (ρ( E))

cioè occorrono k iterazioni con k dato dal più piccolo intero che soddisfa la relazione appena scritta. Meno iterazioni occorrono fare, più veloce è il metodo. Si definisce perciò velocità asintotica di convergenza R = − log10 (ρ( E)) =

− log10 (ρ( Ek )) k

Osserviamo che, essendo ρ( E) < 1, nelle ipotesi in cui il metodo converge, log10 (ρ( E)) < 0 e, di conseguenza, R > 0. Se vogliamo ridurre l’errore iniziale di una certa quantità e, rifacendo i conti come prima, dobbiamo cercare l’intero k che renda valida la disuguaglianza ke(k) k ≤ eke(0) k, sapendo che ke(k) k ≈ ρ( E)k ke(0) k. Ma allora deve valere la relazione ρ( E)k ke(0) k ≤ eke(0) k =⇒ ρ( E)k ≤ e Passando ai logaritmi (di quantità minori di uno) si ha k log10 (ρ( E)) ≤ log10 (e) =⇒ −k log10 (ρ( E)) ≥ − log10 (e) =⇒ k ≥

− log10 (e) R

Troviamo in questo modo quante iterazioni (il primo intero k che verifica la relazione precedente) occorre fare per poter ridurre l’errore iniziale di e. Grafico di convergenza e velocità asintotica di convergenza. Se si traccia un grafico semilogaritmico del profilo di convergenza dello schema iterativo, ponendo sull’asse delle ascisse il numero delle iterazioni e sull’asse delle ordinate la norma dell’errore, si può vedere che la velocità asintotica di convergenza è legata alla pendenza della retta. Infatti, riconducendoci, per semplicità, al caso in cui la matrice di iterazione abbia n autovalori distinti tra loro e ordinati in senso crescente, dalla relazione (vista a pag. 169) e(k) ≈ λ1k α1 u(1) passando alle norme e ai logaritmi in base 10 si ha log10 ke(k) k ≈ k log10 |λ1 | + costante La pendenza del grafico è l’opposto della velocità asintotica di convergenza R.

appunti di calcolo numerico

171

Nel caso in cui non è nota la soluzione esatta x, poichè ke(k) k ≈ − x(k−1) k = kd(k) k (valgono le stesse considerazioni viste per gli schemi iterativi per funzioni non lineari a pag. 68), ritroviamo lo stesso risultato sul profilo di convergenza semilogaritmico in cui si pone sull’asse delle ascisse il numero delle iterazioni e sull’asse delle ordinate la norma degli scarti.

k x(k)

10.6.3

I metodi

Si scriva la matrice A come somma della matrice che ha i soli elementi diagonali di A (che chiamiamo D), della matrice costituita dai soli elementi della parte triangolare bassa di A (che chiamiamo L) e dai soli elementi della parte triangolare alta di A (che denotiamo con U), A = L+D+U

Attenzione a non confondere la fattorizzazione di una matrice ( A = LDU ) dalla scomposizione della matrice A nella somma delle matrici L, D e U , A = L + D + U . Abbiamo indicato con gli stessi simboli matrici che sono diverse tra loro a seconda che si faccia fattorizzazione o scomposizione!!!

Figura 10.3: La matrice A come somma delle matrici L, D e U .

In questo modo è facile ricavare i metodi iterativi di Jacobi, GaussSeidel e di rilassamento, che sono i metodi iterativi classici per la soluzione di sistemi lineari. L’ipotesi da fare è che A abbia elementi diagonali diversi da zero (aii 6= 0 per i = 1, 2, . . . , n, n, da cui la matrice diagonale D è invertibile). Se la matrice A è simmetrica, definita positiva, necessariamente aii 6= 0. Altrimenti, poichè A è non singolare (se così non fosse non potremmo risolvere il sistema), le equazioni del sistema possono essere riordinate in modo da avere la matrice risultante con elementi diagonali diversi da zero.

10.6.4

Il metodo di Jacobi

Il metodo di Jacobi (o degli spostamenti simultanei - o rilassamento simultaneo) si ha ponendo M = D da cui la matrice di iterazione diventa 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 b x ( k +1) = − D −1 ( L + U ) x ( k ) + D −1 b

Carl Gustav Jacob Jacobi (1804-1851) fu un grande matematico tedesco. Tra i suoi numerosi studi ricordiamo quelli sulle funzioni ellittiche, sulla teoria dei numeri e sulla meccanica celeste.

172

annamaria mazzia

Per ricavare questo schema, si può partire dal sistema lineare Ax = b e scrivere la matrice A come L + D + U. Si ha

( L + D + U )x = b si porta a secondo membro ( L + U )x Dx = −( L + U )x + b si moltiplicano ambo i membri per l’inversa della matrice D x = − D −1 ( L + U ) x + D −1 b si innesca il metodo iterativo considerando il vettore x a primo membro all’iterazione k + 1 a secondo membro all’iterazione k x ( k +1) = − D −1 ( L + U ) x ( k ) + D −1 b

Componente per componente, il metodo di Jacobi si scrive, per i = 1, 2, . . . , n, come ( D −1 )ii ( k +1)

xi

=

1 aii

   bi − 





(( L+U )x(k) )i n (k)  aij x j   j=1,j6=i ⇑



o, equivalentemente,

( D −1 )ii ( k +1)

xi

=

1 aii ⇑

( Lx(k) )i i − 1  (k)  bi − aij x j  j =1 ⇑





(Ux(k) )i n





j = i +1



(k)  aij x j  

per i = 1, . . . , n



La formula la si può ricavare direttamente, scrivendo, equazione per equazione, il sistema da risolvere Ax = b: a11 x1 + a12 x2 + a13 x3 + . . . + a1n xn = b1 a21 x1 + a22 x2 + a23 x3 + . . . + a2n xn = b2 .. .

. = ..

ai1 x1 + ai2 x2 + ai3 x3 + . . . + ain xn = bi .. .

. = ..

an1 x1 + an2 x2 + an3 x3 + . . . + ann xn = bn Dalla prima equazione “isoliamo” la prima incognita rispetto a tutte le altre; dalla seconda equazione “isoliamo” la seconda incognita e

appunti di calcolo numerico

173

così via per le altre equazioni, ottenendo: a11 x1 = b1 − ( a12 x2 + a13 x3 + . . . + a1n xn ) a22 x2 = b2 − ( a21 x1 + a23 x3 + . . . + a2n xn ) .. .=

.. .

aii xi = bi − ( ai1 x1 + ai2 x2 + . . . + aii−1 xi−1 + aii+1 xi+1 + . . . + ain xn ) .. .=

.. .

ann xn = bn − ( an1 x1 + an2 x2 + an3 x3 + . . . + ann−1 xn−1 ) Dividendo l’i-sima equazione per il coefficiente aii , per i = 1, 2, . . . , n, ricaviamo 1 [b − ( a12 x2 + a13 x3 + . . . + a1n xn )] a11 1 1 x2 = [b2 − ( a21 x1 + a23 x3 + . . . + a2n xn )] a22 .. .. .= .

x1 =

1 [b − ( ai1 x1 + ai2 x2 + . . . + aii−1 xi−1 + aii+1 xi+1 + . . . + ain xn )] aii i .. .. .= .

xi =

xn =

1 [bn − ( an1 x1 + an2 x2 + an3 x3 + . . . + ann−1 xn−1 )] ann

Se pensiamo di partire da un vettore iniziale x(0) , il vettore x(1) si ottiene dalle equazioni precedenti, ponendo a secondo membro di ciascuna equazione le componenti del vettore x(0) . Si ricava, in tal modo, la formula ricorsiva dello schema di Jacobi: i  1 h (k) (k) (k) ( k +1) x1 = b1 − a12 x2 + a13 x3 + . . . + a1n xn a11 i  1 h ( k +1) (k) (k) (k) x2 = b2 − a21 x1 + a23 x3 + . . . + a2n xn a22 .. .. .= . h  i 1 ( k +1) (k) (k) (k) (k) (k) xi = bi − ai1 x1 + ai2 x2 + . . . + aii−1 xi−1 + aii+1 xi+1 + . . . + ain xn aii .. .. .= . h  i 1 (k) (k) (k) (k) ( k +1) bn − an1 x1 + an2 x2 + an3 x3 + . . . + ann−1 xn−1 xn = ann Ritroviamo, dunque, la formula che prima avevamo scritta in modo compatto. Il metodo di Jacobi può essere scritto in modo equivalente in funzione del residuo r(k) = b − Ax(k) mediante la formula x(k+1) = x ( k ) + D −1 r ( k ) .

10.6.5

Il Metodo di Gauss-Seidel

Nell’algoritmo di Gauss-Seidel si pone M = D + L ottenendo la

Philipp Ludwig von Seidel (1821-1896) fu un matematico tedesco. Il suo lavoro più importante riguarda le aberrazioni ottiche.

174

annamaria mazzia

matrice ES = I − ( D + L)−1 A = I − ( D + L)−1 ( L + D + U ) = −( D + L)−1 U. Lo schema iterativo è: x(k+1) = ES x(k) + ( D + L)−1 b Lo schema di Gauss-Seidel si può ricavare a partire dal sistema lineare Ax = b nel modo seguente: Ax = b

( L + D + U )x = b si porta a secondo membro Ux

( D + L)x = −Ux + b si moltiplicano ambo i membri per l’inversa della matrice ( D + L) x = −( D + L)−1 Ux + ( D + L)−1 b si innesca il metodo iterativo considerando il vettore x a primo membro all’iterazione k + 1 a secondo membro all’iterazione k x

( k +1)

= −( D + L)−1 Ux(k) + ( D + L)−1 b

Moltiplicando ambo i membri per ( D + L) si ha

( D + L)x(k+1) = b − Ux(k) Dx(k+1) = b − Lx(k+1) − Ux(k) da cui   x(k+1) = D −1 b − Lx(k+1) − Ux(k) Componente per componente si ha

( k +1) xi

# " i −1 n 1 ( k +1) (k) b − aij x j − ∑ aij x j = aii i j∑ =1 j = i +1

per i = 1, . . . , n

Il metodo è detto anche degli spostamenti successivi, in quanto il calcolo delle componenti del vettore x(k+1) è fatto utilizzando le componenti già calcolate del vettore stesso. Infatti, per i > 1, è ( k +1)

( k +1)

( k +1)

ragionevole pensare che i valori già calcolati x1 , x2 , . . . , x i −1 possano essere utilizzati per dare una migliore approssimazione del ( k +1)

valore xi . Dalle equazioni del sistema, ragionando come per il metodo di Jacobi, possiamo quindi scrivere:   ( k +1) (k) (k) (k) a11 x1 = b1 − a12 x2 + a13 x3 + . . . + a1n xn   ( k +1) ( k +1) (k) (k) a22 x2 = b2 − a21 x1 + a23 x3 + . . . + a2n xn .. .= ( k +1)

aii xi

  ( k +1) ( k +1) ( k +1) (k) (k) = bi − ai1 x1 + ai2 x2 + . . . + aii−1 xi−1 + aii+1 xi+1 + . . . + ain xn

.. .= ( k +1)

ann xn

.. .

.. .

  ( k +1) ( k +1) ( k +1) ( k +1) = bn − an1 x1 + an2 x2 + an3 x3 + . . . + ann−1 xn−1

appunti di calcolo numerico

175

Dividendo ambo i membri dell’equazione i-sima per aii (per i = 1, 2, . . . , n) si ha: ( k +1)

x1

( k +1)

x2

1 a11 1 = a22

=

h

 i (k) (k) (k) b1 − a12 x2 + a13 x3 + . . . + a1n xn

h

 i ( k +1) (k) (k) b2 − a21 x1 + a23 x3 + . . . + a2n xn

.. .=

.. .

 i 1 h ( k +1) ( k +1) ( k +1) (k) (k) bi − ai1 x1 + ai2 x2 + . . . aii−1 xi−1 + aii+1 xi+1 + . . . + ain xn aii .. .. .= . h  i 1 ( k +1) ( k +1) ( k +1) ( k +1) ( k +1) bn − an1 x1 + an2 x2 + an3 x3 + . . . + ann−1 xn−1 xn = ann ( k +1)

xi

=

Usando il residuo, lo schema di Gauss-Seidel si scrive come x ( k +1) = x ( k ) + ( D + L ) −1 r ( k )

10.6.6

Il metodo di rilassamento Ciascuno dei metodi di Jacobi e Gauss-Seidel può essere anche rilassato tramite un fattore ω in modo che la nuova approssimazione ( k +1)

xR sia ottenuta come una combinazione di x(k+1) e x(k) mediante il fattore ω. In particolare: ( k +1)

xR

Abbiamo usato in pedice la notazione R per indicare il vettore ottenuto con il rilassa( k +1)

←− (1 − ω )x(k) + ωx(k+1)

mento x R notazione.

Questa operazione viene fatta direttamente nel momento in cui si stabilisce il metodo iterativo con rilassamento. Si può osservare che il metodo di Jacobi rilassato non produce effettivi miglioramenti rispetto al metodo non rilassato. Invece, il metodo di Gauss-Seidel rilassato può produrre un metodo molto più veloce in termini di convergenza e, quindi, preferibile rispetto al metodo senza rilassamento. Come metodo di rilassamento, dunque, consideriamo il metodo di rilassamento ottenuto da Gauss-Seidel. Per scelte di ω nell’intervallo ]0, 1[ si parla di metodo Sotto-Rilassato, o Under-Relaxation (e in genere è usato per ottenere convergenza nella soluzione di sistemi che non convergono con il metodo di GaussSeidel). Per valori di ω nell’intervallo [1, 2[ si ha, invece, il metodo noto come metodo di sovra-rilassamento o SOR (Successive OverRelaxation) – usato per accelerare la convergenza in sistemi che sono convergenti con il metodo di Gauss-Seidel. Lo schema di rilassamento, applicato al metodo di Gauss-Seidel, è dato da

( k +1) xi

=

(k) (1 − ω ) x i

" # i −1 n ω ( k +1) (k) + b − aij x j − ∑ aij x j aii i j∑ =1 j = i +1

per i = 1, . . . , n

. Poi abbandoneremo questa

176

annamaria mazzia

La matrice di iterazione del metodo di rilassamento si ricava scrivendo in forma matriciale l’algoritmo appena descritto   x(k+1) = (1 − ω )x(k) + ωD −1 b − Lx(k+1) − Ux(k) i h x(k+1) = (1 − ω ) I − ωD −1 U x(k) − ωD −1 Lx(k+1) + ωD −1 b h i ( I + ωD −1 L)x(k+1) = (1 − ω ) I − ωD −1 U x(k) + ωD −1 b Moltiplicando ambo i membri per D, si ricava

( D + ωL)x(k+1) = [(1 − ω ) D − ωU ] x(k) + ωb La matrice di iterazione del metodo è dunque E = ( D + ωL)−1 [(1 − ω ) D − ωU ]

= ( D + ωL)−1 [(1 − ω ) D − ω ( A − D − L)] = ( D + ωL)−1 [( D + ωL) − ωA] h i = I − ω ( D + ωL)−1 A A questo punto, ci si può chiedere quale sia l’ω ottimale nel metodo di rilassamento. L’ω ottimale è quello che fa sì che il metodo di rilassamento converga nel minor numero di iterazioni (quindi, l’ω ottimale rende minimo il raggio spettrale della matrice di iterazione). Per particolari matrici A, sarà possibile stabilire a priori l’ω ottimale per risolvere il sistema lineare Ax = b.

10.6.7

Convergenza dei metodi di Jacobi, Gauss-Seidel, rilassamento

Le matrici di iterazione dei tre metodi appena descritti sono scritte in Tabella 10.1 metodo Jacobi Gauss-Seidel rilassamento

matrice E J = I − D −1 A = − D −1 ( L + U ) ES = I − ( D + L)−1 A = −( D + L)−1 U Eω = I − ω ( D + ωL)−1 A

Perchè ci sia convergenza, il raggio spettrale della matrice di iterazione deve essere minore di uno. Per i metodi di Jacobi e di Gauss-Seidel si può provare la convergenza del metodo, se la matrice A ha una delle seguenti caratteristiche:

x x

Se la matrice A è diagonalmente dominante in senso stretto, la convergenza del metodo di Jacobi si può provare applicando il teorema di Gershgorin. Infatti gli autovalori della matrice E J , per il teorema di Gershgorin verificano la relazione, per i = 1, . . . , n

|λ| ≤

A è diagonalmente dominante in senso stretto

A è a diagonalmente dominante (per righe o per colonne) ed è irriducibile.

Si ha inoltre, questo risultato:

x

Tabella 10.1: Matrici di iterazione dei metodi di Jacobi, Gauss-Seidel, rilassamento

se A è simmetrica non singolare con elementi principali reali e positivi, allora il metodo di Gauss-Seidel è convergente se e solo se A è definita positiva.

aij ∑ aii . j 6 =i

D’altra parte, se A è diagonalmente dominante in senso stretto | aii | > ∑ j6=i | aij | da cui

aij ∑ j6=i < 1 ovvero gli autovalori della maaii trice E J sono minori di 1, da cui concludiamo che ρ( E J ) < 1. Una matrice si dice irriducibile se non può essere messa sotto la forma di matrice riducibile, a dire, non può essere scritta come  vale 

P ∅

Q . Un esempio di matrice riducibile R

è



10 2  A= 0 0

−2 −1 0 0

3 2 1 1

 4 6   −1 1

appunti di calcolo numerico

Per quanto riguarda il metodo di rilassamento, condizione 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 sovra-rilassamento). Difatti il determinante della matrice di iterazione del metodo di rilassamento vale det Eω = (1 − ω )n e, poichè il prodotto degli autovalori di una matrice è uguale al determinante della matrice stessa, segue la relazione ρ( Eω ) ≥ |1 − ω |. Quindi, se |1 − ω | > 1, sicuramente il metodo di rilassamento non convergerà. Perciò, condizione necessaria per la convergenza è |1 − ω | < 1. Molto importante è il seguente teorema (che non dimostriamo). Teorema 10.6.2 (Ostrowski-Reich) Se A è definita positiva e ω è un numero reale nell’intervallo ]0, 2[, allora il metodo di rilassamento è convergente.

x

La convergenza del metodo di rilassamento si ha, inoltre, per A simmetrica con elementi diagonali positivi ed elementi extradiagonali negativi o nulli, se e solo se A è definita positiva.

Un altro interessante teorema mette in relazione il metodo di rilassamento con i metodi di Jacobi e di Gauss-Seidel, sia per quanto riguarda la convergenza, sia per quanto riguarda il valore ottimale del parametro ω, in corrispondenza di matrici A che godono della cosidetta proprietà A e che siano coerentemente ordinate.

177

Dalla definizione di Eω si ha det Eω = det [( D + ωL)−1 ((1 − ω ) D − ωU )]. Poichè il determinante del prodotto di due matrici è uguale al prodotto dei determinanti delle matrici stesse, si ha det Eω = det [( D + ωL)−1 ] det [(1 − ω ) D − ωU )]. Consideriamo ora il fatto che il determinante di una matrice triangolare è uguale al prodotto degli elementi della diagonale principale. Per il primo determinante abbiamo det [( D + ωL)−1 ] = (det ( D + ωL))−1 . Ora la matrice D + ωL è triangolare e il suo determinante coincide con il prodotto degli elementi della diagonale, vale a dire con det D. Si ha quindi: det [( D + ωL)−1 ] = (det D )−1 . Per il determinante det [(1 − ω ) D − ωU )] (di una matrice che è sempre triangolare), gli elementi della diagonale principale sono gli elementi della matrice diagonale D ciascuno dei quali moltiplicati per (1 − ω ). Perciò: det [(1 − ω ) D − ωU )] = (1 − ω )n det D. Arriviamo perciò al risultato: det Eω = (det D )−1 (1 − ω )n det D = (1 − ω )n . Inoltre, considerando λi autovalori della matrice Eω , per i = 1, 2, . . . , n e ρ( Eω ) il raggio spettrale, si ha | det Eω | = | ∏in=1 λi | ≤ ∏in=1 ρ( Eω ) = ρ( Eω )n da cui segue |(1 − ω )n | ≤ ρ( Eω )n , cioè ρ( Eω ) ≥ |1 − ω |.

Definizione 10.6.1 Una matrice A, di dimensione n, si dice che ha proprietà A se esiste una matrice di permutazione P tale che la matrice PAP T ! D1 A1 abbia la forma PAP T = dove D1 e D2 sono matrici diagonali. A2 D2 Una matrice con proprietà A può essere anche chiamata matrice biciclica. In modo equivalente, si può dire che una matrice A, di dimensione n, ha proprietà A se l’insieme dei numeri naturali {1, 2, . . . , n} può essere scomposto in due sottoinsiemi non vuoti e complementari S e T in modo tale che i coefficienti non nulli aij 6= 0 si hanno se gli indici i e j sono coincidenti tra loro, cioè i = j, oppure se gli indici i e j non appartengono allo stesso insieme S o T, vale a dire che se l’indice i ∈ S allora j ∈ T, oppure se i ∈ T allora j ∈ S. Esempio La matrice tridiagonale 

2  −1  A=  0 0

 −1 0 0 2 −1 0    −1 2 −1 0 −1 2

ha proprietà A (o biciclica): permutando la prima e quarta riga e la prima e quarta colonna, mediante la matrice di permutazione

Due insiemi S e T non vuoti si dicono complementari di V = {1, 2, . . . , n} se S 6= ∅, T 6= ∅, S ∪ T = V e, inoltre, se i ∈ S, i 6∈ T e, viceversa, se j ∈ T, j 6∈ S

178

annamaria mazzia



0 0  P= 0 1

0 1 0 0

0 0 1 0 

2  0  PAP T =   −1 0

 1 0   si ha 0 0  −1 0 −1 −1   =⇒ D1 = D2 = 2 0  0 2

0 2 −1 −1

2 0

0 2

!

Usando l’altra definizione, basta scegliere come insiemi S e T, gli insiemi S = {1, 3} e T = {2, 4}. _ Definizione 10.6.2 Una matrice si dice coerentemente ordinata in relazione ad un vettore di ordinamento q, di lunghezza n, se per ogni coefficiente aij non nullo, con i 6= j, si verifica:

x se j > i allora q − q = 1 x se j < i allora q − q = −1 j

i

j

i

Un’altra definizione di matrice con coerente ordinamento considera la matrice A data non dalla scomposizione A = L + D + U che abbiamo visto fino ad ora ma come A = D ( L A + I + U A ), (osserviamo che, rispetto alla prima scomposizione, abbiamo messo in evidenza la matrice diagonale D e quindi le matrici triangolari superiore e inferiore sono L A = D −1 L e U A = D −1 U). Sia D non singolare. Allora la matrice A è detta coerentemente ordinata se gli autovalori della matrice J (α) = αL A + α−1 U A , con α 6= 0 sono indipendenti dal parametro α. Le matrici con ! proprietà A (o bicicliche) che sono già nella forma D1 A1 A= (senza dover fare permutazioni di righe o colonne) A2 D2 sono coerentemente ordinate. Le matrici tridiagonali sono un altro esempio di matrici bicicliche e coerentemente ordinate. Fatta questa premessa sulle matrici bicicliche e coerentemente ordinate, possiamo dare il seguente risultato (che non dimostriamo). Teorema 10.6.3 (Young) Se A è una matrice con proprietà A e coerente ordinamento e 0 < ω < 2, allora:

x se µ è autovalore della matrice di iterazione di Jacobi E , ogni λ che J

verifica la relazione (λ + ω − 1)2 = λω 2 µ2 è autovalore di Eω ;

x se λ è autovalore non nullo di E

ω,

allora ogni µ che verifica la relazione

precedente è autovalore di E J ;

x se gli autovalori di E sono reali e il metodo di Jacobi converge (ρ(E ) < J

J

1), esiste uno ed uno solo ωopt che rende ottimale il metodo di rilassamento, tale cioè che ρ(ωopt ) = min0<ω <2 ρ( Eω ). Risulta 2

ωopt = 1+

q

1 − ρ ( E J )2

e

ρ( Eωopt ) = ωopt − 1

Considerando la matrice dell’esempio precedente, si può prendere il vettore di ordinamento q = (q1 , q2 , q3 , q4 ) = (1, 2, 3, 4). Si verifica infatti, per a12 , q2 − q1 = 2 − 1 = 1; per a21 , q1 − q2 = 1 − 2 = −1 e così via per gli altri elementi non nulli. Quindi la matrice è coerentemente ordinata.



 1 5 è bicicli3 ca e coerentemente ordinata.  Infattisi ri2 0 conosce la matrice D1 = , la 0 −3    1 matrice D2 = 3 , mentre A1 = e 5  A2 = 1 2 . 2 La matrice A = 0 1



1 La matrice A = −1 0

0 −3 2

2 3 5

 0 2 è tridiago6

nale (gli elementi non nulli sono sulla diagonale principale e sulle diagonali immediatamente sopra e sotto la diagonale principale). Quindi è biciclica e coerentemente ordinata.

appunti di calcolo numerico

Per ω = 1 il metodo di rilassamento coincide con il metodo di Gauss-Seidel. Allora, per matrici con proprietà A e coerentemente ordinate, nelle ipotesi del teorema di Young, valendo la relazione (λ + ω − 1)2 = λω 2 µ2 , si trova, per ω = 1, λ2 = λµ2 da cui ρ( ES ) = ρ( E J )2 . Come conseguenza, si ha che il metodo di Gauss-Seidel ha velocità doppia rispetto al metodo di Jacobi.

10.7

Esercizi

Esercizio  10.7.1 8 2  A = 7 5 1 0

Sia sistema  dato il   lineare Ax = b, dove 6 30    0 b = 34 5 7

(a) Provare che gli schemi di Jacobi e di Seidel convergono e calcolare la velocità asintontica di convergenza di entrambi gli schemi. (b) A partire dallo stesso vettore iniziale x(0) = (0 0 0) T , calcolare le approssimazioni x(1) e x(2) che si ottengono applicando lo schema di Jacobi e lo schema di Seidel. Svolgimento (a) la matrice A non è diagonalmente dominante nè per righe nè per colonne (vedasi la seconda riga e la terza colonna). Non possiamo usare il criterio di matrice diagonalmente dominante per provare la convergenza dei due metodi. La matrice A è biciclica e coerentemente ordinata!(si veda lo schema a croce che individua 5 0 D1 = (8) e D2 = ): 0 5 8 7 1

2 5 0

6 0 5

Quindi se proviamo che lo schema di Jacobi converge, cioè che l’autovalore di massimo modulo della matrice di Jacobi è reale e in modulo minore di 1, allora, poichè per matrici bicicliche e coerentemente ordinate vale ρ( E J )2 = ρ( ES ), allora anche il metodo di Gauss-Seidel convergerà alla soluzione (da ρ( E J ) < 1 segue ρ( ES ) < 1). La matrice di Jacobi è E J = I − D −1 A cioè 

0  E J = −7/5 −1/5

   −2/8 −6/8 0 −1/4 −3/4    0 0  = −7/5 0 0  0 0 −1/5 0 0

Troviamo gli autovalori della matrice E J imponendo det ( E J − µI ) = 0.

179

180

annamaria mazzia

−µ −7/5 −1/5

−1/4 −3/4 3 1 1 7 −µ 0 = − µ3 + · µ + · µ = 0 4 5 4 5 0 −µ

3 7 + )µ, 20 20 √ √ Una radice è µ = 0, e le altre due sono µ = ± 1/2 = ± 0.5 = 0.707106781. Si ha: 0 = det ( E J − µI ) = −µ3 + (

Gli autovalori sono tutti reali e quello di massimo modulo è µ = 0.707106781 < 1. C’è, dunque, convergenza per i metodi di Jacobi e di Gauss-Seidel (ρ( ES ) = ρ( E J )2 = 0.5). Le velocità di convergenza valgono R J = − log10 (ρ( E J )) = 0.1505149 RS = − log10 (ρ( ES )) = 0.301029995 = − log10 (ρ( E J )2 ) = 2R J Lo schema di Jacobi è:  1 (k) (k) ( k +1)   x1 = (30 − 2x2 − 6x3 )   8        (b) 1 ( k +1) (k) x2 = (34 − 7x1 )  5           x ( k +1) = 1 (7 − x ( k ) ) 3 1 5 Lo schema di Seidel è:    x (k+1) = 1 (30 − 2x (k) − 6x (k) )  2 3 1  8        1 ( k +1) ( k +1) = (34 − 7x1 x2 )  5           x ( k +1) = 1 (7 − x ( k +1) ) 3 1 5

Esercizio  10.7.2 5 0  A = 0 3 2 1

Partendo dal vettore x (0) con componenti tutte nulle, abbiamo k

x(1k)

x(2k)

x(3k)

0 1 2

0 3.75 1.0

0 6.8 1.55

0 1.4 0.65

Partendo dal vettore x (0) con componenti tutte nulle, abbiamo k 0 1 2

(k)

x1 0 3.75 2.875

(k)

x2 0 1.55 2.775

(k)

x3 0 0.65 0.825

Dato  il sistema Ax = b con 10  15 α

(a) dire per quali valori di α il metodo di Jacobi converge. (b) trovare il valore di α in corrispondenza del quale il metodo SOR ha un valore di omega ottimo ωopt = 3/2. Per tale valore trovare la velocità asintotica di convergenza del metodo SOR.

Svolgimento

appunti di calcolo numerico

(a) La matrice dipende dal parametro α quindi a priori non possiamo dire se Jacobi converge o meno. Scriviamo la matrice di iterazione del metodo di Jacobi come     1/5 0 0 0 0 10 0     −1 EJ = −D (L + U) = −  0 1/3 0  0 0 15 =  0 0 0 1/α 2 1 0 −2/α

0 0 −1/α

Gli autovalori si calcolano imponendo det ( E J − µI ) = 0, vale a dire −µ 0 −2 9µ =0 −µ −5 = 0 vale a dire − µ3 + 0 α −2/α −1/α −µ 3 Ricaviamo gli autovalori µ = 0 e µ = ± √ . α 3 Perchè ci sia convergenza deve dunque essere √ < 1 ovvero α √ 3 < α. Ricaviamo la relazione α > 9. (b) Dalla relazione dell’ωopt , ωopt =

2

, valida perchè 1 + 1 − ρ ( E J )2 la matrice è biciclica e coerentemente ordinata e dal momento che gli autovalori della matrice di Jacobi sono reali e, in valore assoluto, minori di uno, si ha:

1+



q

√ 2 3 1 −8 9 81 = =⇒ = 1 − 9/α =⇒ = − =⇒ α = = 10.125 2 3 9 α 8 1 − 9/α

3 = 1.5 segue λopt = ωopt − 1 = 0.5, da cui R = 2 − log10 (λopt ) = 0.3010299957.

Da ωopt =

Esercizio  10.7.3 6 1  A = 1 8 4 3

Dato  il sistemalineare  Ax = b dove: 3 9    b=3 2 10 14

(a) Dall’esame della matrice, dire se il metodo di Gauss–Seidel converge. (b) Partendo dal vettore iniziale x (0) = (0, 0, 0) T , calcolare x (1) , x (2) , x (3) con il metodo di Gauss–Seidel. 1. Stimare la costante asintotica dell’errore M e quindi la velocità di convergenza R.

Svolgimento (a) La matrice è diagonalmente dominante in senso stretto (per righe e per colonne), quindi il metodo di Gauss-Seidel converge.

 −2  −5 0

181

182

annamaria mazzia

(b) Lo schema di Seidel è:  1 (k) (k) ( k +1)   x1 = (9 − x2 − 3x3 )   6        1 ( k +1) ( k +1) (k) x2 = (3 − x1 − 2x3 )  8           x (k+1) = 1 (14 − 4x (k+1) − 3x (k+1) ) 2 3 1 10 Partendo dal vettore iniziale assegnato abbiamo: 

k=1

k=2

k=3

 1.50000000000000   x1 = 0.187500000000000 0.743750000000000   1.09687500000000   x2 = 5.195312499999999E − 002 0.945664062500000   1.01850911458333   x3 = 1.127034505208335E − 002 0.989215250651042

Per stimare M (che è la costante asintotica dell’errore e, in questo caso, il raggio spettrale della matrice di iterazione) basta fare il rapporto tra le norme dei vettori degli scarti d3 e d2 . Ora:



 −0.403125000000000   d2 = x2 − x1 = −0.135546875000000 0.201914062500000

 −7.836588541666667E − 002   d3 = x3 − x2 = −4.068277994791664E − 002 4.355118815104175E − 002 

e

La scelta della norma vettoriale da utilizzare è indifferente (abbiamo studiato norme vettoriali equivalenti e quindi il risultato che otterremo andrà bene qualunque sia la norma vettoriale che applicheremo). Se scegliamo, ad esempio, di usare la norma euclidea dei vettori, abbiamo M = 0.209119. Se invece usiamo la norma infinito abbiamo M = 0.194396. La velocità di convergenza R può essere quindi stimanta applicando la formula R = −log10 ( M ) e abbiamo il valore 0.679607 o 0.711313 a seconda che consideriamo la stima di M ottenuta mediante la norma euclidea o la norma infinito.

10.8

Domande di riepilogo

1. Quale è la definizione di norma di vettori? 2. Quali sono le prinicipali norme che abbiamo studiato?

appunti di calcolo numerico

3. Come si definiscono le norme su matrici? 4. Cosa significa che una norma su matrici è compatibile con una norma su vettori? 5. Cosa significa che una norma su matrici è indotta da una norma su vettori? 6. Definire le norme 1 e infinito. 7. Dare la definizione di norma di Frobenius. 8. Cosa è la traccia di una matrice? 9. Come si definiscono gli autovalori e autovettori di una matrice? 10. Una matrice di dimensione n, quanti autovalori possiede? 11. Che relazione c’è tra gli autovalori di una matrice e la sua traccia e determinante? 12. Cosa è il raggio spettrale di una matrice? 13. Come si definisce la norma 2 su vettori? 14. Che relazione esiste tra il raggio spettrale di una matrice e una norma naturale su matrice? 15. Come si possono definire i metodi iterativi classici per risolvere sistemi lineari? In quale forma possono essere scritti? 16. Che differenza c’è tra un metodo diretto e un metodo iterativo per la soluzione di sistemi lineari? 17. Che cosa significa che una matrice è sparsa? 18. Definire il residuo. 19. Mettere in relazione un metodo iterativo con lo schema di punto fisso. 20. Qual è il teorema generale di convergenza per i metodi iterativi classici? Quale caso particolare abbiamo dimostrato? 21. Come si definisce la velocità asintotica di convergenza e a cosa serve? 22. In un grafico di convergenza in scala semilogaritmica sull’asse delle ordinate, in cui sull’asse delle ascisse si pone il numero delle iterazioni effettuate e sull’asse delle ordinate i logaritmi della norma del vettore degli scarti ad ogni iterazione, cosa rappresenta la pendenza della retta del profilo di convergenza? 23. Che ordine di convergenza hanno i metodi iterativi classici? 24. Come si definisce la costante asintotica di convergenza e in quale modo può essere stimata?

183

184

annamaria mazzia

25. Descrivere il metodo di Jacobi, partendo dal sistema da risolvere e scomponendo la matrice del sistema nelle tre matrici L, D, U. (Queste tre matrici sono le stesse della fattorizzazione LDU?) 26. Come si scrive la matrice di iterazione del metodo di Jacobi? 27. Descrivere il metodo di Gauss-Seidel, partendo dal sistema da risolvere e scomponendo la matrice del sistema nelle tre matrici L, D, U. 28. Come si scrive la matrice di iterazione del metodo di GaussSeidel? 29. Cosa significa effettuare un rilassamento tramite un fattore ω? Quale dei due metodi che abbiamo studiato viene rilassato? Come diventa lo schema iterativo? Quale è la matrice di iterazione che si ricava? 30. Quali sono i teoremi di convergenza per i metodi di Jacobi e di Gauss-Seidel che abbiamo enunciato? 31. Per quali valori di ω è certo che il metodo di rilassamento non può convergere? Per quale motivo? 32. Quale è la condizione necessaria (ma non sufficiente) di convergenza per il metodo di rilassamento? Per quale motivo? 33. Quali teoremi abbiamo visto che assicurano la convergenza del metodo di rilassamento? 34. Cosa significa che una matrice è biciclica o con proprietà A? 35. Cosa significa che una matrice è coerentemente ordinata? 36. Abbiamo studiato alcune matrici che sono sia bicicliche sia coerentemente ordinate: quali sono? 37. Cosa assicura il teorema di Young e sotto quali ipotesi?

11 Differenziazione numerica ed equazioni alle derivate ordinarie

11.1

Un esempio

All’inizio del ’900, van der Pol studiò fenomeni non lineari e propose l’equazione differenziale y00 (t) + e(y2 (t) − 1)y0 (t) + y(t) = 0 Questa equazione governa l’intensità di corrente in un circuito oscillante a triodo e viene utilizzata nello studio di circuiti che contengono valvole termoioniche, i cosiddetti tubi a vuoto, come il tubo catodico del televisore o il magnetron nei forni a microonde. La quantità e indica l’intensità dello smorzamento non lineare: quanto più e è elevato tanto più il sistema perde energia rapidamente. L’equazione differenziale del secondo ordine si può ricondurre ad un sistema di equazioni differenziali del primo ordine. Ponendo u = (u1 , u2 ) = (y, y0 ) si ha ! ! u10 u2 = u20 −e((u1 )2 − 1)u2 − u1 Come si risolve numericamente un sistema di equazioni differenziali come quello appena scritto? In questo Capitolo, daremo una piccola introduzione ad alcune tecniche di differenziazione numerica e ad alcuni metodi numerici che permettono di risolvere equazioni differenziali del primo ordine.

11.2

Differenziazione numerica

Dall’analisi matematica, sappiamo come si calcolano le derivate di una funzione. Tuttavia è utile conoscere anche delle tecniche numeriche di differenziazione, sia perchè, molte volte, la funzione non è nota in maniera esplicita ma solo per punti, sia perchè, a volte, la funzione è troppo complicata!

L’universo è un’equazione differenziale. Jules Henri Poincarè

Balthasar van der Pol (1889-1959) fu un fisico e matematico olandese. Nel 1916 lavorò per un anno con l’ingegnere John Ambrose Fleming a Londra (Fleming aveva già inventato il diodo nel 1904). Si trasferì successivamente a Cambridge e iniziò una collaborazione con John Joseph Thomson al Cavendish Laboratory (Thomson aveva scoperto l’elettrone nel 1897). Qui divenne amico di Edward Appleton che, nel 1947, ricevette il premio Nobel per la fisica per i suoi contributi alla conoscenza della ionosfera – studi fatti insieme a van der Pol. La loro collaborazione riguardò anche lo studio di fenomeni non lineari usando circuiti triodi per verificare le loro teorie. Quando van del Pol rientrò in Olanda, continuò a occuparsi di ottica, elettromagnetismo, onde radio e fisica atomica. Il nome di van der Pol è associato con l’equazione differenziale che porta il suo nome. Questa equazione apparve per la prima volta sul suo articolo On relaxation oscillation pubblicato sulla rivista Philosophical Magazine nel 1926.

186

annamaria mazzia

Dall’analisi, sappiamo che, assegnata una funzione y = f ( x ) e dato un punto x0 nel suo insieme di definizione, la derivata f 0 ( x0 è data da f 0 ( x0 ) = lim

h →0

f ( x0 + h ) − f ( x0 ) h

Per ottenere una formula che approssima la derivata prima di f 0 ( x0 ), useremo nodi equidistanti in un intorno di x0 : x0 − h, x0 , x0 + h, . . . con h una quantità positiva sufficientemente piccola. Consideriamo la f sufficientemente regolare per applicare la formula di Taylor ( f continua e limitata insieme alle sue derivate, fino ad un ordine sufficientemente elevato). La formula di Taylor della funzione f di centro x0 , se ci fermiamo alla derivata seconda, è data da f ( x ) = f ( x0 ) + f 0 ( x0 )( x − x0 ) +

( x − x0 )2 00 f (ξ ) 2

dove ξ è un punto, che non conosciamo, nell’intervallo di estremi x e x0 . Prendiamo come x il valore x = x0 − h: la formula di Taylor si legge come f ( x0 − h ) = f ( x0 ) − h f 0 ( x0 ) +

h2 00 f (ξ ) 2

Portiamo a primo membro f 0 ( x0 ), ottenendo f 0 ( x0 ) =

f ( x0 ) − f ( x0 − h) h 00 + f (ξ ) h 2

h2 00 f (ξ ) abbiamo una formula che appros2 0 sima f ( x0 ) e che si chiama backward difference formula, formula delle differenze all’indietro (stiamo usando infatti il punto x0 − h). Se trascuriamo il termine

La backward difference formula è data da f ( x0 ) − f ( x0 − h ) f 0 ( x0 ) = h Questa formula richiede la conoscenza del valore della f in due punti x0 e x0 − h ed è del primo ordine (trascuriamo, infatti, un termine che h dipende da h: f 00 (ξ )). 2 Se, invece, applichiamo la formula di Taylor a x = x0 + h abbiamo la forward difference formula, formula delle differenze in avanti: f ( x0 + h ) = f ( x0 ) + h f 0 ( x0 ) +

h2 00 f (ξ ) 2

da cui f 0 ( x0 ) =

f ( x0 + h) − f ( x0 ) h 00 − f (ξ ) h 2

La forward formula è f 0 ( x0 ) =

f ( x0 + h ) − f ( x0 ) h

appunti di calcolo numerico

L’errore è sempre del primo ordine. Una formula di grado più elevato si ottiene considerando tre punti x0 − h, x0 , x0 + h. Prendiamo le formule di Taylor di centro x0 − h e x0 + h scritte fino alla derivata terza di f , h2 00 f ( x0 ) + 2 h2 00 f ( x0 − h ) = f ( x0 ) − h f 0 ( x0 ) + f ( x0 ) − 2 f ( x0 + h ) = f ( x0 ) + h f 0 ( x0 ) +

h3 000 f (ξ 1 ) 6 h3 000 f (ξ 2 ) 6

Sottraendo membro a membro abbiamo f ( x0 + h) − f ( x0 − h) = 2h f 0 ( x0 ) +

h3 000 ( f (ξ 1 ) + f 000 (ξ 2 )) 6

Ora le due derivate terze nei due punti ξ 1 e ξ 2 (che non conosciamo) sono comprese tra un valore minimo e un valore massimo, da cui f 000 (ξ 1 ) + f 000 (ξ 2 ) anche il loro valore medio è compreso tra il minimo 2 000 e il massimo della funzione f stessa (si veda il Teorema del Valore Intermedio), cioè esiste ξ (compreso tra ξ 1 e ξ 2 e, quindi, tra x0 − h e f 000 (ξ 1 ) + f 000 (ξ 2 ) . Sostituendo abbiamo x0 + h) per cui f 000 (ξ ) = 2 f ( x0 + h) − f ( x0 − h) = 2h f 0 ( x0 ) +

h3 000 2 f (ξ ) 6

Risolviamo ora per f 0 ( x0 ), ottenendo f 0 ( x0 ) =

f ( x0 + h) − f ( x0 − h) h2 000 − f (ξ ) 2h 6

Se trascuriamo il termine che dipende da h2 otteniamo un’approssimazione di f 0 ( x0 ). La formula centrata è data da f 0 ( x0 ) =

f ( x0 + h ) − f ( x0 − h ) 2h

Il termine che trascuriamo per ottenere le formule di differenziazione numerica, cioè l’errore di discretizzazione, prende il nome di errore di troncamento. La formula centrata valuta il valore della f in soli due punti, come è stato fatto per le formule backward e forward ma ha un ordine di accuratezza più elevato. Formule più accurate si possono ottenere usando più punti nell’intorno di x0 e considerando espansioni di Taylor che coinvolgono derivate di ordine più elevato. Ad esempio, prendendo i punti x0 − 2h, x0 − h, x0 + h e x0 + 2h si può ricavare f 0 ( x0 ) =

1 h4 ( f ( x0 − 2h) − 8 f ( x0 − h) + 8 f ( x0 + h) − f ( x0 + 2h)) + f (v) (ξ ) 12h 30

Da questa, otteniamo la formula detta a 5 punti perchè, oltre al punto in cui vogliamo approssimare la derivata, ne consideriamo altri quattro.

187

188

annamaria mazzia

La formula a 5 punti è data da f 0 ( x0 ) ≈

1 ( f ( x0 − 2h) − 8 f ( x0 − h) + 8 f ( x0 + h) − f ( x0 + 2h)) 12h

L’errore di troncamento dipende da h4 . Nell’applicare queste formule, dobbiamo ricordarci che, oltre all’errore di troncamento dovuto al tipo di approssimazione fatto, c’è anche l’errore di arrotondamento. Nell’esempio di pag. 41, avevamo visto come, per piccoli valori di h, il fenomeno di cancellazione numerica portava a crescite degli errori. La scelta di h dovrebbe, perciò, dipendere, dall’ordine dell’errore di troncamento (che conosciamo) e da una maggiorazione sul termine d’errore d’arrotondamento (valore che in genere non conosciamo). Per evitare che domini l’errore di arrotondamento (che può portare al fenomeno di cancellazione numerica) è importante non prendere h troppo vicino alla precisione di macchina. Esempio Riprendiamo l’esempio di pag. 41 per confrontare le diverse formule che abbiamo introdotto. Dobbiamo derivare f ( x ) = sin ( x ) in x0 = 1.2. Per confrontare le diverse formule, partiamo da h = 1 e lo riduciamo fino ad arrivare a h = 10−12 . In Figura 11.1, in un grafico semilogaritmico, confrontiamo gli errori assoluti ottenuti dalle varie formule: da un certo punto in poi, prevale l’errore di arrotondamento.

Altre tecniche di differenziazione numerica sono basate sull’interpolazione polinomiale di Lagrange (se p( x ) approssima f ( x ) allora p0 ( x ) approssima f 0 ( x )) o su un procedimento di estrapolazione di Richardson (simile a quello che abbiamo visto per le formule di integrazione numerica). Il discorso si estende, inoltre, per approssimare derivate di ordine superiore.

Figura 11.1: Grafico semilogaritmico che mette a confronto l’errore esatto al variare di h ∈ [10−12 , 1] delle formule forward, backward, centrata e a 5 punti.

_

11.3

Sulle equazioni differenziali ordinarie

Passiamo ora a studiare le equazioni differenziali ordinarie. Vogliamo trovare una funzione y(t) che soddisfi la seguente equazione differenziale ordinaria del primo ordine: dy = f (t, y), dt

a≤t≤b

La funzione f (t, y) è assegnata. Ci riferiamo a t come alla variabile indipendente. Dobbiamo trovare quella funzione y = y(t) tale che la dy(t) sua derivata prima y0 = y0 (t) = coincida con f (t, y(t)). dt Esempio Sia f (t, y) = −y + t definita per t ≥ 0 e per qualunque y reale. Si ha y0 = −y + t,

t≥0

Si verifica che, per qualunque scalare α la funzione y(t) = t − 1 + soddisfa la ODE. Se, inoltre, è assegnato un valore iniziale, per esempio y(0) = 1, allora, dovendo essere −1 + α = y(0) = 1, risulta α = 2. Assegnare αe−t

Una abbreviazione per indicare un’equazione differenziale ordinaria è data dalla sigla ODE: Ordinary Differential Equation.

appunti di calcolo numerico

un valore iniziale determina un’unica soluzione all’ODE. Si parla di problema a 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 ordinarie di ordine più elevato possono essere trasformati in sistemi equivalenti di equazioni del primo ordine. Esempio La seconda legge del moto di Newton dice che la forza F è uguale al prodotto della massa m per l’accelerazione a: F = ma. Questa equazione è una ODE del secondo ordine in quanto l’accelerazione a è data da a = y00 , dove y è la coordinata della F posizione. L’ODE può essere riscritta come: y00 = . Definendo m u1 = y e u2 = y0 si ha il sistema (equivalente all’equazione di prima) di due equazioni del primo ordine di ODE: ! ! u2 u10 = u20 F/m Per risolvere il sistema, possiamo usare metodi che vanno bene per risolvere equazioni differenziali del primo ordine. La prima componente della soluzione u1 corrisponde alla posizione y dell’equazione da cui siamo partiti. La seconda componente u2 fornisce la velocità y0 . _ Sistemi del primo ordine di ODE hanno la forma y0 (t) = f(t, y) n +1

n

n

dove y : R −→ R con y = (y1 y2 . . . yn ), f : R −→ R e y0 (t) = dy denota la derivata rispetto a t (per cui la i-sima componente del dt dy (t) vettore derivata è data da yi0 (t) = i ). La funzione f è assegnata e dt noi vogliamo determinare il vettore di funzioni y che soddisfa l’ODE. Per semplicità noi studieremo il caso di una singola equazione scalare, n = 1. Ma l’approccio è del tutto simile nel caso di sistemi di equazioni del primo ordine. Sia data l’ODE y0 = f (t, y(t))

a≤t≤b

con valore iniziale y( a) = y a . Per risolvere questa ODE discretizziamo l’intervallo [ a, b] in n + 1 punti, equidistanti per semplicità: ti = a + ih, h = 0, 1, . . . , n, con h = (b − a)/n. Il passo di discretizzazione (temporale se t assume il significato della variabile temporale) è dunque h. Nelle applicazioni pratiche,

189

190

annamaria mazzia

il passo h è variabile (cioè i punti non sono equidistanti), tuttavia, per capire meglio come funzionano i metodi, noi useremo sempre un passo h costante. Sia y(t) la soluzione esatta del nostro problema a valori iniziali. Allora y(ti ) è il valore esatto della soluzione calcolata nel punto ti . Indichiamo invece con yi il valore approssimato al tempo ti che ricaviamo applicando un metodo numerico che risolve il problema proposto.

11.4

Metodo di Eulero esplicito

Con il metodo di Eulero esplicito applichiamo la formula di Taylor (del secondo ordine) alla funzione y(t), di centro ti , in modo da poter successivamente approssimare la derivata prima y0 (ti ): y ( t ) = y ( ti ) + ( t − ti ) y 0 ( ti ) +

(t − ti )2 00 y (ξ i ) 2

(t − ti )2 00 y (ξ i ) è il resto della formula di Taylor con ξ i un 2 punto opportuno nel segmento di estremi t e ti . Prendiamo come t il valore ti + h vale a dire ti+1 , da cui si ha t − ti = ti+1 − ti = h. Sostituendo si ottiene: La quantità

h2 00 y (ξ i ) 2 Esplicitando y0 (ti ) rispetto agli altri termini si ha: y(ti+1 ) = y(ti ) + hy0 (ti ) +

y(ti+1 ) − y(ti ) h 00 − y (ξ i ) h 2 Ora si sostituisce il valore trovato per y0 (ti ) nella ODE y0 = f (t, y(t)) per t = ti : y 0 ( ti ) =

y(ti+1 ) − y(ti ) h 00 − y (ξ i ) = f (ti , y(ti )) h 2 h Trascurando il termine y00 (ξ i ) non abbiamo più i valori della so2 luzione esatta, ma otterremo i valori della soluzione approssimata. Scriviamo dunque: y i +1 − y i = f ( ti , yi ) h La formula di Eulero esplicito è: yi+1 = yi + h f (ti , yi ). La formula è di tipo esplicito perchè per passare dal livello i al livello i + 1 sfruttiamo i dati che già conosciamo del livello i. Si parte infatti da y0 = y(t0 ) = y( a) = y a e si ricava: y1 = y0 + f ( t0 , y0 ) y2 = y1 + f ( t1 , y1 ) .. .=

.. .

Leonhard Euler (1707-1783) fu un matematico svizzero. Fu studente di Johann Bernoulli che comprese le sue grandi potenzialità e favorì i suoi studi. Eulero è noto soprattutto per i suoi contributi nel campo della geometria, della teoria dei numeri, delle equazioni differenziali, del calcolo delle variazioni. È lui che introdusse il simbolo f ( x ) per indicare le funzioni, e per la base naturale, i per la radice quadrata di −1, di π , il simbolo di sommatoria ∑ e altri ancora.

appunti di calcolo numerico

191

Si arriva alla stessa formula integrando l’ODE e approssimando l’integrale della f mediante il valore in f (t0 , y(t0 )): da y0 = f (t, y(t)) integrando ambo i membri da t0 a t, otteniamo Z t dy t0

dt

dt =

Z t t0

f (t, y(t)) dt =⇒

Z y(t) y0

dy =

Z t t0

f (t, y(t)) dt

Rt Al secondo membro, approssimiamo t f (t, y(t)) dt mediante il valo0 re (t − t0 ) f (t0 , y(t0 )) (approssimiamo la f mediante la retta f (t0 , y(t0 ))). Abbiamo: y(t) = y0 + (t − t0 ) f (t0 , y0 )) + errore della formula di quadratura. Per t = t1 , numericamente: y1 = y0 + h f (t0 , y0 )). Ai passi successivi: yi+1 = yi + h f (ti , yi )) Esempio Supponiamo di applicare il metodo di Eulero esplicito alla ODE y0 = −y con passo h a partire dal punto iniziale t0 = 0 e avanziamo al tempo t1 = t0 + h y1 = y0 + h f (t0 , y0 ) = y0 − hy0 = (1 − h)y0 Il valore y1 che otteniamo è affetto da errore: y1 6= y(t1 ) Per esempio, se per t0 si ha y0 = 1, la soluzione esatta è y(t) = e−t . Per h = 0.5, si ha y1 = 0.5 mentre y(0.5) = e−0.5 ≈ 0.60653 _ Figura 11.2: Interpretazione geometrica del metodo di Eulero esplicito. Si è considerato il problema y0 = −y con y(0) = 1 la cui soluzione esatta è y(t) = e−t . I valori numerici ottenuti dal metodo di Eulero esplicito sono cerchiati e si trovano sulla linea spezzata che li interpola. La linea spezzata è tangente, all’inizio di ogni passo, alla traiettoria che passa per il corrispondente punto, soluzione del problema y0 = −y con y(ti ) = yi .

Da un punto di vista geometrico (si veda la Figura 11.2), il valore in ti+1 è approssimato utilizzando il valore della retta la cui pendenza è data da f (ti , yi ): è come se ad ogni passo cercassimo di risolvere il

192

annamaria mazzia

problema a valori iniziali: y0 (t) = f (t, y(t)) y ( ti ) = yi per cui il valore che otteniamo per il tempo ti+1 è tangente alla traiettoria della soluzione di questo IVP.

11.5

Metodo di Eulero implicito

Se applichiamo la formula di Taylor di punto iniziale ti+1 , abbiamo y ( t ) = y ( t i +1 ) + ( t − t i +1 ) y 0 ( t i +1 ) +

(t − ti+1 )2 00 y (ξ i ) 2

Per t = ti , si ha t − ti+1 = ti − ti+1 = ti − (ti + h) = −h. Sostituendo, abbiamo: y(ti ) = y(ti+1 ) − hy0 (ti+1 ) +

h2 00 y (ξ i ) 2

Otteniamo quindi y 0 ( t i +1 ) =

y(ti+1 ) − y(ti ) h 00 + y (ξ i ) h 2

Andando a sostituire nella ODE al tempo ti+1 , si ha : y(ti+1 ) − y(ti ) h 00 + y (ξ i ) = f (ti+1 , y(ti+1 )) h 2 Trascurando il termine del resto di Taylor

h 00 y (ξ i ) abbiamo: 2

y i +1 − y i = f (ti+1 , yi+1 )) h La formula di Eulero implicito vale yi+1 = yi + h f (ti+1 , yi+1 )). La differenza rispetto alla formula esplicita è che la f è valutata non più al tempo ti ma al tempo ti+1 Quindi il calcolo di yi+1 dipende implicitamente da yi+1 stesso! La valutazione di yi+1 diventa quindi più laboriosa e complicata (se si ha un’equazione non lineare in yi+1 , la si risolve tramite un metodo di punto fisso o di Newton-Raphson). In termini di accuratezza si hanno risultati migliori. Esempio Consideriamo sempre y0 = −y con y(0) = 1 (soluzione esatta y(t) = e−t ). Il metodo di Eulero implicito diventa: yi+1 = yi − hyi+1 ovvero (1 + h ) y i +1 = y i yi La soluzione numerica è yi+1 = . (1 + h ) Per h = 0.5 ricaviamo y1 = 0.66667 contro un valore esatto y(1) ≈ 0.60653. _

appunti di calcolo numerico

Esempio Si abbia l’equazione y0 = −y3 con condizione iniziale y(0) = 1. Usando il metodo di Eulero implicito con passo h = 0.5, per ricavare y1 otteniamo l’equazione implicita y1 = y0 + h f (t1 , y1 ) = 1 − 0.5y31 Questa equazione non lineare in y1 può essere risolta mediante metodo di punto fisso (x = g( x ) = 1 − 0.5x3 ) oppure utilizzando il metodo di Newton-Raphson per F ( x ) = 0 con F ( x ) = x − 1 + 0.5x3 ) . L’approssimazione iniziale per ottenere y1 può essere o la soluzione al passo precedente, y0 , oppure usare il metodo di Eulero esplicito, che dà y1 = y0 − 0.5y30 = 0.5. Otteniamo, come y1 il valore finale y1 ≈ 0.7709. _ Esempio Vogliamo discretizzare il problema a valori iniziali y 0 = − y2 y (0) = 1 con passo h = 0.1 applicando il metodo di Eulero esplicito per ricavare y1 e y2 . Il metodo di Eulero esplicito è: yi+1 = yi + h f (ti , yi ) = yi + h(−y2i ) = yi − hy2i Partendo da y0 = 1 si ricava: y1 = 1 − 0.1(12 ) = 0.9 y2 = 0.9 − 0.1(0.92 ) = 0.819 Per confronto, calcoliamo la soluzione esatta y(t) =

1 , ottenendo: t+1

y(t1 ) = y(0.1) = 1/(0.1 + 1) = 0.9090909090 y(t2 ) = y(0.2) = 1/(0.2 + 1) = 0.8333333333 Applichiamo ora il metodo di Eulero implicito con lo stesso passo h = 0.1. yi+1 = yi + h f (ti+1 , yi+1 ) = yi − hy2i+1 Per ricavare y1 la formula diventa: y1 = y0 + h f (t1 , y1 ) = 1 − 0.1(y21 ) Abbiamo un’equazione non lineare in y1 . Per trovare y1 , possiamo pensare di applicare lo schema di punto fisso alla funzione g(y) = 1 − 0.1(y2 ) partendo da y(0) = y0 = 1, in quanto y1 = g(y1 ) è punto fisso per la funzione g. Applichiamo tre passi dello schema di punto fisso: y(1) = g(y(0) ) = 1 − 0.1(12 ) = 0.9 y(2) = g(y(1) ) = 1 − 0.1(0.92 ) = 0.919 y(3) = g(y(2) ) = 1 − 0.1(0.9192 ) = 0.9155439

193

194

annamaria mazzia

Se prendiamo y(3) come approssimazione di y1 ricaviamo y1 = 0.9155439 (per confronto, il valore esatto è 0.90909090). Calcoliamo ora y2 : y2 = y1 + h f (t2 , y2 ) = 0.9155439 − 0.1(y22 ) La funzione di punto fisso diventa g(y) = 0.9155439 − 0.1(y2 ). Applichiamo lo schema di punto fisso partendo da y(0) = y1 = 0.9155439. y(1) = g(y(0) ) = 0.9155439 − 0.1(0.91554392 ) = 0.8317218367 y(2) = g(y(1) ) = 0.9155439 − 0.1(0.83172183672 ) = 0.8463677786 y(3) = g(y(2) ) = 0.9155439 − 0.1(0.84636777862 ) = 0.8439100583 Troviamo quindi y2 = 0.8439100583 (valore esatto 0.8333333333). Vediamo, adesso, cosa accade in Eulero implicito se il punto iniziale del metodo di punto fisso è dato da un passo del metodo di Eulero esplicito. Per ricavare y1 , considero come y(0) = y0 + h f (t0 , y0 ) = 1 − 0.1 = 0.9. In tal caso, l’approssimazione iniziale è quella che, nel caso di prima, era il valore y(1) . Applichiamo tre volte lo schema di punto fisso: y(1) = g(y(0) ) = 1 − 0.1(0.92 ) = 0.919 y(2) = g(y(1) ) = 1 − 0.1(0.9192 ) = 0.9155439 y(3) = g(y(2) ) = 1 − 0.1(0.91554392 ) = 0.9161779367 Quindi y1 = 0.9161779367. Al secondo passo, lo schema di punto fisso è dato dalla funzione g(y) = y1 − h(y2 ) = 0.9161779367 − 0.1y2 . Come approssimazione iniziale prendiamo y(0) = y1 + h f (t1 , y1 ) = g(y1 ) = 0.8322397355. Si ha: y(1) = g(y(0) ) = 0.9161779367 − 0.1(0.83223973552 ) = 0.8469156390 y(2) = g(y(1) ) = 0.9161779367 − 0.1(0.84691563902 ) = 0.8444513267 y(3) = g(y(2) ) = 0.9161779367 − 0.1(0.844451326722 ) = 0.8448681324 Ricaviamo y2 = 0.8448681324. _

11.6

Metodo di Crank-Nicolson Partiamo dall’ODE y0 = f (t, y(t)). Integriamo ambo i membri dell’equazione sull’intervallo [ti , ti+1 ]: Z y(t ) i +1 y ( ti )

dy =

Z t i +1 ti

f (t, y(t)) dt =⇒ y(ti+1 ) − y(ti ) =

Z t i +1 ti

f (t, y(t)) dt

A secondo membro, applichiamo la formula dei trapezi trascurando l’errore di integrazione: y i +1 − y i =

h [ f (ti , yi ) + f (ti+1 , yi+1 )] 2

John Crank (1916-2006) è stato un matematico inglese che si è dedicato soprattutto allo studio di soluzioni numeriche di equazioni alle derivate parziali, in particolare di problemi di 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 mondiale lavorò sulla teoria del magnetron. È nota, appunto, per il metodo di Crank-Nicolson.

appunti di calcolo numerico

h Si ha la formula di Crank-Nicolson: yi+1 = yi + [ f (ti , yi ) + f (ti+1 , yi+1 )] 2 La stessa formula la si può ricavare prendendo la media aritmetica delle formule di Eulero esplicito e implicito: 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 dividendo per 2:

y i +1 − y i =

h h [ f (ti , yi ) + f (ti+1 , yi+1 )] =⇒ yi+1 = yi + [ f (ti , yi ) + f (ti+1 , yi+1 )] 2 2

Esempio Lo stesso esempio di prima (y0 = −y con y(0) = 1) h risolto con Crank-Nicolson dà yi+1 = yi + [−yi − yi+1 )] da cui 2 ricaviamo   h h 2−h (1 + )yi+1 = (1 − )yi =⇒ (2 + h)yi+1 = (2 − h)yi =⇒ yi+1 = yi 2 2 2+h Per h = 0.5, confrontiamo i valori ottenuti dai metodi di Eulero esplicito, implicito e Crank-Nicolson, con la soluzione esatta: y ( ti ) yi Eul. Espl. yi Eul. Impl. yi C-N ti 0.0 1.000000 1.0000000 1.000000 1.000000 0.5 0.606531 0.5000000 0.666667 0.600000 1.0 0.367879 0.2500000 0.444444 0.360000 1.5 0.223130 0.1250000 0.296296 0.216000 2.0 0.135335 0.0625000 0.197531 0.129600 2.5 0.082085 0.0312500 0.131687 0.077760 3.0 0.049787 0.0156250 0.087791 0.046656 3.5 0.030197 0.0078125 0.058528 0.027994 4.0 0.018316 0.0039062 0.039018 0.016796 _

11.7

Studio dell’errore

Nel costruire i metodi (di Eulero esplicito, implicito, Crank-Nicolson) abbiamo trascurato un termine (il resto della formula di Taylor o l’errore della formula dei trapezi): questo termine che abbiamo trascurato rappresenta l’errore di troncamento locale. Nel caso di Eulero esplicito avevamo (usando la formula di Taylor): y 0 ( t i +1 ) =

y(ti+1 ) − y(ti ) h 00 − y (ξ i ) = f (ti , y(ti )) h 2

Per costruire il metodo, abbiamo trascurato il termine del resto, vale a dire la quantità di =

y ( t i +1 ) − y ( t i ) h − f (ti , y(ti )) = y00 (ξ i ) = O(h) h 2

195

196

annamaria mazzia

Questa quantità ci dice di quanto la soluzione esatta “fallisce” nel soddisfare la relazione della formula di Eulero esplicito e rappresenta l’errore di troncamento locale. Definizione 11.7.1 Si definisce errore totale di troncamento ε i la quantità: ε i = y ( ti ) − yi . Ci aspettiamo che sia dello stesso ordine di grandezza dell’errore di troncamento locale. Definizione 11.7.2 Per effetto dell’arrotondamento, al tempo ti al posto di yi otteniamo il valore arrotondato yi . Si definisce errore totale di arrotondamento la quantità: εi = yi − yi Definizione 11.7.3 L’errore globale dello schema numerico è dato dal contributo dell’errore totale di troncamento e dell’errore totale di arrotondamento ei = y ( t i ) − y i = ε i + ε i Gli errori di arrotondamento nell’approssimare la derivata prima 1 di una funzione si comportano come O( ) (si veda l’esempio fatto h sulla propagazione degli errori a pag. 41). Tuttavia questo aspetto diventa secondario nella risoluzione delle ODE sia perchè il passo h nelle applicazioni non è mai troppo (esageratamente) piccolo per ragioni di efficienza sia perchè è la y e non la y0 la funzione che dobbiamo approssimare. Inoltre, nell’eseguire i calcoli in doppia precisione (come si fa nei moderni linguaggi di programmazione), l’aspetto dovuto all’arrotondamento si vede poco rispetto ad altri fenomeni che influenzano la propagazione degli errori.

11.8

Errori di troncamento locale

x Nel metodo di Eulero esplicito: di =

y ( t i +1 ) − y ( t i ) h − f (ti , y(ti )) = y00 (ξ i ) = O(h) h 2

x Nel metodo di Eulero implicito: di =

y ( t i +1 ) − y ( t i ) h − f (ti+1 , y(ti+1 )) = − y00 (ξ i ) = O(h) h 2

x

Nel metodo di Crank-Nicolson (derivando la formula dai trapezi e includendo il termine dell’errore): y ( t i +1 ) − y ( t i ) =

h f 00 (ξ i , τi ) 3 [ f (ti , y(ti )) + f (ti+1 , y(ti+1 ))] − h 2 12

dove ξ i e τi sono opportuni punti. Ma f = y0 da cui f 0 = y00 e f 00 = y000 .

appunti di calcolo numerico

Perciò y ( t i +1 ) − y ( t i ) =

di =

11.9

h y000 (ξ i ) 3 [ f (ti , y(ti )) + f (ti+1 , y(ti+1 ))] − h 2 12

y000 (ξ i ) 2 y ( t i +1 ) − y ( t i ) 1 − [ f (ti , y(ti )) + f (ti+1 , y(ti+1 ))] = − h = O(h2 ) h 2 12

Convergenza e stabilità

Definizione 11.9.1 Un metodo si dice convergente se lim

h → 0 ei i →+∞

= 0

cioè se l’errore va a zero al tendere del passo h a zero e di i all’infinito in modo che il prodotto ih si mantenga costante (così t0 + ih tende ad un valore di t fissato: studiamo l’errore fissato t).

Esempio Vediamo come, fissato un certo istante t, possiamo fare tendere h a zero e far crescere i all’infinito in modo che t0 + ih sia sempre uguale a t. Sia t0 = 0 e t = 0.5: h i ih 1 0.5 0.5 0.25 2 0.5 4 0.5 0.125 0.0625 8 0.5 .. .. .. . . . 2.4414e-4 2048 0.5 _ Definizione 11.9.2 Un metodo si dice stabile se l’errore iniziale si mantiene limitato al crescere di i (per i → ∞):

| e i | ≤ M | e0 | con M costante positiva. Studieremo la convergenza e la stabilità dei metodi di Eulero esplicito, implicito e Crank-Nicolson applicati all’equazione test y0 = −λy prendendo λ > 0 (in modo che −λ < 0) con condizione iniziale y (0) = y0 . La soluzione esatta di questo IVP è y(t) = y0 e−λt : tende a zero per valori di t crescenti. Ci aspettiamo che anche la soluzione numerica si comporti in maniera simile.

197

198

11.9.1

annamaria mazzia

Convergenza di Eulero esplicito Per semplicità, applichiamo la formula del metodo di Eulero esplicito all’equazione test con λ = 1. y1 = y0 + h f (t0 , y0 ) = y0 − hy0 = (1 − h)y0 y2 = y1 + h f (t1 , y1 ) = y1 − hy1 = (1 − h)y1 .. . yi = yi−1 + h f (ti−1 , yi−1 ) = yi−1 − hyi−1 = (1 − h)yi−1 Andando a ritroso troviamo una formula che lega yi direttamente a y0 . y1 = (1 − h ) y0 y2 = (1 − h ) y1 = (1 − h )2 y0 .. . y i = (1 − h ) y i −1 = (1 − h ) i y 0 La soluzione numerica al tempo ti è data da yi = (1 − h)i y0 . Fissato un tempo t = ih, vediamo se lim ei = 0 cioè se lim yi = y(t). h →0 i →+∞

h →0 i →+∞

 ih 1 t Osserviamo che: (1 − h)i = (1 − h) h = (1 − h) h  

ln (1 − h) 1 (1/h) ln ( 1 − h ) h Perciò: (1 − h) h = e =e Quando facciamo il limite per h → 0 e per i → +∞ consideriamo che, per il teorema dell’ Hôpital, facendo la derivata rispetto alla variabile λ, vale

−1 ln (1 − h) = lim = −1 h h →0 h →0 1 − h lim

Di conseguenza limh→0 e Allora

ln (1 − h) h = e −1

 1 t lim yi = lim y0 (1 − h)i = lim y0 (1 − h) h  = y0 e−t = y(t) 

h →0 i →+∞

h →0 i →+∞

h →0 i →+∞

In questo modo abbiamo provato che il metodo converge. Il discorso si ripete in maniera del tutto simile, per λ 6= 1.

11.9.2

Stabilità di Eulero esplicito Per quanto riguarda la stabilità, dobbiamo provare che l’errore si mantiene limitato. Sia λ > 0. Abbiamo yi+1 = yi − hλyi = (1 − hλ)yi , vale a dire yi+1 = y0 (1 − hλ)i+1 . La soluzione esatta di questo problema è y(t) = y0 e−λt e

Ricordiamo la proprietà per la quale α) = eα ln (x) .

x α = eln ( x

appunti di calcolo numerico

tende a zero per valori di t crescenti. 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 di t crescente) tende a zero se |1 − hλ| < 1 cioè per −1 < 1 − hλ < 1 ⇐⇒ 2 0 < hλ < 2 ⇐⇒ h < . λ Il metodo di Eulero esplicito è stabile sotto condizione.

11.9.3

Convergenza di Eulero implicito Il metodo di Eulero implicito applicato all’equazione test diventa: y i +1 =

yi (1 + hλ)

Quindi y0 (1 + hλ) y0 y1 = y2 = (1 + hλ) (1 + hλ)2 y2 y0 y3 = = (1 + hλ) (1 + hλ)3 .. . y0 y i −1 = yi = (1 + hλ) (1 + hλ)i y1 =

In tal caso   1 −ih y0 lim yi = lim = lim y0 (1 + hλ)−i = y0 (1 + hλ) h  = y0 e−tλ = y(t) h →0 h→0 (1 + hλ )i h →0

i →+∞

i →+∞

i →+∞

(i passaggi sono del tutto simili a quelli visti per Eulero esplicito). Abbiamo provato la convergenza.

11.9.4

Stabilità di Eulero implicito y0 , si osser(1 + λh)i va che, per i → +∞, qualunque sia il valore di h, la soluzione 1 tende a zero in quanto limi→+∞ = 0 Si parla di metodo (1 + λh)i incondizionatamente stabile. Per la stabilità, dalla soluzione numerica yi =

11.9.5

Convergenza di Crank-Nicolson Il metodo di Crank-Nicolson applicato all’equazione test diventa: hλ y i +1 = y i + [−yi − yi+1 ] da cui 2   2 − hλ y i +1 = yi 2 + hλ

199

200

annamaria mazzia

Andando a ritroso si ricava  y i +1 = y 0

2 − hλ 2 + hλ

 i +1

Per verificare che il metodo converge studiamo il limite lim yi . h →0 i →+∞

Partiamo dalla relazione ih 1  2 − hλ h  =  = 2 + hλ 



2 − hλ 2 + hλ

i



Ma 

2 − hλ 2 + hλ

t 1  2 − hλ h    2 + hλ 



1 2 − hλ 1 h = e h ln ( 2 + hλ )

Nel fare il limite per h → 0 e i → +∞ della quantità che si trova all’esponente, applichiamo l’Hôpital e ricordiamo che la derivata 2 − hλ −λ(2 + hλ) − (2 − hλ)λ di , rispetto alla variabile λ, vale = 2 + hλ (2 + hλ)2 −4λ : (2 + hλ)2 ln ( lim

h →0 i →+∞

2 − hλ ) −4λ 2 + hλ = lim 2 + hλ −4λ = lim = −λ h h→0 (2 + hλ )(2 − hλ ) h→0 2 − hλ (2 + hλ )2 i →+∞

i →+∞

Quindi ih 1  2 − hλ h  −tλ = lim y0  = y(t)  = y0 e 2 + hλ h →0 

 lim yi = lim y0

h →0 i →+∞

h →0 i →+∞

2 − hλ 2 + hλ

i



i →+∞

La convergenza è provata.

11.9.6

Stabilità di Crank-Nicolson  2 − λh i . 2 + λh Per i → +∞, qualunque sia il valore di h, la soluzione tende a zero in   2 − λh i quanto limi→+∞ = 0. Il metodo è incondizionatamente 2 + λh stabile. 

Per la stabilità, si vede che la soluzione numerica è yi = y0

11.9.7

Sulla stabilità La stabilità di questi metodi la si può verificare anche considerando direttamente l’errore ei , dimostrando che gli errori al passo i e al passo i + 1 verificano la stessa relazione che hanno yi e yi+1 e mostrando che l’errore rimane limitato sotto condizione per Eulero esplicito mentre è incondizionatamente stabile per gli altri metodi. In Figura 11.3 si

appunti di calcolo numerico

201

vede come il metodo di Eulero esplicito sia stabile sotto condizione mentre i metodi di Eulero implicito e Crank-Nicolson sono stabili qualunque passo di discretizzazione venga utilizzato. Esempio Consideriamo il metodo di Eulero esplicito e applichiamolo all’equazione test. Sappiamo che yi+1 = yi + hλyi . Per la soluzione esatta, sappiamo che vale y(ti+1 ) = y(ti ) + hλy(ti ) + hdi (con di l’errore di troncamento locale). Sottraendo la prima equazione dalla seconda abbiamo ei+1 = ei + hλei + hdi h 00 y (ξ i ) e che, per studiare la stabilità, h è fis2 sato mentre i tende a +∞, il termine hdi non influisce sull’andamento dell’errore e possiamo trascurarlo. Si ha allora la relazione: Considerato che di =

ei+1 = ei + hλei Ricaviamo ei = e0 (1 + hλ)i . Il ragionamento da fare è lo stesso che abbiamo fatto in precedenza e troviamo gli stessi risultati. Dobbiamo infatti verificare quando ei tende a zero per i che tende a +∞. . . _ Figura 11.3: Confronto dei metodi di Eulero esplicito, implicito e Crank-Nicolson sull’equazione test y0 = −y, prendendo come h il valore h = 2 (a sinistra) e h = 0.5 (a destra).

11.10

Esercizi

Esercizio 11.10.1 Studiare la stabilità del metodo di Eulero esplicito applicato all’equazione differenziale y0 = −2y + 1, con y(0) = 1 e−2t + 1 (soluzione esatta y(t) = ) 2

Svolgimento Per provare la stabilità del metodo dobbiamo verificare che l’errore iniziale si mantiene limitato per valori crescenti del tempo. Il metodo di Eulero esplicito applicato all’ODE del problema diventa yi+1 = yi + h(−2yi + 1) = (1 − 2h)yi + h

202

annamaria mazzia

La soluzione esatta soddisfa un’equazione del tipo

y(ti+1 ) = y(ti ) + h(−2y(ti ) + 1) + hdi = (1 − 2h)y(ti ) + h + hdi Nel calcolare l’errore ei+1 = y(ti+1 ) − yi+1 abbiamo ei+1 = (1 − 2h)ei + hdi Il termine hdi (di errore locale di troncamento) si può trascurare. Abbiamo allora ei+1 = (1 − 2h)ei . Possiamo trovare con facilità che ei+1 = (1 − 2h)i+1 e0 o, ancora, ei = (1 − 2h)i e0 . Se vogliamo che l’errore rimanga limitato per i → ∞ la quantità (1 − 2h)i non deve crescere. Quindi deve essere |1 − 2h| < 1, vale a dire −1 < 1 − 2h < 1 cioè 2h < 2, quindi h < 1: stabilità sotto condizione.

11.11

Domande di riepilogo

1. A cosa servono le formule di differenziazione numerica? 2. Ricavare la formula delle differenze all’indietro e il corrispondente errore di discretizzazione. 3. Ricavare la formula delle differenze in avanti e il corrispondente errore di discretizzazione. 4. Ricavare la formula delle differenze centrali e il corrispondente errore di discretizzazione. 5. Ricavare il metodo di Eulero esplicito per la soluzione di un problema a valori iniziali. 6. Ricavare il metodo di Eulero implicito per la soluzione di un problema a valori iniziali. 7. Scrivere la formula del metodo di Crank-Nicolson. 8. Quali errori vanno considerati nelle formule numeriche per risolvere equazioni alle derivate ordinarie? 9. Cosa significa che un metodo per risolvere equazioni alle derivate ordinarie è un metodo convergente? 10. Cosa significa che un metodo per risolvere equazioni alle derivate ordinarie è un metodo stabile? 11. Per studiare convergenza e stabilità di un metodo numerico per risolvere equazioni alle derivate ordinarie, si prende in esame la cosiddetta equazione test: di che cosa si tratta? 12. Dimostrare la convergenza del metodo di Eulero esplicito.

appunti di calcolo numerico

13. Per quale motivo il metodo di Eulero esplicito è stabile sotto condizione? Dimostrare. 14. I metodi di Eulero implicito e di Crank-Nicolson sono stabili sotto condizione oppure no?

203

Bibliografia Uri M. Ascher and Chen Greif. A First Course on Numerical Methods. SIAM, Philadelphia, 2011. Ake Björk and Germund Dahlquist. Numerical Methods in Scientific Computing, Volume II. Siam, 2008. Richard L. Burden and J. Douglas Faires. Numerical Analysis. BrooksCole Publishing, 2004. Germund Dahlquist and Ake Björk. Numerical Methods in Scientific Computing, Volume I. Siam, 2006. G. Gambolati. Lezioni di Metodi Numerici. Cortina, Padova, 1994. Walter Gautschi. Numerical Analysis: An Introduction. Birkäuser, Boston, 1997. Paolo Giangrandi. Dispense del corso di Storia dell’Informatica. Università degli Studi di Udine, Italia, 2010. Paolo Giangrandi. Museo on line - Breve storia degli Strumenti di Calcolo. Tecnoteca, http://www.tecnoteca.it/museo/, ultima visita: febbraio 2015. Michael T. Heath. Scientific Computing, An Introductory Survey. McGraw-Hill, 2002. Autar K. Kaw, Egwu E. Kalu, and Duc Nguyen. Numerical Methods With Applications. Dedicated Website for book, http://http://nm. mathforcollege.com/topics/textbook_index.html, ultima visita: febbraio 2015. H. Jerome Keisler. Elementary Calculus, An Infinitesimal Approach. Creative Commons Attribution Non-Commercial-ShareAlike License, http://www.math.wisc.edu/~keisler/calc.html, 2009. Richard B. Langley. The mathematics of gps. GPS World, 2(8):55–59, 1991. J. O’Connor and E. F. Robertson. The MacTutor History of Mathematics archive. University of St Andrews Scotland, http://www-history. mcs.st-and.ac.uk/, ultima visita: febbraio 2015. Gilbert Strang. Calculus. Wellesley-Cambridge Press, 1991.

206

annamaria mazzia

Doron Swade. The Babbage Engine. Computer History Museum, Mountain View, CA, http://www.computerhistory.org/babbage, ultima visita: febbraio 2015.

Related Documents


More Documents from "a_damiani4144"