Iterazione funzionale e newton
salve a tutti ho una funzione di cui devo sviluppare i programmi in fortran per il metodo del punto fisso e quello di newton. la funzione è:
$e^((x*x)+1)-4+sin(x)$
vorrei degli aiuti, una scaletta per sapere come devo operate
un codice l'ho scritto.. ma non so quanto sia corretto.
grazie;)
$e^((x*x)+1)-4+sin(x)$
vorrei degli aiuti, una scaletta per sapere come devo operate
un codice l'ho scritto.. ma non so quanto sia corretto.
grazie;)
Risposte
postalo e vediamo quanto è corretto

program iterazione funzionle
real*8 toll, x,iter,y
write(*,*) '°_°-°_°-°'
write(*,*) '°'
write(*,*) '°BENVENUTO!!'
write(*,*) '°'
write(*,*) ' Questo programma calcola lo zero della funzione: '
write(*,*) ' $y = e^((X^2)+1) + sin(X) -4'$
write(*,*) ' Utilizzando il metodo del punto fisso.'
write(*,*) '°'
write(*,*) '°================================================'
c INSERIRE LA FUNZIONE INIZIALE
write(*,*) 'exp(x**(2)+1)+sin(x)-4'
c INSERIRE LA FI TROVATA
write(*,*) 'fi=4-sin(x)'
x=1
toll=1.D-5
iter=1
i=0
do while(iter.gt.toll)
i=i+1
y=x
x=4-sin(x)
iter= abs(x-y)/abs(x)
write(*,*) x,i
enddo
end
real*8 toll, x,iter,y
write(*,*) '°_°-°_°-°'
write(*,*) '°'
write(*,*) '°BENVENUTO!!'
write(*,*) '°'
write(*,*) ' Questo programma calcola lo zero della funzione: '
write(*,*) ' $y = e^((X^2)+1) + sin(X) -4'$
write(*,*) ' Utilizzando il metodo del punto fisso.'
write(*,*) '°'
write(*,*) '°================================================'
c INSERIRE LA FUNZIONE INIZIALE
write(*,*) 'exp(x**(2)+1)+sin(x)-4'
c INSERIRE LA FI TROVATA
write(*,*) 'fi=4-sin(x)'
x=1
toll=1.D-5
iter=1
i=0
do while(iter.gt.toll)
i=i+1
y=x
x=4-sin(x)
iter= abs(x-y)/abs(x)
write(*,*) x,i
enddo
end
program Newton
real*8 New,y
real a,b
write(*,*) '°_°-°_°-°'
write(*,*) '°'
write(*,*) '°BENVENUTO!!'
write(*,*) '°'
write(*,*) ' Questo programma calcola lo zero della funzione: '
write(*,*) ' y = e^(X^(2)+1) + sin(X)-4 '
write(*,*) ' Utilizzando il metodo di Newton-Raphson.'
write(*,*) '°'
write(*,*) '°================================================'
c Gli argomenti della funzione "Newton/Raphson", che calcola lo zero, sono gli estremi
c dell'intervallo, "a" e "b".
a=0.
b=2.
y=New(a,b)
write(*,*) ' La funzione si annulla nel punto :',y
write(*,*) '°'
write(*,*) '°_°-°_°-°'
stop
pause
end
c Funzione Newton/Raphson
real*8 function New(a,b)
real*8 fa,fb,f2a,f2b,Fou,fFou,fNew,H,P,fH
c Apriamo il file in cui registrare i dati per lo Scilab
open(unit=101,file='Newton.txt')
c In questo secondo file salveremo i valori che ci permetteranno di disegnare la retta
open(unit=102,file='Retta_New.txt')
c CALCOLO DELL'ESTREMO DI FOURIER
c L'estremo di Fourier è tale che il prodotto tra la funzione e la derivata seconda
c della funzione, calcolate in esso, è maggiore di zero;
c Calcoliamo dunque il valore della funzione agli estremi:
fa=exp(a*a+1)+sin(a)-4
fb=exp(b*b+1)+sin(b)-4
c Ora calcoliamo il valore della derivata seconda agli estremi:
f2a=4*a*a*exp(a*a+1)+2*exp(a*a+1)-sin(a)
f2b=4*b*b*exp(b*b+1)+2*exp(b*b+1)-sin(b)
c Ricerchiamo l'estremo di Fourier
if((fa*f2a).gt.0)then
Fou=a
endif
if((fb*f2b).gt.0)then
Fou=b
endif
write(*,*) ' L''estremo di Fourier, verso il quale la funzione vol
§ge la concavita'' e''', Fou
c Impostiamo la soglia che serve da criterio di arresto nel "do-while"
soglia=((1./2)*(10.**(-5)))
c Inizializziamo quello che sarà il valore della funzione nel punto in cui
c essa deve annullarsi ad 1, in modo che il calcolatore possa entrare nel
c ciclo del do-while.
fNew=1
do while ((i.lt.1000).and.(abs(fNew).gt.soglia))
i=i+1
c Calcoliamo il valore della funzione per l'Estremo di Fourier
fFou=exp(Fou*Fou+1)+sin(Fou)-4
c Calcoliamo il valore della derivata prima della funzione per l'Estremo di Fourier
f1Fou=2*Fou*exp(Fou*Fou+1)+cos(Fou)
c Calcoliamo il punto di intersezione tra l'asse delle ascisse e la retta tangente
c la curva nell'immagine dell'estremo di Fourier.
New=Fou-((fFou)/(f1Fou))
c Ora calcoliamo il valore che la funzione assume in tale punto
fNew=exp(New*New+1)+sin(New)-4
c Ripetiamo il procedimento considerando come estremo di Fourier il punto trovato
Fou=New
c Inseriamo il "write" che scrive sul file Bisectione.txt i valori dei punti medi e
c della funzione
write(101,'(f15.10,f15.10)') New,fNew
enddo
close(101)
c Inseriamo il ciclo per disegnare la retta
P=2./100.
H=-1
do while (H.le.1+P)
fH=exp(H)-6*(H*H)+(4*H)+3
H=H+P
write(102,'(f15.10,f15.10)') H-P,fH
enddo
close(102)
write(*,*) '°'
write(*,*) ' Le iterazioni necessarie necessarie sono state',i
write(*,*) ' '
write(*,*) ' Il valore di f e'' pari a: ',fNew
write(*,*) ' '
return
end function
real*8 New,y
real a,b
write(*,*) '°_°-°_°-°'
write(*,*) '°'
write(*,*) '°BENVENUTO!!'
write(*,*) '°'
write(*,*) ' Questo programma calcola lo zero della funzione: '
write(*,*) ' y = e^(X^(2)+1) + sin(X)-4 '
write(*,*) ' Utilizzando il metodo di Newton-Raphson.'
write(*,*) '°'
write(*,*) '°================================================'
c Gli argomenti della funzione "Newton/Raphson", che calcola lo zero, sono gli estremi
c dell'intervallo, "a" e "b".
a=0.
b=2.
y=New(a,b)
write(*,*) ' La funzione si annulla nel punto :',y
write(*,*) '°'
write(*,*) '°_°-°_°-°'
stop
pause
end
c Funzione Newton/Raphson
real*8 function New(a,b)
real*8 fa,fb,f2a,f2b,Fou,fFou,fNew,H,P,fH
c Apriamo il file in cui registrare i dati per lo Scilab
open(unit=101,file='Newton.txt')
c In questo secondo file salveremo i valori che ci permetteranno di disegnare la retta
open(unit=102,file='Retta_New.txt')
c CALCOLO DELL'ESTREMO DI FOURIER
c L'estremo di Fourier è tale che il prodotto tra la funzione e la derivata seconda
c della funzione, calcolate in esso, è maggiore di zero;
c Calcoliamo dunque il valore della funzione agli estremi:
fa=exp(a*a+1)+sin(a)-4
fb=exp(b*b+1)+sin(b)-4
c Ora calcoliamo il valore della derivata seconda agli estremi:
f2a=4*a*a*exp(a*a+1)+2*exp(a*a+1)-sin(a)
f2b=4*b*b*exp(b*b+1)+2*exp(b*b+1)-sin(b)
c Ricerchiamo l'estremo di Fourier
if((fa*f2a).gt.0)then
Fou=a
endif
if((fb*f2b).gt.0)then
Fou=b
endif
write(*,*) ' L''estremo di Fourier, verso il quale la funzione vol
§ge la concavita'' e''', Fou
c Impostiamo la soglia che serve da criterio di arresto nel "do-while"
soglia=((1./2)*(10.**(-5)))
c Inizializziamo quello che sarà il valore della funzione nel punto in cui
c essa deve annullarsi ad 1, in modo che il calcolatore possa entrare nel
c ciclo del do-while.
fNew=1
do while ((i.lt.1000).and.(abs(fNew).gt.soglia))
i=i+1
c Calcoliamo il valore della funzione per l'Estremo di Fourier
fFou=exp(Fou*Fou+1)+sin(Fou)-4
c Calcoliamo il valore della derivata prima della funzione per l'Estremo di Fourier
f1Fou=2*Fou*exp(Fou*Fou+1)+cos(Fou)
c Calcoliamo il punto di intersezione tra l'asse delle ascisse e la retta tangente
c la curva nell'immagine dell'estremo di Fourier.
New=Fou-((fFou)/(f1Fou))
c Ora calcoliamo il valore che la funzione assume in tale punto
fNew=exp(New*New+1)+sin(New)-4
c Ripetiamo il procedimento considerando come estremo di Fourier il punto trovato
Fou=New
c Inseriamo il "write" che scrive sul file Bisectione.txt i valori dei punti medi e
c della funzione
write(101,'(f15.10,f15.10)') New,fNew
enddo
close(101)
c Inseriamo il ciclo per disegnare la retta
P=2./100.
H=-1
do while (H.le.1+P)
fH=exp(H)-6*(H*H)+(4*H)+3
H=H+P
write(102,'(f15.10,f15.10)') H-P,fH
enddo
close(102)
write(*,*) '°'
write(*,*) ' Le iterazioni necessarie necessarie sono state',i
write(*,*) ' '
write(*,*) ' Il valore di f
write(*,*) ' '
return
end function