Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
2. METODO DI REGULA FALSI
Il metodo del Regula falsi è un’altra metodologia per arrivare alla determinazione della
soluzione di sistemi di equazioni non lineari. Per questo esercizio non è stata fornita
una Function già funzionante che implementi questo particolare metodo ma è stato
richiesto di realizzarla implementando una Function ex novo oppure modificando
quella che più si avvicini a questo metodo. Dopo un attento studio della teoria dei
metodi iterativi per la risoluzione di sistemi di equazioni non lineari si può dire con
certezza che questo metodo è molto simile alla Function del metodo di bisezione. Difatti
£
dato un intervallo [a,b] tale che sia comunque soddisfatta la condizione fa*fb 0 ,
allora:
Si riporta alla pagina seguente la Function scritta ed implementata modificando il
metodo di bisezione fornito durante le esercitazioni dal docente.
12
Relazione Progetto –Corso di Metodi Numerici per l’Ingegneria Civile Magistrale- A.A. 2016-2017 – Esercizio 1
function [x,iter,res]=RegulaFalsi(f,a,b,ep,itermax)
%valuta la funzione f nel punto a
fa = feval(f,a);
%valuta la funzione f nel punto b
fb = feval(f,b);
%condizione necessaria e sufficiente nella scelta
dell'intervallo
if fa*fb > 0
fprintf('\n\nThe initial interval does not satisfy f(a)f(b)
< 0.')
return
end
res=abs(fa);
iter=0;
%while abs(a-b) > ep+eps*max(abs(a),abs(b))
-> criterio di arresto vecchio
% nuovo criterio di arresto
while res > ep && (iter < itermax)
mid=b-(fb*(b-a))/(fb-fa);
fmid = feval(f,mid);
if fa*fmid<=0
% root in [a,mid].
b = mid;
fb = fmid;
else % root in [mid,b].
a = mid;
fa = fmid;
end
res=abs(feval(f,mid));
iter=iter+1;
end
x=b-(fb*(b-a))/(fb-fa);
Il metodo, pertanto, genera una successione di intervalli decrescenti in cui è contenuta
la radice ed è più veloce rispetto al metodo di bisezione. (visualizzabile dalle iterazioni)
3. METODO DI NEWTON
Col metodo delle tangenti di Newton, si determinano gli zeri utilizzando la tangente
alla curva. La ricerca comincia selezionando un elemento che si trova in prossimità
dello zero cioè scegliendo nel modo opportuno il punto inziale vicino alla soluzione, la
quale è contenuta nell’intervallo [a,b]. Generalmente per semplicità si può iniziare da
uno dei due punti che hanno come ascissa gli estremi dell'intervallo [a,b].
Successivamente si determina la tangente al polinomio e si trova lo zero di tale tangente.
Lo zero determinato è l'approssimazione dello zero del polinomio.
13
Relazione Progetto –Corso di Metodi Numerici per l’Ingegneria Civile Magistrale- A.A. 2016-2017 – Esercizio 1
Si prosegue, pertanto, iterando il procedimento scegliendo un opportuno numero di
iterazioni massime e un opportuno criterio di arresto figlio della precisione adottata o
richiesta da problema fisico. Il metodo è sintetizzato in figura e nella formula:
Osservando la formula del metodo iterativo si possono esporre importanti
considerazioni. Esso non è sempre applicabile ma necessita di alcune condizioni
fondamentali riassumibili nei seguenti tre punti:
• £
È sempre necessario scegliere un intervallo [a,b] tale che f(a)*f(b) 0 in cui
vi è un’unica radice e facendo si che valga il Teorema degli zeri;
2
• Î
f C [a,b] , cioè devono risultare continue la f(x), f ’(x), f ’’(x);
• ¹
f ‘(x) 0 per xÎ[a,b] poiché il denominatore della formula di Newton non
può annullarsi; 14
Relazione Progetto –Corso di Metodi Numerici per l’Ingegneria Civile Magistrale- A.A. 2016-2017 – Esercizio 1
La Function implementata in MatLab è la seguente:
function [x,iter,res]= Newton(fun,der,x0,ep,itermax)
y=feval(der,x0)\feval(fun,x0);
x=x0-y;
res = norm(x-x0,'inf');
residuo=abs(feval(fun,x));
iter=1;
while (residuo > ep) && (iter<itermax)
x0=x;
y=feval(der,x0)\feval(fun,x0);
x=x0-y;
res = norm(x-x0,'inf');
residuo=abs(feval(fun,x))
iter=iter+1;
end
if iter==itermax
fprintf('\n\nThe method does not converge with the desired
accuracy!');
fprintf('\nAfter %d iterations:', itermax);
fprintf('\nnorm = %f .\n', norm(x-x0,'inf'));
end 4. METODO DELLE SECANTI
Il metodo delle Secanti è detto tale poiché molto intuitivamente si basa sulla costruzione
di secanti alla funzione data. Non è necessario, questa volta, che il punto di zero sia
contenuto all'interno dell'intervallo esaminato. A causa di ciò è possibile che in alcuni
casi particolari l'algoritmo non converga. Nei casi regolari, la velocità di convergenza
è comunque assai migliore del metodo di bisezione, anche se lievemente inferiore a
quella del metodo di Newton. Pertanto dati due punti a e b è possibile determinare
l’equazione della retta passante per due punti. L’algoritmo risulta quindi così
strutturato:
1. Si determina l’intervallo di partenza [a, b];
2. Si sostituisce alla funzione y = f(x) la retta passante per i punti a e b (punti
estremi all'intervallo [a, b]) appartenenti al grafico della funzione;
3. Si determina il punto di intersezione, della retta passante per il punto a e b, con
l'asse delle X;
4. Si itera la formula
Per implementare questo metodo si è voluta utilizzare la Function fornita dal docente
durante le esercitazioni. Pertanto: 15
Relazione Progetto –Corso di Metodi Numerici per l’Ingegneria Civile Magistrale- A.A. 2016-2017 – Esercizio 1
function [x,iter,res]= Secant(f,a,b,ep,itermax)
x0 = a ; x1 = b;
x=x1;
iter=0;
x1=x0;
y1=feval(f,x1);
res=abs(y1)
while (res > ep) && (iter<itermax)
x0=x1;
y0=y1;
x1=x;
y1=feval(f,x1);
if (abs(y1)>ep)
x=x1-y1*(x1-x0)./(y1-y0);
iter=iter+1;
end
res=abs(feval(f,x));
end OSSERVAZIONE 2
Si possono confrontare il metodo delle Secanti e del Regula falsi in quanto sono simili.
La differenza sta nel fatto che il metodo delle Secanti procede con gli ultimi punti
trovati in successione senza tener conto del valore positivo o negativo della funzione.
Mentre il Regula falsi costruisce le rette passanti per i punti x1 e x2 dell’intervallo
considerato tale che in essi la funzione assume valori discordi. In questo modo la radice
è sempre racchiusa nell’intervallo [x1,x2]. In generale il metodo delle secanti potrebbe
essere più veloce ma non converge sempre. Questo poiché non vi è la certezza di avere
sempre all’interno dell’intervallo il punto cercato.
Sulla base degli argomenti teorici evidenziati e degli aspetti argomentati finora si
vogliono riportare all’interno di questa relazione le scelte effettuate all’interno del
codice per la risoluzione del problema proposto. Pertanto come prima cosa si riportano
i grafici con le varie soluzioni evidenziate con marker differenti (come chiesto dal testo
dell’esercizio) presenti nel comando plot.
Infatti: 16
Relazione Progetto –Corso di Metodi Numerici per l’Ingegneria Civile Magistrale- A.A. 2016-2017 – Esercizio 1
%Punto 4
switch b
case 1
figure
t1=linspace(-5,5,100);
plot(t1,funzione1(t1),'b','LineWidth',1.5);
title('soluzioni metodi iterativi y=exp(-x)-x');
axis tight;
hold on;
plot(sol1_bisezione,0,'sr','MarkerSize',14,'LineWidth',2);
plot(sol1_secanti,0,'xk','MarkerSize',16,'LineWidth',1.5);
plot(sol1_newton,0,'+g','MarkerSize',23,'LineWidth',1.5);
plot(sol1_regulafalsi,0,'sc','MarkerSize',24,'LineWidth',1.5);
lgd=legend('y=exp(-x)-
x','bisezione','secanti','Newton','RegulaFalsi','Location','southoutside');
legend('Orientation','horizontal');
legend('boxoff');
lgd.FontSize=14;
grid on;
case 2
figure
t=linspace(-10,15,100);
plot(t,funzione2(t),'b');
title('soluzioni metodi iterativi di y=abs(x-1)+abs(x-2)+abs(x-3)-3.5');
hold on;
grid on;
plot(sol1_bisezione,0,'sr','MarkerSize',14,'LineWidth',2);
plot(sol1_secanti,0,'xk','MarkerSize',16,'LineWidth',1.5);
plot(sol1_newton,0,'+g','MarkerSize',23,'LineWidth',1.5);
plot(sol1_regulafalsi,0,'sc','MarkerSize',24,'LineWidth',1.5);
lgd=legend('y=abs(x-1)+abs(x-2)+abs(x-3)-
3.5','bisezione','secanti','Newton','RegulaFalsi','Location','southoutside');
legend('Orientation','horizontal');
legend('boxoff');
lgd.FontSize=12;
plot(sol2_bisezione,0,'sr','MarkerSize',14,'LineWidth',2);
plot(sol2_secanti,0,'xk','MarkerSize',16,'LineWidth',1.5);
plot(sol2_newton,0,'+g','MarkerSize',23,'LineWidth',1.5);
plot(sol2_regulafalsi,0,'sc','MarkerSize',24,'LineWidth',1.5);
case 3
figure
subplot(2,1,1)
t1=linspace(-7,4.5,100);
plot(t1,funzione3(t1),'b','LineWidth',1.5);
title('soluzioni metodi iterativi y=2.*sin(x)-(1/8).*(x.^2)+2.3527');
axis tight;
hold on;
plot(sol1_bisezione,0,'sr','MarkerSize',14,'LineWidth',2);
plot(sol1_secanti,0,'xk','MarkerSize',16,'LineWidth',1.5);
plot(sol1_newton,0,'+g','MarkerSize',23,'LineWidth',1.5);
plot(sol1_regulafalsi,0,'sc','MarkerSize',24,'LineWidth',1.5);
grid on lgd=legend('y=2.*sin(x)-
(1/8).*(x.^2)+2.3527','bisezione','secanti','Newton','RegulaFalsi','Location','south
outside');
legend('Orientation','horizontal');
legend('boxoff');
lgd.FontSize=14;
plot(sol2_bisezione,0,'sr','MarkerSize',14,'LineWidth',2);
plot(sol2_secanti,0,'xk','MarkerSize',16,'LineWidth',1.5);
plot(sol2_newton,0,'+g','MarkerSize',23,'LineWidth',1.5);
plot(sol2_regulafalsi,0,'sc','MarkerSize',24,'LineWidth',1.5);
plot(sol3_bisezione,0,'sr','MarkerSize',14,'LineWidth',2);
plot(sol3_secanti,0,'xk','MarkerSize',16,'LineWidth