Metodo di steffensen in Fortran
Salve ragazzi ho un dubbio per quanto riguarda la ricerca degli zeri di una funzioni con il metodo di steffensen con Fortran.
la funzione è x^2-3x+2 che ha gli zeri in x=2 e x=1, ed utilizzando l'algoritmo, fortino dal mio proff, viene sempre 2, qualsiasi siano gli estremi inseriti, vi sarei molto grato se poteste aiutarmi
la funzione è x^2-3x+2 che ha gli zeri in x=2 e x=1, ed utilizzando l'algoritmo, fortino dal mio proff, viene sempre 2, qualsiasi siano gli estremi inseriti, vi sarei molto grato se poteste aiutarmi
program Test_Steffensen implicit none real, external :: f real:: a, b, toll_f, zero, var_zero integer :: codice,it open(10,file='steffensen.ris',status='replace') print *,"Inserisici a e b" read(*,*) a,b toll_f = 1.e-3 print *, "Metodo di Steffensen" write(10,*) "Metodo di Steffensen" call Steffensen(b,f,toll_f,20,it,zero,var_zero,codice) if (codice==0) then print *,"App. zero=",zero," in ",it," iterazioni" print *,"Ultimo delta_zero=",var_zero write(10,*) "App. zero=",zero," in ",it," iterazioni" write(10,*) "Ultimo delta_zero=",var_zero else if (codice == 1) then print *, "convergenza non raggiunta" write(10,*) "convergenza non raggiunta" endif close(10) end program Test_Steffensen real function f(x) implicit none real,intent(in)::x f=x**2-3*x+2 return end function f subroutine Steffensen(b,f,toll_f,n_max,n,zero,var_zero,codice) implicit none real :: x1,x reaL :: b,f,toll_f,zero,var_zero,ff1,f1 integer :: i, n_max, codice, n codice = 1 x1= b do i=1,n_max f1 = f(x1) ff1 = f(x1+f1) x = x1-f1**2/(ff1-f1) if (abs(f(x))<toll_f) then codice = 0 zero = x n = i var_zero = abs(x-x1) exit endif x1 = x enddo return end subroutine Steffensen
Risposte
"jollypoker":
...
real function f(x)
implicit none
real,intent(in)::x
f=x**2-3*2+2
return
end function f
Hai scritto $f=x^2-3*2+2$ cioè $f=x^2-4$ ... oppure hai riportato male il codice?
ho scritto male qui, la funzione è x^2-3*x+2
Il parametro $a$ serve a qualcosa? Lo leggi ma poi non lo utilizzi...