EQUAZIONI E SISTEMI DEQUAZIONI DIFFERENZIALI LINEARI A COEFFICIENTI COSTANTI.
Equazioni Non Lineari
-
Upload
mekonen-magoga -
Category
Documents
-
view
218 -
download
0
description
Transcript of 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 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 2 [E:\esercitazioni\problema1\regfalsi.f]
implicit nonereal*8 xd2h=-1/(x+2)**2returnend
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 2 [E:\esercitazioni\problema1\fisso.f]
real*8 function dg(x)implicit nonereal*8 xdg=1/(2*(x+2))returnend