Inter Po

También podría gustarte

Está en la página 1de 8

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/307171029

Código INTERPO.FOR en FORTRAN

Code · December 1989


DOI: 10.13140/RG.2.2.33255.44965

CITATIONS READS

0 191

1 author:

Andrés Granados
Simon Bolívar University
59 PUBLICATIONS   63 CITATIONS   

SEE PROFILE

Some of the authors of this publication are also working on these related projects:

Continuum Mechanics View project

Numerical Methods and Analysis View project

All content following this page was uploaded by Andrés Granados on 29 August 2016.

The user has requested enhancement of the downloaded file.


C
C INTERPO.FOR
C ***********
C
C FUNCIONES DE INTERPOLACION BASADA EN LOS POLINOMIOS DE
C NEWTON EN DIFERENCIAS DIVIDIDAS. PERMITE ENCONTRAR UN
C VALOR APROXIMADO DE LA FUNCION (DERIVADA) EN UN PUNTO NO
C ESPECIFICADO. NO REQUIERE QUE SE ESPECIFIQUE EL GRADO DEL
C POLINOMIO A UTILIZAR, LA RUTINA AUTOMATICAMENTE ENCUENTRA
C EL GRADO OPTIMO PARA UNA INTERPOLACION CONSISTENTE,
C SATISFACIENDO LAS CONDICIONES DE SIMETRIA DE LOS DATOS Y
C MONOTONIA DE LAS DIFERENCIAS DIVIDIDAS. LOS DATOS TAMPOCO
C REQUIEREN TENER UN ORDENAMIENTO REGULAR ASCENDENTE O
C DESCENDENTE. LA RUTINA NO CAMBIA EL ORDENAMIENTO ORIGINAL
C DE LOS PUNTOS.
C
C DOCUMENTADO EN:
C
C https://www.academia.edu/11942287/Criterios_Para_Interpolar
C
C https://www.academia.edu/12144494/Free_Order_Polynomial
C _Interpolation_Algorithm
C
C ELABORADO POR ANDRES L. GRANADOS M.
C UNIVERSIDAD SIMON BOLIVAR, DICIEMBRE DE 1989.
C
C (VERSION MAYO/2000)
C
C
C VARIABLES:
C *********
C
C DM = MINIMO VALOR DE "DX".
C DX = DISTANCIA EN VALOR ABSOLUTO ENTRE XI Y X(K).
C F(K) = VALOR DE LA DIFERENCIA DIVIDIDA DE ORDEN K-1 EN LA
C PENULTIMA O ULTIMA DIAGONAL ASCENDENTE. PUNTOS
C AGREGADOS POR DEBAJO.
C FK = VALOR DE LA DIFERENCIA DIVIDIDA DE ORDEN K-1 EN LA
C ULTIMA DIAGONAL ASCENDENTE.
C FKK = VALOR DE LA DIFERENCIA DIVIDIDA DE ORDEN K EN LA
C ULTIMA DIAGONAL ASCENDENTE.
C II(I) = APUNTADORES DEL ORDENAMIENTO DE LOS PUNTOS.
C IKM = II(KM)
C KM = INDICE "K" DE LA VARIABLE "X(II(K))" MENOS ALEJADA
C DE "XI".
C L = BANDERA PARA: 0 - INTERPOLACION, 1 - DERIVACION.
C CUANDO "L=1" LA FUNCION "YI" RETORNA EL VALOR DE
C LA DERIVADA DE LA FUNCION "Y" EN EL PUNTO
C "X(II(1))" (VALOR MAS CERCANO A "XI"), POR LO QUE
C SE DEBE ESCOGER COMO VALOR DE "XI" CUALQUIERA DE
C LOS VALORES "X(I)". CUANDO SE DESEA EL VALOR DE LA
C DERIVADA EN UN PUNTO INTERMEDIO "XI" ARBITRARIO,
C SE DEBE UTILIZAR LA FUNCION "DYI".
C LD = ORDEN DE LA DERIVACION NUMERICA REQUERIDO.
C M = MAXIMO NUMERO DE PUNTOS A USARSE EN LA
C INTERPOLACION. LIMITA EL GRADO DEL POLINOMIO A
C (M-1) COMO MAXIMO. ES UNA VARIABLE INTERNA EN LA
C FUNCION "YI".
C SI M = 0 (LINEA M=5 COMENTADA) ENTONCES SE CAMBIA
C A M = N.
C MX = MAXIMO NUMERO DE PUNTOS USADOS EFECTIVAMENTE EN LA
C INTERPOLACION, SATISFACIENDO LA CONDICION DE
C MONOTONIA.
C N = NUMERO TOTAL DE PUNTOS A EMPLEAR.
C PX = PRODUCTORIA DE XI-X(I) DESDE I=1 HASTA I.
C X(I) = VALORES DE LAS VARIABLES INDEPENDIENTES.
C XI = VALOR DE "X" DONDE SE DESEA INTERPOLAR.
C Y(I) = VALORES DE LAS VARIABLES DEPENDIENTES.
C DY(I) = DERIVADAS DE LA FUNCION "Y" EN LOS PUNTOS "X(I)".
C DDY(I)= DERIVADAS DE LAS DERIVADAS EN LOS PUNTOS "X(I)".
C YI = VALOR DE LA FUNCION "Y" (O LA DERIVADA) ENCONTRADA
C EN LA INTERPOLACION PARA EL PUNTO "XI"
C (O "X(II(1))").
C DYI = VALOR DE LA DERIVADA INTERPOLADA EN EL PUNTO "XI".
C
C
C NOTA: EXISTEN DOS FORMAS DE DECLARAR A LA FUNCION "YI":
C
C - FUNCTION YI(N,XI,X,Y,L)
C - FUNCTION YI(N,M,XI,X,Y,L,MX)
C
C (NO ES NECESARIO CAMBIAR EL RESTO DEL CODIGO DE
C "YI", EXCEPTO QUE EN LA SEGUNDA FORMA SE DEBE
C ELIMINAR LA INICIALIZACION M=0 o M=5 o M=OTRO
C NUMERO). CUANDO SE CAMBIA HAY QUE MODIFICAR TAMBIEN
C LAS RUTINA DE DERIVACION.
C
C - LA PRIMERA INTERPOLA USANDO HASTA LOS "N" PUNTOS.
C - LA SEGUNDA INTERPOLA USANDO HASTA CON "M" PUNTOS
C (1<=M<=N).
C
C EN CUALQUIER CASO, CUANDO NO SE SATISFACE LA
C CONDICION DE MONOTONIA, SE USAN MENOS PUNTOS.
C EL NUMERO DE PUNTOS EFECTIVAMENTE USADO,
C SATISFACIENDO LA CONDICION DE MONOTONIA, SE ASIGNA
C A LA VARIABLE "MX". LA SEGUNDA FORMA REPORTA ESTE
C VALOR COMO RESULTADO DENTRO DE LOS ARGUMENTOS.
C
C
CC EJEMPLO1:
CC ********
CC
C IMPLICIT REAL*8 (A-H,O-Z)
C IMPLICIT INTEGER (I-N)
C PARAMETER(NPP=100)
C DIMENSION XP(NPP),YP(NPP)
C CHARACTER*60 FNAME
CC
C READ(*,*) FNAME
CC
C NP=0
C OPEN(22,FILE=FNAME)
C DO WHILE(.NOT.EOF(22))
C NP=NP+1
C READ(22,*) XP(NP),YP(NP)
C WRITE(*,*) NP,XP(NP),YP(NP)
C ENDDO
C CLOSE(22)
CC
C DO WHILE(XI.GE.0.0D+00)
C READ(*,*) XI,LD
C WRITE(*,*) DYI(NP,XI,XP,YP,LD)
C ENDDO
CC
C STOP
C END
CC
CC FIN DEL EJEMPLO1
C
C
CC EJEMPLO2:
CC ********
CC
C IMPLICIT REAL*8 (A-H,O-Z)
C IMPLICIT INTEGER (I-N)
C PARAMETER(NPP=100)
C DIMENSION XP(NPP),YP(NPP),ZP(NPP,NPP)
C CHARACTER*60 FNAME
CC
C READ(*,*) FNAME
CC
C OPEN(22,FILE=FNAME)
C READ(22,*) NI,NJ
C READ(22,*) (XP(I),I=1,NI)
C READ(22,*) (YP(J),J=1,NJ)
C READ(22,*) ((ZP(I,J),I=1,NI),J=1,NJ)
C CLOSE(22)
CC
C DO WHILE(XI.GE.0.0D+00)
C READ(*,*) XI,YJ
C WRITE(*,*) ZI(NI,NJ,XI,YJ,XP,YP,ZP)
C ENDDO
CC
C STOP
C END
CC
CC FIN DEL EJEMPLO2
C
C
CC EJEMPLO3:
CC ********
CC
C IMPLICIT REAL*8 (A-H,O-Z)
C IMPLICIT INTEGER (I-N)
C PARAMETER(NPP=100)
C DIMENSION XP(NPP),YP(NPP),ZP(NPP),TP(NPP,NPP,NPP)
C CHARACTER*60 FNAME
CC
C READ(*,*) FNAME
CC
C OPEN(22,FILE=FNAME)
C READ(22,*) NI,NJ,NK
C READ(22,*) (XP(I),I=1,NI)
C READ(22,*) (YP(J),J=1,NJ)
C READ(22,*) (ZP(K),K=1,NK)
C READ(22,*) (((TP(I,J,K),I=1,NI),J=1,NJ),K=1,NK)
C CLOSE(22)
CC
C DO WHILE(XI.GE.0.0D+00)
C READ(*,*) XI,YJ,ZK
C WRITE(*,*) TI(NI,NJ,NK,XI,YJ,ZK,XP,YP,ZP,TP)
C ENDDO
CC
C STOP
C END
CC
CC FIN DEL EJEMPLO3
C
C
C FUNCTION YI(N,M,XI,X,Y,L,MX) !si se desea conocer el
C grado del polinomio utilizado (MX-1) y numero de puntos (MX)
C
FUNCTION YI(N,XI,X,Y,L)
IMPLICIT REAL*8 (A-H,O-Z)
IMPLICIT INTEGER (I-N)
PARAMETER(NNX=100)
DIMENSION X(N),Y(N),II(NNX),F(15)
C
M=0
C M=5 !si se desea limitar el grado del polinomio a M-1
MX=0
YI=0.0D+00
PX=1.0D+00
DO 10 I=1,N
10 II(I)=I
IF(M.EQ.0.OR.M.GT.N) M=N
DO 50 I=1,M
DM=DABS(XI-X(II(I)))
DO 20 K=I,N
DX=DABS(XI-X(II(K)))
IF(DX.LE.DM) KM=K
20 DM=DMIN1(DM,DX)
IKM=II(KM)
II(KM)=II(I)
II(I)=IKM
FK=Y(II(I))
IF(I.EQ.1) GOTO 40
F(1)=Y(II(I-1))
DO 30 K=1,I-1
IF(K.GT.1.AND.FK*F(K).LT.0.0D+00) GOTO 60 ! RUPTURA DE LA
MONOTONIA
FKK=(FK-F(K))/(X(II(I))-X(II(I-K)))
F(K)=FK
30 FK=FKK
40 F(I)=FK
IF(I.EQ.1.AND.L.EQ.1) GOTO 50
YI=YI+PX*F(I)
PX=PX*(XI-X(II(I)))
50 CONTINUE
60 MX=MAX0(I-1,MX)
C
RETURN
END
C
C DERIVACION (ORDEN DE LA DERIVACION LD)
C
FUNCTION DYI(N,XI,X,Y,LD)
IMPLICIT REAL*8 (A-H,O-Z)
IMPLICIT INTEGER (I-N)
PARAMETER(NNX=100)
DIMENSION X(N),Y(N),DY(NNX),DDY(NNX)
C
DO 10 I=1,N
10 DDY(I)=Y(I)
DO 30 L=1,LD
DO 20 I=1,N
20 DY(I)=DDY(I)
DO 30 I=1,N
30 DDY(I)=YI(N,X(I),X,DY,1)
DYI=YI(N,XI,X,DDY,0)
C
RETURN
END
C
C
C FUNCION DE INTERPOLACION EN DOS DIMENSIONES. UTILIZA LA
C FUNCION YI(N,XI,X,Y,L) COMO AUXILIAR PARA HACER LAS
C INTERPOLACIONES UNI-DIRECCIONALES CON LAS VARIABLES "X"
C CONSTANTES.
C
C VARIABLES:
C *********
C
C NX = NUMERO DE VALORES DE "X" CONSIDERADOS EN LOS
C PUNTOS.
C NY = NUMERO DE VALORES DE "Y" CONSIDERADOS EN LOS
C PUNTOS.
C X(I) = VALORES DE UNA DE LAS VARIABLES INDEPENDIENTES.
C XI = VALOR DE "X" DONDE SE DESEA INTERPOLAR.
C Y(J) = VALORES DE OTRA DE LAS VARIABLES INDEPENDIENTES.
C YJ = VALOR DE "Y" DONDE SE DESEA INTERPOLAR.
C Z(I,J) = VALORES DE LA VARIABLES DEPENDIENTES. CADA VALOR
C DE Z(I,J) CORRESPONDE A UN VALOR DE X=X(I) Y A UN
C VALOR DE Y=Y(J).
C ZI = VALOR DE "Z" ENCONTRADO EN LA INTERPOLACION.
C ZX(I) = VALOR OBTENIDO CON UNA INTERPOLACION
C UNIDIRECCIONAL MANTENIENDO X=X(I) CONSTANTE.
C ZY(J) = VALOR DE Z(I,J) MANTENIENDO CONSTANTE X=X(I).
C
C
FUNCTION ZI(NX,NY,XI,YJ,X,Y,Z)
IMPLICIT REAL*8 (A-H,O-Z)
IMPLICIT INTEGER (I-N)
PARAMETER(NNX=100,NNY=100)
DIMENSION X(NX),Y(NY),ZX(NNX),ZY(NNY),Z(NNX,NY)
C
DO 20 I=1,NX
DO 10 J=1,NY
10 ZY(J)=Z(I,J)
20 ZX(I)=YI(NY,YJ,Y,ZY,0)
ZI=YI(NX,XI,X,ZX,0)
C
RETURN
END
C
C
C FUNCION DE INTERPOLACION EN TRES DIMENSIONES. UTILIZA LA
C FUNCION ZI(NX,NY,XI,XJ,X,Y,Z) COMO AUXILIAR PARA HACER LA
C INTERPOLACION BI-DIRECCIONAL CON LA VARIABLE "Z"
C CONSTANTE. LUEGO HACE UNA INTERPOLACION UNI-DIRECCIONAL EN
C LA VARIABLE "Z".
C
C VARIABLES:
C *********
C
C NX = NUMERO DE VALORES DE "X" CONSIDERADOS EN LOS
C PUNTOS.
C NY = NUMERO DE VALORES DE "Y" CONSIDERADOS EN LOS
C PUNTOS.
C NZ = NUMERO DE VALORES DE "Z" CONSIDERADOS EN LOS
C PUNTOS.
C X(I) = VALORES DE UNA DE LAS VARIABLES INDEPENDIENTES.
C XI = VALOR DE "X" DONDE SE DESEA INTERPOLAR.
C Y(J) = VALORES DE OTRA DE LAS VARIABLES INDEPENDIENTES.
C YJ = VALOR DE "Y" DONDE SE DESEA INTERPOLAR.
C Z(K) = VALORES DE OTRA DE LAS VARIABLES INDEPENDIENTES.
C ZK = VALOR DE "Z" DONDE SE DESEA INTERPOLAR.
C T(I,J,K)= VALORES DE LA VARIABLES DEPENDIENTES. CADA VALOR
C DE Z(I,J,K) CORRESPONDE A UN VALOR DE X=X(I),
C A UN VALOR DE Y=Y(J) Y A UN VALOR DE Z=Z(K).
C TI = VALOR DE "T" ENCONTRADO EN LA INTERPOLACION.
C TZ(K) = VALOR OBTENIDO CON UNA INTERPOLACION
C BI-DIRECCIONAL MANTENIENDO Z=Z(K) CONSTANTE.
C TXY(I,J)= VALOR DE T(I,J,K) MANTENIENDO CONSTANTE Z=Z(K).
C
C
FUNCTION TI(NX,NY,NZ,XI,YJ,ZK,X,Y,Z,T)
IMPLICIT REAL*8 (A-H,O-Z)
IMPLICIT INTEGER (I-N)
PARAMETER(NNX=100,NNY=100,NNZ=100)
DIMENSION X(NX),Y(NY),Z(NZ),TZ(NNZ),TXY(NNX,NNY),
* T(NNX,NNY,NZ)
C
DO 20 K=1,NZ
DO 10 J=1,NY
DO 10 I=1,NX
10 TXY(I,J)=T(I,J,K)
20 TZ(K)=ZI(NX,NY,XI,YJ,X,Y,TXY)
TI=YI(NZ,ZK,Z,TZ,0)
C
RETURN
END
C

View publication stats

También podría gustarte