Equazioni Non Lineari

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 c ITERAZIONE 0 iter=0 c INIZIALIZZAZIONE DELLO SCARTO dk=10.d0*tol dkold=1.d0 write(6,2) 'k','xk','f(xk)','dk','asint1','asint2' c CICLO DO WHILE do while((dk.ge.tol).and.(iter.le.itmax)) iter=iter+1 c SCHEMA ITERATIVO xkp1=xk-(f(xk)/df(xk)) c SCARTO:errore in condizioni di convergenza cioè quanto mi discosto dalla soluzione C pensando che la csi sia Xn+1 dk=abs(xkp1-xk) c in asint2 uso lo scartold elevato alla seconda perchè la convergenza è quadratica c 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 1 format(i3,2x,f15.8,2x,e15.7,2x,e15.7,2x,e15.7,2x,e15.7) 2 format(2x,a,10x,a,13x,a,14x,a,12x,a,12x,a) c AGGIORNAMENTO DELLA VARIABILE E DELLO SCARTO xk=xkp1 dkold=dk end do close(5) close(6) stop end c FUNCTION scritte in fondo al programma e richiamate dove servono dal return c funzione f(x) real*8 function f(x) implicit none real*8 x f=log(x+2)-2*x return end c funzione derivata prima della f(x) real*8 function df(x) implicit none real*8 x df=(1/(x+2))-2 return end c funzione derivata seconda della f(x) real*8 function d2f(x) implicit none real*8 x d2f=-1/(x+2)**2 return end

description

equaaioni

Transcript of Equazioni Non Lineari

Page 1: Equazioni Non Lineari

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

c metodo di newthon raphson per risolvere l'equazione f(x)=0program newt1implicit noneinteger iter,itmaxreal*8 x0,xk,xkp1,tol,dk,f,kreal*8 asint1,asint2,df,d2f,dkoldopen(5,file='nr.dat')open(6,file='nr.ris')read(5,*) x0,itmax,tolwrite(6,*) x0,itmax,tolxk=x0

c ITERAZIONE 0 iter=0

c INIZIALIZZAZIONE DELLO SCARTOdk=10.d0*toldkold=1.d0write(6,2) 'k','xk','f(xk)','dk','asint1','asint2'

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

c SCHEMA ITERATIVOxkp1=xk-(f(xk)/df(xk))

c SCARTO:errore in condizioni di convergenza cioè quanto mi discosto dalla soluzione C pensando che la csi sia Xn+1

