Newton-raphson
USE prec
IMPLICIT NONE
INTEGER, PARAMETER :: maxit = 10000
INTEGER, PARAMETER :: hread = 5000
INTEGER :: i, hi, error, cross
REAL (KIND = ikr) :: memf,x1, x0, mem1, mem2, f, d
CHARACTER (8) :: msg
i = 0
hi = 0
error = 1
cross = 0
msg = "" !como también de los mensajes en vacío
WRITE (*,*) '_> Ingrese la semilla: '!Obtenemos la semilla a utilizar,
READ (*,*) x1 !La almacenamos en x1
!Una ayuda para los desconocedores del terminal
WRITE (*,*) '-(Si el bucle se hace infinito usar las teclas Ctrl + C)-'memf = fmath (x1) !Obtenemos el primer valor de la función en la semilla
!!! Main Loop - Este es el principal bucle !!!
DO
x0 = x1
f = fmath (x0) !Cálculamos el valor de la funciónen x0
d = dmath (x0) !y su derivada
!Si me encuentro con un MAX o min local la derivada debemos corrernos sino
!realizamos el c√°lculo
IF (d .NE. 0) THEN
x1 = x0 - ( f / d )
ELSEx1 = x1 + 1
END IF
! Para errores reiterativos, por ejemplo la f(x)=x^3-2x+2
! produce un error al buscar su raiz al poner una semilla positiva
! arbitraria, redunda en la posición0 y luego en la 1 indefinidamente.
! Recordamos los ultimos valores obtenidos y los comparamos en forma
! cruzada para saber si hemos llegado a un bucle infinito.
IF ( (mem1 .EQ. x1) .AND. (mem2 .EQ. x0) ) THEN
IF (x0 .LT. x1) THEN
x1 = x1 + x0
ELSE
x1 = x1 - x0
END IF
cross = cross + 1 !Incrementamos el valor de cruce para saber si el cruce es "inevitable"IF (cross .GT. MAXIT) THEN
msg = "CROSS"
EXIT
END IF
END IF
!¬øEl error se esta volviendo cuadratido por encima
!de MAXIT iteraciones del mismo?
IF ( (ABS(mem2)) .GT. (x1 **2)) THEN
error = error + 1
IF (error .GT. MAXIT) THEN
msg = "IT"
EXIT
END IF
END IF
!A travéz de la division de cada variable por ella misma
!logramos obtener el...
Regístrate para leer el documento completo.