Sei sulla pagina 1di 5

Page 1 [E:\esercitazioni\problema1\newt1.

f]
c

metodo di newthon raphson per risolvere l'equazione f(x)=0


program newt1
implicit none
integer iter,itmax
real*8 x0,xk,xkp1,tol,dk,f,k
real*8 asint1,asint2,df,d2f,dkold
open(5,file='nr.dat')
open(6,file='nr.ris')
read(5,*) x0,itmax,tol
write(6,*) x0,itmax,tol
xk=x0

ITERAZIONE 0
iter=0
INIZIALIZZAZIONE DELLO SCARTO
dk=10.d0*tol
dkold=1.d0
write(6,2) 'k','xk','f(xk)','dk','asint1','asint2'

c
c
C
c
c

1
2

CICLO DO WHILE
do while((dk.ge.tol).and.(iter.le.itmax))
iter=iter+1
SCHEMA ITERATIVO
xkp1=xk-(f(xk)/df(xk))
SCARTO:errore in condizioni di convergenza cio quanto mi discosto dalla soluzione
pensando che la csi sia Xn+1
dk=abs(xkp1-xk)
in asint2 uso lo scartold elevato alla seconda perch la convergenza quadratica
asint1:M:A=|(f''(csi))/(2(f'(csi)| ricavato da svilpuppi di taylor...
asint2=abs(d2f(xkp1))/abs(2*df(xkp1))
asint1=dk/dkold**2
write(6,1) iter,xkp1,f(xkp1),dk,asint1,asint2
format(i3,2x,f15.8,2x,e15.7,2x,e15.7,2x,e15.7,2x,e15.7)
format(2x,a,10x,a,13x,a,14x,a,12x,a,12x,a)

AGGIORNAMENTO DELLA VARIABILE E DELLO SCARTO


xk=xkp1
dkold=dk
end do
close(5)
close(6)
stop
end

c
c

FUNCTION scritte in fondo al programma e richiamate dove servono dal return


funzione f(x)
real*8 function f(x)
implicit none
real*8 x
f=log(x+2)-2*x
return
end

funzione derivata prima della f(x)


real*8 function df(x)
implicit none
real*8 x
df=(1/(x+2))-2
return
end

funzione derivata seconda della f(x)


real*8 function d2f(x)
implicit none
real*8 x
d2f=-1/(x+2)**2
return
end

Page 1 [E:\esercitazioni\problema1\regfalsi.f]
c

c
c
c
c

c
c
c

metodo della regula falsi per risolvere l'equazione h(x)=0


program regfalsi
implicit none
dichiarazione delle variabili
iter=indice delle iterazioni
itmax=iterazioni massime
integer itmax,iter
x0 e x1 sono dati di imput perch la regula falsi ha bisogno di due punti iniziali
real*8 x0,x1,k,xold,xoldn
real*8 xkp1,dk,tol,h,dkold,asint1,asint2,c
real*8 d2h,dh
h=funzione h(x)
dh=derivata prima della funzione h(x)
d2h=derivata seconda della funzione h(x)
open(5,file='rf.dat')
open(6,file='rf.ris')

lettura dei dati


read(5,*) x0,x1,itmax,tol
write(6,*)x0,x1,itmax,tol
xold=x0
xoldn=x1
iter=0
dk=10.d0*tol
dkold=dk
write(6,2)'k','xk','f(xk)','dk','asint1','asint2'

CICLO DO WHILE
do while ((dk.ge.tol).and.(iter.le.itmax))
iter=iter+1

c
c

SCHEMA ITERATIVO
inserisco la c per non appesantire troppo la formula
xkp1=xoldn-h(xoldn)*((xoldn-xold)/(h(xoldn)-h(xold)))
SCARTO: differenza tra due iterazione successive
dk=abs(xoldn-xold)
ASINT
in asint2 scartold elevato alla 1.618 perch la convergenza super lineare
asint2=abs((d2h(xkp1))/(abs(2*dh(xkp1))))**0.618
asint1=dk/(dkold**1.618)
write(6,1)iter,xkp1,h(xkp1),dk,asint1,asint2
format(i3,3x,f15.8,3x,e15.8,5x,e15.8,5x,e15.8,3x,e15.8)
format(2x,a,12x,a,12x,a,15x,a,18x,a,11x,a)
AGGIORNAMENTO DELLE VARIABILI (aggiornare 2 perch ho bisogno di due punti)
xold=xoldn
xoldn=xkp1

c
c
c

1
2
c

AGGIORNAMENTO DELLO SCARTO


dkold=dk
end do
close(5)
close(6)
stop
end

c
c

FUNCTION
funzione h(x)
real*8 function h(x)
implicit none
real*8 x
h=log(x+2)-2*x
return
end

funzione derivata prima della h(x)


real*8 function dh(x)
implicit none
real*8 x
dh=(1/(x+2))-2
return
end

funzione derivata seconda della h(x)


real*8 function d2h(x)

Page 2 [E:\esercitazioni\problema1\regfalsi.f]
implicit none
real*8 x
d2h=-1/(x+2)**2
return
end

Page 1 [E:\esercitazioni\problema1\fisso.f]
c

SCHEMA DEL PUNTO FISSO PER LA FUZIONE g1(x)=0


program fisso
implicit none
c
DICHIARAZIONE DELLE VARIABILI
c
iter:contatore di iterazioni
c
itmax:iterazioni massime (deciso da me)
integer iter,itmax
c
xk:il punto da cui parto quindi un dato di imput
c
xkp1:Xk+1:il punto che approssima maggiormente la soluzione, cio la miglior
approssimazione
real*8 x0,tol,xold,xkp1,dk,g,k
c
g:funzione g(x) che trovo dalla f(x) esplicitando la x in modo da avere
c
il sistema formato da y=x e y=g(x)
real*8 dkold,asint1,asint2,dg
c
asint1 e asint2:approssimazione del fattore di convergenza(costante asintotica
dell'errore)
c
dk: errore commesso all'iterazione n-esima
c
dkold: errore commesso all'iterazione n-1 esima
c
tol:tolleranza entro cui deve stare l'errore
c

uso file esterni per inserire i dati e leggere i risultati


open(5,file='fisso.dat')
open(6,file='fisso.ris')
read(5,*) x0,itmax,tol
write(6,*)x0,itmax,tol
xold=x0

c
C

inizio il processo impostando che all'iterazione 0 lo scarto sia 10*tol


l'importante che sia pi grande della tolleranza
iter=0
dk=10.d0*tol
INIZIALIZZAZIONE DELLO SCARTO
dkold=1.d0
write(6,2)'k','xk','dk','asint1','asint2'

CICLO DO WHILE: tra parentesi trovo le condizioni


do while ((dk.ge.tol).and.(iter.le.itmax))
iter=iter+1
c
SCHEMA ITERATIVO cio il criterio con cui si svolgono le iterazioni
xkp1=g(xold)
c
scarto=dk: errore commesso=|soluzione approssimata(Xn+1)-soluzione esatta|
c
quindi l'errore commesso=(uguaglianza asintotica)=|ultima approssimazione-la
precedente|
dk=abs(xkp1-xold)
c
asint1:M=|g'(x)| e asint2:M=rapporto tra due scarti successivi=|Xn+1 - Xn|/|Xn-Xn-1|^p
asint2=abs(dg(xkp1))
c
in asint2 ho solo |scarto|/|scartold| perch per il pto fisso p=1 essendo lineare la
convergenza
asint1=dk/dkold
c
stampo i valori inseriti x conferma
write(6,1)iter,xkp1,dk,asint1,asint2
c
c
c

AGGIORNAMENTO DELLA VARIABILE


xold=xkp1
AGGIORNAMENTO DELLO SCARTO
dkold=dk
FINE DEL CICLO DO WHILE
end do
close(5)
close(6)
stop
end

C
FUNCTION che vanno scritte in fondo al programma e vengono richiamate dove servono
dal return
c
funzione g(x)
real*8 function g(x)
implicit none
real*8 x
g=log(x+2)/2
return
end
c

funzione derivata prima della g(x)

Page 2 [E:\esercitazioni\problema1\fisso.f]
real*8 function dg(x)
implicit none
real*8 x
dg=1/(2*(x+2))
return
end