www.unlock-pdf.com esercitazione 1 - studio di funzione
TRANSCRIPT
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
1/34
Esercitazioneperilcorsodi
CalcoloNumerico
Prof.G.Zilli
Metodiperlarisoluzionedi
equazioninonlineari
EmanueleDeVillaBais
615803
Laureainingegneriaaerospaziale
a.a.20092010
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
2/34
1
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
3/34
2
Indice
1. Testodellaesercitazione 4
2. Introduzione 5
3. Approssimazionedellaradice 7 3.1 MetododiNewton-Raphson 7
3.2 Metododellatangentefissa 8
3.3 Metododellasecantevariabile 10
3.4 Metododellasecantefissa 11
3.5 Metododellabisezione 13
3.6 Metododelpuntofisso 14
3.7 Confrontodeimetodi 16
4. CodiceMatlab 17
4.1 Programmaprincipale(stimaRadice) 17
4.2 MetododiNewton-Raphson(newton) 22
4.3 Metododellatangentefissa(tanfis) 23
4.4 Metododellasecantevariabile(secvar) 24 4.5 Metododellasecantefissa(secfis) 25
4.6 Metododellabisezione(bisez) 27
4.7 Metododelpuntofisso(puntfis) 28
4.8 Altrefunzioni 29
5. Uscitadelprogramma 30
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
4/34
3
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
5/34
4
1. TestodellaesercitazioneDopoaverdimostratoesistenzaedunicitdellasoluzione inI,si risolva,utilizzandoil linguaggio
MatLab,l'equazionef(x)=0con:
f(x)=
3x
2
1+
log(x), I=
[0.2,1].
Siapplichino,ascelta,almeno3traisuguentiimetodi:
1. Newton-Raphson(edellatangentefissa);2. secantevariabile(edellasecantefissa);3. bisezione;4. puntofisso.
Siprendax0=1comepuntoiniziale.Peri2metodidellesecantisiprendax1ottenutoconilmetodo
diNewton-Raphson.Contuttiimetodi,calcolarel'approssimazionexkdellaradiceusandoiltestdi
arrestosulloscarto:sn=|xn+1-xn|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
6/34
5
2. IntroduzioneConsideriamolafunzione:
f(x) = 3x21+ log(x), I= [0.2,1].
OsservochelafunzionecontinuanellintervalloIpoichcompostadifunzionicontinue,inoltre
poichnegliestremidellintervallolafunzionevale:
f(0.2) = -2.49
f(1) = 2
perilteoremadituttiivalorihoalmenounozeroin I.Questozerounicoperchlafunzione
strettamentecrescentein Idatoche:
f ' (x) = 6x +1
x> 0, x I.
Ilgraficodellafunzionenellintervallo I,riportatoinFigura2.1,confermavisivamentequanto
appenatrovateed,inoltre,mostrachelaradicecompresatra 0.6e0.8.
Inseguitosonoriportatiivaloridixeyin24puntidellintervallo I
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
7/34
6
xf(x)
0.200000-2.489438
0.234783-2.283727
0.269565-2.092949
0.304348-1.911701
0.339130-1.736342
0.373913-1.564299
0.408696-1.393688
0.443478-1.223088
0.478261-1.051399
0.513043-0.877754
0.547826-0.701457
0.582609-0.521941
0.617391-0.338736
0.652174-0.151452
0.6869570.040244
0.7217390.236631
0.7565220.4379510.7913040.644415
0.8260870.856204
0.8608701.073477
0.8956521.296375
0.9304351.525023
0.9652171.759532
1.0000002.000000
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
8/34
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
9/34
8
3.2 Metododellatangentefissa
Ilmetododellatangentefissacrealasuccessione:
xn+1
= xn f(xn )
f' (x0),
n = 0, 1, 2...
a partire dalla stima iniziale
x0 della radice. Linterpretazione geometrica del metodo della
tangente fissa suggerisce che la successione
xn monotona decrescente. Lapplicazione del
metododellatangentefissafornisceirisultatidella Tabella3.2.
nx_nf(x_n)s_n
01.0000000000000002.000e+002.857e-01
10.7142857142857141.941e-012.773e-02
20.6865514273890363.798e-025.426e-03
30.6811250783592697.785e-031.112e-03
40.6800129646343021.609e-032.299e-04
50.6797830387975673.333e-044.762e-05
60.6797354177695526.907e-059.867e-06
70.6797255511312741.431e-052.044e-06
80.6797235066993162.965e-064.236e-07
90.6797230830729776.145e-07NaN
Tabella3.2.:processodiconvergenzadelmetododellatangentefissa.
Utilizzandogliscartipossibilestimarelacostanteasintoticacome:
M =
sn+1
sn
, n = 0,1,2,...
Applicandolarelazionepern=0,1,.,8siottengonoivalori:0.097,0.196,0.205,0.207,,0.207
dicuilultimoinottimoaccordoconlastima:
M = 1f' ()
f' (x0)
= 1f' (x
9)
f' (x0)
= 0.207
dovesiutilizzata
x9comemiglioreapprossimazionenotadellaradice
pervalutarela
derivataprimadellafunzione.Possoquindiaffermarechelordinediconvergenzadelmetodo
lineare(p=1).
DiconseguenzalavelocitdiconvergenzaRrisulta:
R = logM = 0.683588
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
10/34
9
Possoorafacilmenteapprossimareilnumerodiiterazioninecessarieperavere
|en|/|e0|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
11/34
10
3.3 Metododellasecantevariabile
Ilmetododellasecantevariabilecrealasuccessione:
xn+1
= xn
f(xn)
hn
con
hn =f(xn ) f(xn1
)
xn x
n1
,
n = 0, 1, 2...
apartiredallastimainiziale
x0dellaradice.Laprimaiterazionepertrovare
x1,necessarioperil
calcolo di
hn, effettuata tramite ilmetododiNewton-Raphson. Lapplicazionedelmetodo
dellasecantevariabilefornisceirisultatidellaTabella3.3.
n x_n f(x_n) h_n s_n
01.0000000000000002.000e+007.000e+002.857e-01
10.7142857142857141.941e-016.321e+003.072e-02
20.6835698370595822.138e-025.625e+003.801e-0330.6797692350481112.567e-045.557e+004.620e-05
40.6797230339007633.416e-075.550e+006.155e-08
50.6797229723512165.461e-124.166e+03NaN
Tabella3.3.:processodiconvergenzadelmetododellasecantevariabile.
Utilizzandogliscartipossibilestimarelacostanteasintoticacome:
M =
sn+1
sn
1.6181 ,n =
0,1,2,...
Applicandolarelazionepern=0,1,.,5siottengonoivalori:0.233,1.065,0.318,0.637;
considerandochepossoscartareiprimiduevalori(poichhoutilizzatoilmetododiNewton
Raphsonperlaprimaiterazione)ecalcolandounastimapiprecisadiM:
M=1
2
f' ' ()
f' ()
0.618
=
1
2
f' ' (x5)
f' (x5)
0.618
= 0.519
dovesiutilizzata
x5 comemiglioreapprossimazionenotadellaradice
pervalutareladerivataprimaesecondadellafunzione.Osservocomeilvaloreesattodi Mstianellintervallo[0.318,0.637].Effettuandoinoltreunulterioreiterazioneutilizzandogliscartiottengounvalore
diMparia0.458.
Possoquindiaffermareche,per
n,Mvale0.519echequindiilmetodohaordinedi
convergenzasuperlineare(p=1.6181).
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
12/34
11
3.4 Metododellasecantefissa
Ilmetododellasecantefissacrealasuccessione:
xn+1
= xn
f(xn)
hn
con
hn =f(x
1) f(x
0)
x1 x
0
,
n = 0, 1, 2...
apartiredallastimainiziale
x0dellaradice.Laprimaiterazionepertrovare
x1,necessarioperil
calcolo di
hn, effettuata tramite ilmetododiNewton-Raphson. Lapplicazionedelmetodo
dellasecantefissafornisceirisultatidellaTabella3.4.
n x_n f(x_n) s_n
01.0000000000000002.000e+002.857e-01
10.7142857142857141.941e-013.072e-02
20.6835698370595822.138e-023.382e-0330.6801877185078572.580e-034.081e-04
40.6797795971760043.142e-044.972e-05
50.6797298785518823.833e-056.064e-06
60.6797238147637904.675e-067.397e-07
70.6797230751087885.703e-07NaN
Tabella3.4.:processodiconvergenzadelmetododellasecantefissa.
Utilizzandogliscartipossibilestimarelacostanteasintoticacome:
M =
sn+1
sn
, n = 0,1,2,...
Applicandolarelazionepern=0,1,.,7siottengonoivalori:0.108,0.110,0.121,0.122,,0.122
dicuilultimoinottimoaccordoconlastima:
M = 1f' ()
hn
= 1f' (x
7)
hn
= 0.122
dovesiutilizzata
x7comemiglioreapprossimazionenotadellaradice
pervalutarela
derivataprimadellafunzione.Possoquindiaffermarechelordinediconvergenzadelmetodo
lineare(p=1).
DiconseguenzalavelocitdiconvergenzaRrisulta:
R = logM = 0.913707
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
13/34
12
Possoorafacilmenteapprossimareilnumerodiiterazioninecessarieperavere
|en|/|e0|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
14/34
13
3.5 Metododibisezione
Ilmetododibisezioneadogniiterazionesupponecomeradiceilpuntomediodellintervallo
dato,perpoivalutareinqualedeidueintervallicosottenutisitrovalaveraradice,equindi
ripeteloperazioneperilnuovointervallo.Lapplicazionedelmetododellatangentefissa
fornisceirisultatidellaTabella3.5.
n x_n low_x up_x f(x_n)s_n
00.6000000000000000.2000000000000001.000000000000000-4.308e-012.000e-01
10.8000000000000000.6000000000000001.0000000000000006.969e-011.000e-01
20.7000000000000000.6000000000000000.8000000000000001.133e-015.000e-02
30.6500000000000000.6000000000000000.700000000000000-1.633e-012.500e-02
40.6750000000000000.6500000000000000.700000000000000-2.617e-021.250e-02
50.6875000000000000.6750000000000000.7000000000000004.328e-026.250e-03
60.6812500000000000.6750000000000000.6875000000000008.479e-033.125e-03
70.6781250000000000.6750000000000000.681250000000000-8.863e-031.563e-03
80.6796875000000000.6781250000000000.681250000000000-1.969e-047.813e-04
90.6804687500000000.6796875000000000.6812500000000004.140e-033.906e-04
100.6800781250000000.6796875000000000.6804687500000001.971e-031.953e-04
110.6798828125000000.6796875000000000.6800781250000008.871e-049.766e-05
120.6797851562500000.6796875000000000.6798828125000003.451e-044.883e-05
130.6797363281250000.6796875000000000.6797851562500007.412e-052.441e-05
140.6797119140625000.6796875000000000.679736328125000-6.137e-051.221e-05
150.6797241210937500.6797119140625000.6797363281250006.375e-066.104e-06
160.6797180175781250.6797119140625000.679724121093750-2.750e-053.052e-06
170.6797210693359370.6797180175781250.679724121093750-1.056e-051.526e-06
180.6797225952148440.6797210693359370.679724121093750-2.093e-067.629e-07
190.6797233581542970.6797225952148440.6797241210937502.141e-063.815e-07
200.6797229766845700.6797225952148440.6797233581542972.405e-08NaN
Tabella3.5.:processodiconvergenzadelmetododibisezione.
Utilizzandogliscartipossibilestimarelacostanteasintoticacome:
M =
sn+1
sn
, n = 0,1,2,...
Applicandolarelazionepern=0,1,.,20siottengonoivalori: 0.500,0.500,,0.500;risultato
perfettamenteinaccordocolmetododibisezione,chedimezzalintervalloadogniiterazione.Possoquindiaffermarechelordinediconvergenzadelmetodolineare( p=1).
LavelocitdiconvergenzaRrisultaquindi:
R = logM = 0.301030
Possoorafacilmenteapprossimareilnumerodiiterazioninecessarieperavere
|en|/|e0|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
15/34
14
3.6 Metododipuntofisso
Ilmetododipuntofissocrealasuccessione:
xn+1
= g(xn),
n = 0, 1, 2...
apartiredallastimainiziale
x0dellaradice.
dettafunzionedipuntofisso.
3.6.1 Metododipuntofissocon
g(x)= exp(3x2 +1)
Utilizzandolafunzionedipuntofissoconsigliata:
g(x) = exp(3x2+1)
nonsiottieneconvergenza,poichilvaloredi
oscillatra:
x1= 0.000000000641528e
x2= 2.718281828459046
3.6.2 Metododipuntofissocon
g(x) =1 log(x)
3
Utilizzandolafunzionedipuntofissoconsigliata:
g(x) =1 log(x)
3
siottengonoirisultatidellaTabella3.6.
n x_n g(x_n) s_n
01.0000000000000005.774e-014.226e-01
10.5773502691896267.186e-011.413e-01
20.7186343864891836.659e-015.270e-0230.6659335686060506.847e-011.880e-02
40.6847299614335956.779e-016.809e-03
50.6779210217837766.804e-012.453e-03
60.6803735456525496.795e-018.852e-04
70.6794883613910066.798e-013.193e-04
80.6798076134057716.797e-011.152e-04
90.6796924408151866.797e-014.155e-05
100.6797339862147366.797e-011.499e-05
110.6797189993157536.797e-015.406e-06
120.6797244055541916.797e-011.950e-06
130.6797224553478316.797e-017.035e-07
140.6797231588496676.797e-01NaN
Tabella3.6.:processodiconvergenzadelmetododipuntofisso.
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
16/34
15
Utilizzandogliscartipossibilestimarelacostanteasintoticacome:
M =
sn+1
sn
, n = 0,1,2,...
Applicandolarelazionepern=0,1,.,14siottengonoivalori:0.334,0.373,,0.361dicuilultimoinottimoaccordoconlastima:
M= g' () = g' (x14) = 0.361
dovesiutilizzata
x14comemiglioreapprossimazionenotadellaradice
pervalutare
laderivataprimadellafunzionedipuntofisso.Possoquindiaffermarechelordinedi
convergenzadelmetodolineare(p=1).
DiconseguenzalavelocitdiconvergenzaRrisulta:
R = logM = 0.442815
Possoorafacilmenteapprossimareilnumerodiiterazioninecessarieperavere
|en|/|e0|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
17/34
16
3.7 Confrontodeimetodi
LaFigura3.7riportainungraficosemilogaritmicoilprocessodiconvergenzadeivarimetodi.
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
18/34
17
4. CodiceMatlab
4.1 Programmaprincipale(stimaRadice)% programma per l'approssimazione della radice f(x)=0%
% metodi disponibili:% (1) metodo di Newton-Raphson% (2) metodo della tangente fissa% (3) metodo della secante variabile% (4) metodo della secante fissa% (5) metodo di bisezione% (6) metodo del punto fisso%
% Emanuele De Villa Bais $ 29-Mar-2010 / 08-Apr-2010 $
% PARAMETRI D'INGRESSO
% la mia funzione (nome del file Matlab che la contiene)fname = 'fEs1';
% nome della derivata della funzionedfname = strcat('d', fname);
% nome della funzione di punto fisso ggname = 'g1Es1'; % oppure g2Es1 (ne ho due da utilizzare)
% intervallo che contiene la radiceI = [0.2 1.0];
% stima iniziale della radicex0 = 1.0;
% imposto i parametri per il test d'arrestotoll = 1e-6; % tolleranza sugli scartinmaxiter = 50; % numero massimo di iterazioni da eseguire
% scelgo i metodi da utilizzare nella stima della radice
metodo = [1 1 1 1 1 1]; % dove 1 indica che il metodo viene utilizzato% scelgo se creare il grafico della funzionegraficofunz = 0; % dove 1 indica che il grafico viene realizzato
% scelgo se creare il grafico degli scartigraficoscar = 1; % dove 1 indica che il grafico viene realizzato
%%%%%%%%%%%% CODICE %%%%%%%%%%%
% imposto la eventuale creazione del grafico di f con tabellaif graficofunz == 1 % allore creo il grafico
npunti = 24; % il numero di punti nell'intervallo Ia = I(1); % estremo inferiore dell'intervallob = I(2); % estremo superiore dell'intervallox = linspace(a, b, npunti); % creo il vettore delle x
y = feval(fname, x); % creo il vettore delle yfigure(1);plot(x, y, 'k', 'lineWidth', 2); % creo il grafico% k indica il colore della linea (nero in questo caso)% mentre con (lineWidth, n) indico lo spessore della lineatitle('Grafico della funzione', 'fontSize', 14)xlabel('x', 'fontSize', 18) % assegno il nome dell'asse xylabel('y', 'fontSize', 18) % assegno il nome dell'asse xgrid on% inserisco la griglia
% creo la tabella tabgrafico coi valori di x e f(x)tabgraficfunz = zeros(24, 2); % creo la matrice vuotatabgraficfunz(:, 1) = x; % imposto la colonna di xtabgraficfunz(:, 2) = y; % imposto la colonna di y
% stampo la tabelladisp(' ')
disp('valori di x e y nell''intervallo I'), disp(' ')disp(' x f(x)'), disp(' ')tabgraficfunz = sprintf('%10.6f %15.6f \n', tabgraficfunz');disp(tabgraficfunz), disp(' ')
end
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
19/34
18
%%%%%%%%%%%% METODO DI NEWTON-RAPHSON %%%%%%%%%%%if metodo(1)
% imposto i parametri d'ingresso del metodomoltradice = 1; % la molteplicit della radiceparconv = [toll nmaxiter moltradice];
% chiamo la function newton.m[nwx, nwconv, nwconvstory] = newton(x0, fname, dfname, parconv);
% stampo i risultatiif graficofunz == 1 % metto uno spazio tra le due tabelle
disp(['\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ...'\\\\\\\\\\\\\\\'])
disp(['///////////////////////////////////////////////////////' ...'///////////////']), disp(' ')
enddisp(' ')disp('--------------- METODO DI NEWTON-RAPHSON ---------------')disp(' ')disp(['funzione usata : ', fname])disp(['numero massimo di iterazioni : ', int2str(nmaxiter)])disp(['criterio d''arresto : ', '|s_n| < ', ...
num2str(toll)])disp(['molteplicit della radice : r = ', int2str(moltradice)])if nwconv == -1 % ovvero non c' stata convergenza
messaggio = 'convergenza : no';else
messaggio = ['convergenza : s (', ...int2str(nwconv), ' iterazioni (n))'];
enddisp(messaggio), disp(' '), disp(' ')if nwconv > 0 % se il metodo converge stampo la convstory
disp('sintesi del processo di convergenza:'), disp(' ')disp([' n x_n f(x_n) f''(x_n)'...
' s_n']), disp(' ')% calcolo gli scarti (ovvero prendo la colonna della matrice% nwconvstory che contiene x_n escluso il primo valore e le% sottraggo la stessa colonna con incluso il primo valore ed% escluso l'ultimo); cos facendo faccio |x_(n+1) - x_n|nwscar = abs(nwconvstory(2:length(nwconvstory), 2) - ...
nwconvstory(1:length(nwconvstory)-1, 2));% ora posso creare la mia tabellanwtabp = [nwconvstory [nwscar; NaN]]; % p di provvisoria (n.d.t)nwtab = sprintf('%3i %20.15f %13.3e %13.3e %13.3e \n', nwtabp');disp(nwtab), disp(' ')disp('stima costante di errore M usando il rapporto degli scarti:')disp(' ')% calcolo la costante M (nwM) per ogni iterazione (vale come per% nwscar la stringa che segue...)nwM = abs(nwscar(2:length(nwscar)))./ ...
((abs(nwscar(1:length(nwscar)-1))).^2);% creo la tabella per la costante MtabnwM = sprintf('%10.3f %10.3f %10.3f %10.3f %10.3f %10.3f \n', nwM);disp(tabnwM), disp(' ')
endend
%%%%%%%%%%%% METODO DELLA TANGENTE FISSA %%%%%%%%%%%
if metodo(2)
% imposto i parametri d'ingresso del metodoparconv = [toll nmaxiter];
% chiamo la function tanfis.m[tfx, tfconv, tfconvstory] = tanfis(x0, fname, dfname, parconv);
% stampo i risultatiif (graficofunz == 1 || metodo(1))
disp(['\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ...'\\\\\\\\\\\\\\\'])
disp(['///////////////////////////////////////////////////////' ...'///////////////']), disp(' ')
enddisp(' ')disp('--------------- METODO DELLA TANGENTE FISSA ---------------')
disp(' ')disp(['funzione usata : ', fname])disp(['numero massimo di iterazioni : ', int2str(nmaxiter)])disp(['criterio d''arresto : ', '|s_n| < ', ...
num2str(toll)])
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
20/34
19
if tfconv == -1 % ovvero non c' stata convergenzamessaggio = 'convergenza : no';
elsemessaggio = ['convergenza : s (', ...
int2str(tfconv), ' iterazioni (n))'];enddisp(messaggio), disp(' '), disp(' ')if tfconv > 0 % se il metodo converge stampo la convstory
disp('sintesi del processo di convergenza:'), disp(' ')disp([' n x_n f(x_n) '...
' s_n']), disp(' ')% calcolo gli scartitfscar = abs(tfconvstory(2:length(tfconvstory), 2) - ...
tfconvstory(1:length(tfconvstory)-1, 2));% ora posso creare la mia tabellatftabp = [tfconvstory [tfscar; NaN]]; % p di provvisoria (n.d.t)tftab = sprintf('%3i %20.15f %13.3e %13.3e \n', tftabp');disp(tftab), disp(' ')disp('stima costante di errore M usando il rapporto degli scarti:')disp(' ')% calcolo la costante M (tfM) per ogni iterazionetfM = abs(tfscar(2:length(tfscar)))./ ...
abs(tfscar(1:length(tfscar)-1));% creo la tabella per la costante MtabtfM = sprintf('%10.3f %10.3f %10.3f %10.3f %10.3f %10.3f \n', tfM);disp(tabtfM), disp(' ')
end
end
%%%%%%%%%%%% METODO DELLA SECANTE VARIABILE %%%%%%%%%%%if metodo(3)
% imposto i parametri d'ingresso del metodoparconv = [toll nmaxiter];
% chiamo la function secvar.m[svx, svconv, svconvstory] = secvar(x0, fname, dfname, parconv);
% stampo i risultatiif (graficofunz == 1 || metodo(1) || metodo(2))disp(['\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ...
'\\\\\\\\\\\\\\\'])disp(['///////////////////////////////////////////////////////' ...
'///////////////']), disp(' ')enddisp(' ')disp('--------------- METODO DELLA SECANTE VARIABILE ---------------')disp(' ')disp(['funzione usata : ', fname])disp(['numero massimo di iterazioni : ', int2str(nmaxiter)])disp(['criterio d''arresto : ', '|s_n| < ', ...
num2str(toll)])if svconv == -1 % ovvero non c' stata convergenza
messaggio = 'convergenza : no';else
messaggio = ['convergenza : s (', ...int2str(svconv), ' iterazioni (n))'];
enddisp(messaggio), disp(' '), disp(' ')if svconv > 0 % se il metodo converge stampo la convstory
disp('sintesi del processo di convergenza:'), disp(' ')disp([' n x_n f(x_n) h_n'...' s_n']), disp(' ')
% calcolo gli scartisvscar = abs(svconvstory(2:length(svconvstory), 2) - ...
svconvstory(1:length(svconvstory)-1, 2));% ora posso creare la mia tabellasvtabp = [svconvstory [svscar; NaN]]; % p di provvisoria (n.d.t)svtab = sprintf('%3i %20.15f %13.3e %13.3e %13.3e \n', svtabp');disp(svtab), disp(' ')disp('stima costante di errore M usando il rapporto degli scarti:')disp(' ')% calcolo la costante M (svM) per ogni iterazionesvM = abs(svscar(2:length(svscar)))./ ...
((abs(svscar(1:length(svscar)-1))).^1.6181);% creo la tabella per la costante MtabsvM = sprintf('%10.3f %10.3f %10.3f %10.3f %10.3f %10.3f \n', svM);
disp(tabsvM), disp(' ')endend
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
21/34
20
%%%%%%%%%%%% METODO DELLA SECANTE FISSA %%%%%%%%%%%if metodo(4)
% imposto i parametri d'ingresso del metodoparconv = [toll nmaxiter];
% chiamo la function secfis.m[sfx, sfconv, sfconvstory] = secfis(x0, fname, dfname, parconv);
% stampo i risultati
if (graficofunz == 1 || metodo(1) || metodo(2) || metodo(3))disp(['\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ...
'\\\\\\\\\\\\\\\'])disp(['///////////////////////////////////////////////////////' ...
'///////////////']), disp(' ')enddisp(' ')disp('--------------- METODO DELLA SECANTE FISSA ---------------')disp(' ')disp(['funzione usata : ', fname])disp(['numero massimo di iterazioni : ', int2str(nmaxiter)])disp(['criterio d''arresto : ', '|s_n| < ', ...
num2str(toll)])if sfconv == -1 % ovvero non c' stata convergenza
messaggio = 'convergenza : no';else
messaggio = ['convergenza : s (', ...
int2str(sfconv), ' iterazioni (n))'];enddisp(messaggio), disp(' '), disp(' ')if sfconv > 0 % se il metodo converge stampo la convstory
disp('sintesi del processo di convergenza:'), disp(' ')disp([' n x_n f(x_n) '...
' s_n']), disp(' ')% calcolo gli scartisfscar = abs(sfconvstory(2:length(sfconvstory), 2) - ...
sfconvstory(1:length(sfconvstory)-1, 2));% ora posso creare la mia tabellasftabp = [sfconvstory [sfscar; NaN]]; % p di provvisoria (n.d.t)sftab = sprintf('%3i %20.15f %13.3e %13.3e \n', sftabp');disp(sftab), disp(' ')disp('stima costante di errore M usando il rapporto degli scarti:')disp(' ')% calcolo la costante M (sfM) per ogni iterazionesfM = abs(sfscar(2:length(sfscar)))./ ...
abs(sfscar(1:length(sfscar)-1));% creo la tabella per la costante MtabsfM = sprintf('%10.3f %10.3f %10.3f %10.3f %10.3f %10.3f \n', sfM);disp(tabsfM), disp(' ')
endend
%%%%%%%%%%%% METODO DI BISEZIONE %%%%%%%%%%%if metodo(5)
% imposto i parametri d'ingresso del metodoparconv = [toll nmaxiter];
% chiamo la function bisez.m[bx, bconv, bconvstory] = bisez(I, fname, parconv);
% stampo i risultatiif (graficofunz == 1 || metodo(1) || metodo(2) || metodo(3) ||...
metodo(4))disp(['\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ...
'\\\\\\\\\\\\\\\'])disp(['///////////////////////////////////////////////////////' ...
'///////////////']), disp(' ')enddisp(' ')disp('--------------- METODO DI BISEZIONE ---------------')disp(' ')disp(['funzione usata : ', fname])disp(['numero massimo di iterazioni : ', int2str(nmaxiter)])disp(['criterio d''arresto : ', '|s_n| < ', ...
num2str(toll)])if bconv == -1 % ovvero non c' stata convergenza
messaggio = 'convergenza : no';elsemessaggio = ['convergenza : s (', ...
int2str(bconv), ' iterazioni (n))'];end
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
22/34
21
disp(messaggio), disp(' '), disp(' ')if bconv > 0 % se il metodo converge stampo la convstory
disp('sintesi del processo di convergenza:'), disp(' ')disp([' n x_n low_x'...
' up_x f(x_n)'...' s_n']), disp(' ')
% calcolo gli scartibscar = abs(bconvstory(2:length(bconvstory), 2) - ...
bconvstory(1:length(bconvstory)-1, 2));% ora posso creare la mia tabella
btabp = [bconvstory [bscar; NaN]]; % p di provvisoria (n.d.t)btab = sprintf('%3i %20.15f %20.15f %20.15f %13.3e %13.3e \n', btabp');disp(btab), disp(' ')disp('stima costante di errore M usando il rapporto degli scarti:')disp(' ')% calcolo la costante M (svM) per ogni iterazionebM = abs(bscar(2:length(bscar)))./ ...
(abs(bscar(1:length(bscar)-1)));% creo la tabella per la costante MtabbM = sprintf('%10.3f %10.3f %10.3f %10.3f %10.3f %10.3f \n', bM);disp(tabbM), disp(' ')
endend
%%%%%%%%%%%% METODO DEL PUNTO FISSO %%%%%%%%%%%if metodo(6)
% imposto i parametri d'ingresso del metodoparconv = [toll nmaxiter];
% chiamo la function puntfis.m[pfx, pfconv, pfconvstory] = puntfis(x0, gname, parconv);
% stampo i risultatiif (graficofunz == 1 || metodo(1) || metodo(2) || metodo(3) ||...
metodo(4) || metodo(5))disp(['\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ...
'\\\\\\\\\\\\\\\'])disp(['///////////////////////////////////////////////////////' ...
'///////////////']), disp(' ')enddisp(' ')disp('--------------- METODO DI PUNTO FISSO ---------------')disp(' ')disp(['funzione usata : ', fname])disp(['funzione di punto fisso usata: ', gname])disp(['numero massimo di iterazioni : ', int2str(nmaxiter)])disp(['criterio d''arresto : ', '|s_n| < ', ...
num2str(toll)])if pfconv == -1 % ovvero non c' stata convergenza
messaggio = 'convergenza : no';else
messaggio = ['convergenza : s (', ...int2str(pfconv), ' iterazioni (n))'];
enddisp(messaggio), disp(' '), disp(' ')if pfconv > 0 % se il metodo converge stampo la convstory
disp('sintesi del processo di convergenza:'), disp(' ')disp([' n x_n g(x_n) '...
' s_n']), disp(' ')
pfscar = abs(pfconvstory(2:length(pfconvstory), 2) - ...pfconvstory(1:length(pfconvstory)-1, 2));% ora posso creare la mia tabellapftabp = [pfconvstory [pfscar; NaN]]; % p di provvisoria (n.d.t)pftab = sprintf('%3i %20.15f %13.3e %13.3e \n', pftabp');disp(pftab), disp(' ')disp('stima costante di errore M usando il rapporto degli scarti:')disp(' ')% calcolo la costante M (pfM) per ogni iterazione (vale come per% nwscar la stringa che segue...)pfM = abs(pfscar(2:length(pfscar)))./ ...
(abs(pfscar(1:length(pfscar)-1)));% creo la tabella per la costante MtabpfM = sprintf('%10.3f %10.3f %10.3f %10.3f %10.3f %10.3f \n', pfM);disp(tabpfM), disp(' ')
endend
% imposto l'eventuale creazione del grafico degli scartiif (sum(metodo) > 0 && graficoscar == 1) % ho utilizzato almeno un metodo
figure(2)
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
23/34
22
if metodo(1)semilogy(abs(nwscar), '-o', 'lineWidth', 2)hold on
endif metodo(2)
semilogy(abs(tfscar), '-ok', 'lineWidth', 2)hold on
endif metodo(3)
semilogy(abs(svscar), '-og', 'lineWidth', 2)
hold onendif metodo(4)
semilogy(abs(sfscar), '-p', 'lineWidth', 2)hold on
endif metodo(5)
semilogy(abs(bscar), '-pk', 'lineWidth', 2)hold on
endif metodo(6)
semilogy(abs(pfscar), '-pg', 'lineWidth', 2)endif sum(metodo) == 6 % ovvero se ho utilizzato tutti i metodi
% inserisco la legendalegend('Newton', 'Tangente fissa', 'Secante variabile',...
'Secante fissa', 'Bisezione', 'Punto fisso')
endtitle('Grafico degli scarti', 'fontSize', 14)xlabel('Numero di iterazione', 'fontSize', 18)ylabel('Valore assoluto degli scarti', 'fontSize', 18)
end
4.2 MetododiNewton-Raphson(newton)
function [x, conv, convstory] = newton(x0, fname, dfname, parconv)% [X, CONV, CONVSTORY] = NEWTON(X0, FNAME, DFNAME, PARCONV)% risolve f(x)=0 utilizzando il metodo iterativo di Newton-Raphson con
% punto iniziale x0.% Il test di arresto utilizzato quello sullo scarto:% |x_(n+1) - x_n| < toll.
%%%%%%%%%%% PARAMETRI DI INGRESSO %%%%%%%%%%% x0 : valore iniziale della stima della radice.% fname : nome del file Matlab che contiene la funzione f(x)% dfname : nome del file Matlab che contiene la derivata di f(x)% parconv : vettore (1x3) che contiene i parametri per la convergenza% parconv(1): toll% parconv(2): nmaxiter% parconv(3): r% toll : tollerenza desiderata per lo scarto% nmaxiter : numero massimo di iterazioni da effettuare% r : molteplicit della radice
%%%%%%%%%%% PARAMETRI DI USCITA %%%%%%%%%%
% x : valore della radice% conv : indica il numero di iterazioni effettuate (niter) se il% metodo converge, -1 se il metodo non converge ( stato% raggiunto il numero massimo di iterazioni desiderato)% convstory : matrici [(niter+1)x4] che tiene traccia del processo% iterativo eseguito:% 1 colonna: valore del numero di iterazione (niter) attuale% 2 colonna: valore della radice x per l'iterazione attuale% 3 colonna: valore di f(x) per l'iterazione attuale% 4 colonna: valore di f'(x) per l'iterazione attuale
% Emanuele De Villa Bais $ 28-Mar-2010 $
% stabilisco i parametri d'entratatoll = parconv(1);nmaxiter = parconv(2);r = parconv(3);
% creo la matrice nulla che conterr la convstoryconvstory = zeros(nmaxiter+1, 4);
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
24/34
23
% stabilisco i valori iniziali di x, toll e nxold = x0; % la mia x_nntoll = 2*toll; % la tolleranza iniziale deve essere maggioren = 0;
% creo il ciclo che calcoler l'approssimazione della radicewhile (ntoll > toll && n
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
25/34
24
% stabilisco i valori iniziali di x, toll, n e h_n% nel metodo della tangente fissa h_n costante e vale f'(x0)dfx = feval(dfname, x0); % ecco qui il mio valore h_nxold = x0; % stima iniziale della radicentoll = 2*toll; % la tolleranza iniziale deve essere maggioren = 0;
% creo il ciclo che calcoler l'approssimazione della radicewhile (ntoll > toll && n
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
26/34
25
% calcolo tramite il metodo di Newton-Raphson il valore di x1if (ntoll > toll && n toll && n nmaxiter && ntoll > toll) % non c' stata convergenza
conv = -1;end
convstory = convstory(1:n+1, 1:4); % elimino le righe che mi avanzano
4.5 Metododellasecantefissa(secfis)function [x, conv, convstory] = secfis(x0, fname, dfname, parconv)% [X, CONV, CONVSTORY] = SECFIS(X0, FNAME, DFNAME, PARCONV)% risolve f(x)=0 utilizzando il metodo iterativo della secante fissa% con punto iniziale x0 e x1 calcolato col metodo di Newton-Raphson% Il test di arresto utilizzato quello sullo scarto:% |x_(n+1) - x_n| < toll
%%%%%%%%%%% PARAMETRI DI INGRESSO %%%%%%%%%%% x0 : valore iniziale della stima della radice.
% fname : nome del file Matlab che contiene la funzione f(x)% dfname : nome del file Matlab che contiene la derivata di f(x)% parconv : vettore (1x2) che contiene i parametri per la convergenza% parconv(1): toll% parconv(2): nmaxiter% toll : tollerenza desiderata per lo scarto% nmaxiter : numero massimo di iterazioni da effettuare
%%%%%%%%%%% PARAMETRI DI USCITA %%%%%%%%%%% x : valore della radice% conv : indica il numero di iterazioni effettuate (niter) se il% metodo converge, -1 se il metodo non converge ( stato% raggiunto il numero massimo di iterazioni desiderato)% convstory : matrici [(niter+1)x3] che tiene traccia del processo% iterativo eseguito:% 1 colonna: valore del numero di iterazione (niter) attuale% 2 colonna: valore della radice x per l'iterazione attuale
% 3 colonna: valore di f(x) per l'iterazione attuale
% Emanuele De Villa Bais $ 29-Mar-2010 $
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
27/34
26
% imposto i parametri d'entratatoll = parconv(1);nmaxiter = parconv(2);
% creo la matrice nulla che conterr convstoryconvstory = zeros(nmaxiter+1, 3);
% assegno i valori iniziali di x, toll, n, fx0 e dfx0fx0 = feval(fname, x0);dfx0 = feval (dfname, x0);
ntoll = 2*toll; % la tolleranza iniziale deve essere maggioren = 0;
% calcolo tramite il metodo di Newton-Raphson il valore di x1if (ntoll > toll && n
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
28/34
27
4.6 Metododibisezione(bisez)function [x, conv, convstory] = bisez(x0, fname, parconv)% [X, CONV, CONVSTORY] = BISEZ(X0, FNAME, PARCONV)% risolve f(x)=0 utilizzando il metodo iterativo della bisezione con% punti iniziali appartenenti all'intervallo I.% Il criterio d'uscita prevede che l'ampiezza dell'intervallo che contiene% la radice sia inferiore a toll
%%%%%%%%%%% PARAMETRI DI INGRESSO %%%%%%%%%%% x0 : intervallo che contiene i valori a e b.% fname : nome del file Matlab che contiene la funzione f(x)% parconv : vettore (1x2) che contiene i parametri per la convergenza% parconv(1): toll% parconv(2): nmaxiter% toll : tollerenza desiderata per lo scarto% nmaxiter : numero massimo di iterazioni da effettuare
%%%%%%%%%%% PARAMETRI DI USCITA %%%%%%%%%%% x : valore della radice% conv : indica il numero di iterazioni effettuate (niter) se il% metodo converge, -1 se il metodo non converge ( stato% raggiunto il numero massimo di iterazioni desiderato)% convstory : matrici [(niter+1)x5] che tiene traccia del processo% iterativo eseguito:% 1 colonna: valore del numero di iterazione (niter) attuale% 2 colonna: valore della radice x per l'iterazione attuale% 3 colonna: estremo inferiore dell'intervallo% 4 colonna: estremo superiore dell'intervallo% 5 colonna: valore di f(x) per l'iterazione attuale
% Emanuele De Villa Bais $ 28-Mar-2010 $
% stabilisco i parametri d'entratatoll = parconv(1);nmaxiter = parconv(2);
% creo la matrice nulla che conterr la convstoryconvstory = zeros(nmaxiter+1, 5);
% stabilisco l'intervallo iniziale, i valori di toll ed na = x0(1);
b = x0(2);ntoll = b-a;n = 0;
% creo il ciclo per il calcolo della radicefa = feval(fname, a);fb = feval(fname, b);if fa*fb > 0 % la radice non nell'intervallo I = [a,b]
disp('L''intervallo iniziale non accettabile')else
while (ntoll > toll && n 0 % ovvero se f(a)*f(c) > 0 (hanno segno uguale)
a = c; % la radice si trova tra a e c, quindi pongo b = c
else% ovvero f(a)*f(c) < 0 (hanno segno opposto)b = c;endntoll = b - a; % controllo l'ampiezza dell'intervallon = n+1;end
end
% completo la matrice convstory coi valori dell'ultima iterazionec = 0.5*(b+a);fxlast = feval(fname, c);convstory(n+1, 1:5) = [n, c, a, b, fxlast];
% definisco i parametri d'uscitax = c; % il valore finale della mia radiceconv = n; % il numero di iterazioni eseguiteif (n > nmaxiter && ntoll > toll) % ovvero non c' stata convergenza
conv = -1;end
convstory = convstory(1:n+1, 1:5); % tolgo le righe che mi avanzano
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
29/34
28
4.7 Metododipuntofisso(puntfis)function [x, conv, convstory] = puntfis(x0, gname, parconv)% [X, CONV, CONVSTORY] = PUNTFIS(X0, GNAME, PARCONV)% risolve f(x)=0 utilizzando il metodo iterativo del punto fisso con% punto iniziale x0.% Il test di arresto utilizzato quello sullo scarto:% |x_(n+1) - x_n| < toll
%%%%%%%%%%% PARAMETRI DI INGRESSO %%%%%%%%%%% x0 : valore iniziale della stima della radice.% gname : nome del file Matlab che contiene la funzione g(x)% (funzione di punto fisso)% parconv : vettore (1x2) che contiene i parametri per la convergenza% parconv(1): toll% parconv(2): nmaxiter% toll : tollerenza desiderata per lo scarto% nmaxiter : numero massimo di iterazioni da effettuare
%%%%%%%%%%% PARAMETRI DI USCITA %%%%%%%%%%% x : valore della radice% conv : indica il numero di iterazioni effettuate (niter) se il% metodo converge, -1 se il metodo non converge ( stato% raggiunto il numero massimo di iterazioni desiderato)% convstory : matrici [(niter+1)x3] che tiene traccia del processo% iterativo eseguito:% 1 colonna: valore del numero di iterazione (niter) attuale% 2 colonna: valore della radice x per l'iterazione attuale% 3 colonna: valore di g(x) per l'iterazione attuale
% Emanuele De Villa Bais $ 30-Mar-2010 $
% stabilisco i parametri d'entratatoll = parconv(1);nmaxiter = parconv(2);
% creo la matrice nulla che conterr convstoryconvstory = zeros(nmaxiter+1, 3);
% stabilisco i valori iniziali di x, toll e nxold = x0; % stima iniziale della radicentoll = 2*toll; % la tolleranza iniziale deve essere maggiore
n = 0;% creo il ciclo che calcoler l'approssimazione della radicewhile (ntoll > toll && n
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
30/34
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
31/34
30
5. Uscitadelprogramma
>>stimaRadice
---------------METODODINEWTON-RAPHSON---------------
funzioneusata :fEs1numeromassimodiiterazioni:50
criteriod'arresto :|s_n|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
32/34
31
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//////////////////////////////////////////////////////////////////////
---------------METODODELLASECANTEVARIABILE---------------
funzioneusata :fEs1
numeromassimodiiterazioni:50criteriod'arresto :|s_n|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
33/34
32
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//////////////////////////////////////////////////////////////////////
---------------METODODIBISEZIONE---------------
funzioneusata :fEs1
numeromassimodiiterazioni:50criteriod'arresto :|s_n|
-
8/9/2019 Www.unlock-PDF.com Esercitazione 1 - Studio Di Funzione
34/34
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//////////////////////////////////////////////////////////////////////
---------------METODODIPUNTOFISSO---------------
funzioneusata :fEs1
funzionedipuntofissousata:g1Es1numeromassimodiiterazioni:50
criteriod'arresto :|s_n|