Programación Sentencia While Prof. Miguel Hesiquio Garduño. Depto. De Ingeniería Química Petrolera ESIQIE‐IPN [email protected] Usando Sentencia DO While Usando Sentencia DO WHILE Do i=1,fin X=2*Xo/Xo^2 Acciones Do While (condicion) if (condicion) exit X=2*Xo/Xo^2 Xo=X End Do F condicion Xo=X C=C+1 End Do V Acciones program PFijo REAL :: X0,X,eps,DIF INTEGER :: i,maxit WRITE(*,*) ' programa para punto fijo' PRINT *,'escribe X0' read *,X0 PRINT *,'escribe eps' read *,eps PRINT *,'escribe maximo de iteraciones' read *,maxit Do i=1, maxit !inicion i=1, fin X=20/(X0*X0+2*X0+10) ! x=g(x0) !enunciados DIF=ABS(X-X0) if (dif<eps) exit !control SI X0=X End do IF (DIF<eps)then Print *,X, 'Solucion' Else Print *,'Intenta otra vez' end if END program Pfijo DO Acciones V condicion F Acciones PROGRAM whilePF IMPLICIT NONE REAL :: X0,X,DIF,eps INTEGER :: i,maxit WRITE(*,*) ' programa para punto fijo ' PRINT *,'escribe X0 ' read *,X0 PRINT *,'escribe eps ' read *,eps PRINT *,'escribe maximo de iteraciones ' read *,maxit i=1 Do WHILE (i<maxit) X=20/(X0*X0+2*X0+10) ! x=g(x0) DIF=ABS(X-X0) X0=X i=i+1 End do IF (DIF<eps)then print *,'SOLUCION' Print *,X else Print *,'solucion NO ENCONTRADA' end if end program DO WHILE Acciones V condicion F Acciones ¿PUEDE MEJORARSE?, VERIFICAR program PFijo REAL :: X0,X,eps,DIF INTEGER :: i,maxit WRITE(*,*) ' programa para punto fijo' PRINT *,'escribe X0' read *,X0 PRINT *,'escribe eps' read *,eps PRINT *,'escribe maximo de iteraciones' read *,maxit i=1 !inicializamos el contador Do ! un Do más simple acciones: X=20/(X0*X0+2*X0+10) ! x=g(x0) !enunciados DIF=ABS(X-X0) if (i>maxit) exit ! condicion X0=X ! Acciones i= i+1 End do IF (DIF<eps)then Print *,X, 'Solucion' Else Print *,'Intenta otra vez' end if END program Pfijo DO Acciones V condicion F Acciones Todo se escribe en la misma hoja! Implementando la subrutina de cálculo de la función program PFijo REAL :: X0,X,eps,DIF INTEGER :: i,maxit ! los cambios en este caso se realizan dentro del ciclo DO Do !un Do más simple, acciones: call funciones(X0,gx0) !llama a la subrutina que calcula la función X=gx0 ! x=g(x0) !enunciados DIF=ABS(X-X0) if (i>maxit) exit ! condicion X0=X ! Acciones i= i+1 End do !un Do con estructura If incluida es equivalente a While IF (DIF<eps)then Print *,X, 'Solucion' Else Print *,'Intenta otra vez' end if END program Pfijo subroutine funciones(X0,gx0) !cálculo de la función a evaluar en el programa principal gx0=20/(X0*X0+2*X0+10) !esta es la funcion que se evaluará return end A manera de discusión Do WHILE (i<maxit) X=20/(X0*X0+2*X0+10) x=g(x0) DIF=ABS(X-X0) X0=X i=i+1 End do • ! Que DIF sea menor que eps en un numero menor de cálculos que el establecido por maxit, genera gasto innecesario Do WHILE (DIF<eps) X=20/(X0*X0+2*X0+10) DIF=ABS(X-X0) X0=X i=i+1 End do • ! x=g(x0) Al usar como criterio DIF y EPS se asegura llegar a la solución, pero en cuantos pasos ? (los contadores i) • Es posible optimizar el desempeño de los ciclos, tomando la comparación que lleve la menor cantidad de cálculos y considerando el problema a resolver