Metodo di steffensen in Fortran

jollypoker
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

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
Rggb1
"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?

jollypoker
ho scritto male qui, la funzione è x^2-3*x+2

Rggb1
Il parametro $a$ serve a qualcosa? Lo leggi ma poi non lo utilizzi...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.