dk=abs(xkp1-xk)c in asint2 uso lo scartold elevato alla seconda perchè la convergenza è quadraticac asint1:M:A=|(f''(csi))/(2(f'(csi)| ricavato da svilpuppi di taylor...

asint2=abs(d2f(xkp1))/abs(2*df(xkp1))asint1=dk/dkold**2write(6,1) iter,xkp1,f(xkp1),dk,asint1,asint2

1 format(i3,2x,f15.8,2x,e15.7,2x,e15.7,2x,e15.7,2x,e15.7)2 format(2x,a,10x,a,13x,a,14x,a,12x,a,12x,a)

c AGGIORNAMENTO DELLA VARIABILE E DELLO SCARTOxk=xkp1dkold=dkend doclose(5)close(6)stopend

c FUNCTION scritte in fondo al programma e richiamate dove servono dal returnc funzione f(x)

real*8 function f(x)implicit nonereal*8 xf=log(x+2)-2*xreturnend

c funzione derivata prima della f(x)real*8 function df(x)implicit nonereal*8 xdf=(1/(x+2))-2returnend

c funzione derivata seconda della f(x)real*8 function d2f(x)implicit nonereal*8 xd2f=-1/(x+2)**2returnend

Page 2: Equazioni Non Lineari

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

c metodo della regula falsi per risolvere l'equazione h(x)=0program regfalsiimplicit none

c dichiarazione delle variabilic iter=indice delle iterazionic itmax=iterazioni massime

integer itmax,iterc x0 e x1 sono dati di imput perchè la regula falsi ha bisogno di due punti iniziali

real*8 x0,x1,k,xold,xoldnreal*8 xkp1,dk,tol,h,dkold,asint1,asint2,creal*8 d2h,dh

c h=funzione h(x)c dh=derivata prima della funzione h(x)c d2h=derivata seconda della funzione h(x)

open(5,file='rf.dat')open(6,file='rf.ris')

C lettura dei datiread(5,*) x0,x1,itmax,tolwrite(6,*)x0,x1,itmax,tolxold=x0xoldn=x1iter=0dk=10.d0*toldkold=dkwrite(6,2)'k','xk','f(xk)','dk','asint1','asint2'

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

c SCHEMA ITERATIVOc inserisco la c per non appesantire troppo la formula

xkp1=xoldn-h(xoldn)*((xoldn-xold)/(h(xoldn)-h(xold)))c SCARTO: differenza tra due iterazione successive

dk=abs(xoldn-xold)c ASINT c in asint2 scartold è elevato alla 1.618 perchè la convergenza è super lineare

asint2=abs((d2h(xkp1))/(abs(2*dh(xkp1))))**0.618asint1=dk/(dkold**1.618)write(6,1)iter,xkp1,h(xkp1),dk,asint1,asint2

1 format(i3,3x,f15.8,3x,e15.8,5x,e15.8,5x,e15.8,3x,e15.8)2 format(2x,a,12x,a,12x,a,15x,a,18x,a,11x,a)c AGGIORNAMENTO DELLE VARIABILI (aggiornare 2 perchè ho bisogno di due punti)

xold=xoldnxoldn=xkp1

c AGGIORNAMENTO DELLO SCARTOdkold=dkend doclose(5)close(6)stopend

c FUNCTION c funzione h(x)

real*8 function h(x)implicit nonereal*8 xh=log(x+2)-2*xreturnend

c funzione derivata prima della h(x)real*8 function dh(x)implicit nonereal*8 xdh=(1/(x+2))-2returnend

c funzione derivata seconda della h(x)real*8 function d2h(x)

Page 3: Equazioni Non Lineari

Page 2 [E:\esercitazioni\problema1\regfalsi.f]

implicit nonereal*8 xd2h=-1/(x+2)**2returnend

Page 4: Equazioni Non Lineari

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

c SCHEMA DEL PUNTO FISSO PER LA FUZIONE g1(x)=0program fissoimplicit none

c DICHIARAZIONE DELLE VARIABILIc iter:contatore di iterazionic itmax:iterazioni massime (deciso da me)

integer iter,itmaxc 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,kc 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,dgc asint1 e asint2:approssimazione del fattore di convergenza(costante asintotica dell'errore)c dk: errore commesso all'iterazione n-esimac 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 risultatiopen(5,file='fisso.dat')open(6,file='fisso.ris')read(5,*) x0,itmax,tolwrite(6,*)x0,itmax,tolxold=x0

c inizio il processo impostando che all'iterazione 0 lo scarto sia 10*tol C l'importante è che sia più grande della tolleranza

iter=0dk=10.d0*tol

c INIZIALIZZAZIONE DELLO SCARTOdkold=1.d0write(6,2)'k','xk','dk','asint1','asint2'

c CICLO DO WHILE: tra parentesi trovo le condizionido while ((dk.ge.tol).and.(iter.le.itmax))iter=iter+1

c SCHEMA ITERATIVO cioè il criterio con cui si svolgono le iterazionixkp1=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/dkoldc stampo i valori inseriti x conferma

write(6,1)iter,xkp1,dk,asint1,asint2

c AGGIORNAMENTO DELLA VARIABILE xold=xkp1

c AGGIORNAMENTO DELLO SCARTOdkold=dk

c FINE DEL CICLO DO WHILEend doclose(5)close(6)stopend

C FUNCTION che vanno scritte in fondo al programma e vengono richiamate dove servono dal returnc funzione g(x)

real*8 function g(x)implicit nonereal*8 xg=log(x+2)/2returnend

c funzione derivata prima della g(x)

Page 5: Equazioni Non Lineari

Page 2 [E:\esercitazioni\problema1\fisso.f]

real*8 function dg(x)implicit nonereal*8 xdg=1/(2*(x+2))returnend