Lezione 6
Lezione 6
Ricerca di zeri

In questa settima lezione affronteremo il problema della ricerca di zeri di una funzione. Per fare questo realizzeremo due classi astratte per rappresentare rispettivamente una generica funzione di una variabile, ed un metodo generico per la ricerca di zeri.

ESERCIZIO 6.0 - Metodi virtual :
Considerare le classi Particella e la sue derivata Elettrone costruite nella lezione 5.
Implementare ed eseguite il seguente programma:
Programma da eseguire

Si dovrebbe vedere che viene invocato il metodo Print() della classe madre, anche quando gli oggetti riferiti dai puntatori sono classi figlie.
Aggiungere ora negli header file delle classi il qualificatore virtual davanti alla dichiarazione del metodo Print().
Ricompilando e rigirando il programma si dovrebbe adesso vedere che per ciascun oggetto viene invocato il metodo corrispondente alla sua vera classe.

Brevi Richiami

Parola chiave virtual


ESERCIZIO 6.1 - Classe astratta FunzioneBase :
In questo e nei prossimi esercizi avremo a che fare con diverse funzioni di una sola variabile, magari dipendenti da parametri, e di effettuare delle operazioni generiche su queste funzioni (come trovarne gli zeri, o farne l'integrale).
In questo caso è utile definire una classe astratta che definisce le proprietà generali della classe, con metodi puramente virtuali, e poi lasciare alle classi derivate il compito di implementare tutti questi metodi e quelli aggiuntivi necessari. Notate in questo caso che è buona prassi definire il distruttore di una classe madre astratta come virtual in modo che il distruttore della classe figlia venga invocato correttamente quando un oggetto di tipo classe figlia viene distrutto.
  1. Definire la classe astratta FunzioneBase:
    FunzioneBase
  2. Implementare una classe derivata Parabola che descriva una funzione del tipo y=ax2+bx+c (chiaramente questa classe dovrà avere i data membri per i parameteri a, b e c, ed i metodi per definirli e accederci).
  3. Verificare il funzionamento della classe Parabola costruendo un programmino che, dati i parametri di una parabola, ne stampi il valore della y nel vertice xv=-b/2a.


Brevi Richiami

Classi astratte

Classe Parabola


ESERCIZIO 6.2 - Metodo della bisezione (da consegnare):
Scrivere un programma che calcoli gli zeri della funzione ƒ(x) = 3x2+5x-2.
Il programma legge da riga di comando gli estremi dell'intervallo in cui cercare lo zero e la precisione richiesta.
Per calcolare gli zeri, implementare una classe astratta Solutore ed una classe concreta che realizza uno dei due metodi visti a lezione: quello della bisezione o quello della secante.
Si richiede obbligatoriamente che il programma stampi l'ascissa dello zero con un numero di cifre significative corrispondente alla precisione immessa.


Brevi Richiami

Il metodo della bisezione

Precisione sulle cifre significative

La funzione segno

Classe astratta Solutore


ESERCIZIO 6.3 - Equazioni non risolubili analiticamente (da consegnare):
In problemi di meccanica quantistica che verranno studiati nel prossimo anno, ci si può imbattere in equazioni del tipo:
x = tanx
È facile rendersi conto che tale equazione ha una soluzione in ciascuno degli intervalli (nπ,nπ+π/2), n=1,2,3... Calcolare con una precisione di almeno 10-6 i valori delle soluzioni per n da 1 a 20.
Suggerimento: riscrivere l'equazione come sinx-xcosx=0.


ESERCIZIO 6.4 - Miglioramenti di Solutore:
Aggiungere a Solutore due nuovi metodi virtuali:
Nuovi metodi di Solutore
Il primo dovrà restituire vero o falso a seconda che lo zero sia stato effettivamente trovato o meno. Ad esempio se un algoritmo non riesce a convergere per via delle cattive condizioni iniziali Trovato() dovrà restituire false.
Il secondo dovrà restituire l'incertezza effettiva sull'ascissa dello zero stimato, che di solito è migliore del minimo requisito sulla precisione immagazzinato in _prec.
Implementare questi metodi nelle classi concrete usate per gli altri esercizi di questa lezione.


ESERCIZIO 6.5 - Ricerca di zeri di una funzione senza uso del polimorfismo :
Si provi ad implementare un algoritmo di ricerca degli zeri di una funzione senza utilizzare il polimorfismo. Prendere come spunto le soluzioni indicate nelle trasparenze finali della lezione teorica. Si potrebbe codificare il metodo della bisezione in una funzione che accetti in input una std::function e modellizzare la funzione di cui si vuole cercare lo zero con una funzione lambda.

Back to Home Page