Quale versione del fortran utilizzi?
A cura di Giuseppe Ciaburro
Pubblicato il 24/08/2001
Algoritmo della bisezione per il calcolo degli zeri di una funzione.
Il criterio di
ricerca degli zeri più semplice consiste nel continuare a dividere in
due l'intervallo di ricerca iniziato, e continuare a scegliere l'intervallo
agli estremi del quale la funzione cambia segno.
Non è un criterio molto efficiente, ma sicuramente converge a qualcosa,
anche se la funzione è discontinua o ha punti di singolarità.
Se nell'intervallo ci sono più zeri, convergerà ad uno di questi.
Se c'è una discontinuità a gradino, convergerà alla discontinuità,
e se c'è un punto singolare convergerà al punto singolare.
| (1.2) |
| (1.3) |
![]() |
(1.4) |
Di seguito è riportato il codice in Fortran 90 che impelmenta l'algoritmo della bisezione per il calcolo degli zeri di una funzione.
program main
!programma in fortran 90 per il calcolo
!degli zeri di una funzione con il metodo
!di bisezione
integer, parameter ::m=20
real :: fa = 0.0, fb =1.0, f
real :: ga = 0.5, gb =2.0, g
interface
function f(x)
real, intent(in) :: x
end function
function g(x)
real, intent(in) :: x
end function g
end interface
print *, "first function f"
print *, "a =",fa, "b =",fb
call bisect(f,fa,fb,m)
print *, "second function g"
print *, "a =", ga, "b =",gb
call bisect(g,ga,gb,m)
end program main
function f(x)
real, intent (in) :: x
f = ((x)*x - 3.0)*x + 1.0
end function f
function g(x)
real, intent (in) :: x
g = x**3 - 2.0*sin(x)
end function
subroutine bisect(f,a,b,m)
integer, intent (in) :: m
real :: a, b, c, fa, fb, fc, error
interface
function f(x)
real, intent(in) :: x
end function f
end interface
fa = f(a)
fb = f(b)
if ( sign(1.0,fa) == sign(1.0,fb) ) then
print *,"function has same sign at",a,b
else
print *,"n c f(c) error"
error = b - a
do n = 0,m
error = error/2.0
c = a + error
fc = f(c)
if ( sign(1.0,fa) /= sign(1.0,fc) ) then
b = c
fb = fc
else
a = c
fa = fc
endif
print *, n, c, fc, error
end do
end if
end subroutine bisect