clasefor4_vector.pdf
TRANSCRIPT
AREGLOS Y
MATRICES (I)
VARIABLES CON SUBÍNDICES; MATRICES A veces es necesario operar con elementos de un grupo o arreglo de números, también llamados matrices. Si tenemos un sistema de ecuaciones simultáneas:
AX + BY + CZ = R DX + EY + FZ = S GX + HY + PZ = T Para trabajar con ellos es necesario nombrar a los elementos de la matriz, con el objeto de identificarlos fácilmente.
C11X + C12Y + C13Z = SUM1 C21X + C22Y + C23Z = SUM2 C31X + C32Y + C33Z = SUM3
VARIABLES CON SUBÍNDICES; MATRICES Los arreglos en FORTRAN pueden tener de 1 a 5 dimensiones X,Y,Z Dimensiones espaciales. T tiempo. P Parámetro físico (Temperatura, Salinidad, Presión, densidad, etc)
ARREGLOS EN 1 DIMENSION.
X (1) , X (2) , X (3) , ………. ,X (N) . Variable Real 1 Dim. (1xN)
ARREGLOS EN 2 DIMENSIONES. X (1,1), X (1,2), X (1,3), ………… X (1,J) X (2,1), X (2,2), X (2,3), ………… X (2,J) ……………………………………… Variable Real 2 Dim. (K x J)
…………………………………….. X (K,1), X (K,2), X (K,3), ………… X (K,J)
REGLAS
Los arreglos o matrices tienen elementos Reales o Enteros, NUNCA
deben mezclarse los dos tipos de variables.
Los Subíndices, siguen al nombre de la variable y se encierran entre
paréntesis.
Los subíndices de más de una dimensión, se separan por comas.
Los subíndices deben ser valores positivos diferentes de cero.
Un subíndice puede ser constante, variables o una expresión entera.
A (7) ------> Real Z (3*N+3) ------> Real N (K) ------> Entero M (5*K-6) ------> Entero
PROPOSICIÓN DIMENSIÓN Antes de poder usar los elementos de una matriz, dentro del programa se debe definir las dimensiones del arreglo. REAL, DIMENSION(120) : : A INTEGER, DIMENSION(23) : : A DIMENSION A(9), B(12,18),K(9,15) REAL , DIMENSION(12,25) :: D REAL A(9), B(12,18) INTEGER K(9,15) Esta proposición debe aparecer antes de cualquier proposición ejecutable.
DIMENSIÓN A(5) DIMENSIÓN A(5) A(1) = 1.0 DO 10 N=1,5 A(2) = 1.5 A(N)=REAL(N+1)/2.0 ! Nunca combinar A(3) = 2.0 10 CONTINUE ! Enteros con Reales A(4) = 2.5 A(5) = 3.0
VECTORES
Un arreglo es un grupo de variables o constantes, todas del mismo tipo
referenciadas con un mismo nombre.
…. a(1) a(2) a(3) a(4) a(5) a(6) …..
arreglo
Cada valor individual se llama elemento
El subíndice indica la posición particular dentro del arreglo.
El subíndice es un ENTERO.
Es útil para aplicar un algoritmo a un gran número de datos a través de
ciclos
Ej DO i=1,100
b(i)=sqrt(a(i))
END DO
Los elementos de los arreglos son variables ordinarias y tienen que ser inicializadas antes de ser usadas. Si no se la inicializa su valor es indefinido. Pueden ser inicializados:
1. Sentencias de asignación elemento por elemento Se inicializa :
REAL, DIMENSION(10) : : A DO i=1,10 A(i) = REAL(i) END DO
INTEGER, DIMENSION(10) : : num, cuad DO i=1,10 num(i)=i+i cuad(i)= num(i)**2 END DO
REAL, DIMENSION(7) : : A A=(/1., 2., 3., 4., 5., 6., 7./)
REAL, DIMENSION(10) : : A A=0. ! todos los elementos iguales
VECTORES
2. Inicialización por sentencias de declaración Se inicializa de esta forma: INTEGER, DIMENSION (5) : : A = (/1, 2, 3, 4, 5 /) INTEGER, DIMENSION (5) : : B = (/(i, i=1,5)/) INTEGER, DIMENSION (25) : : C = (/((0, i=1,4), 5*j, j=1,5) /)
0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 15, 0, 0, 0, 0, 20, 0, 0, 0, 0, 25 REAL, DIMENSION (100) : : arreglo =1.0
3. Inicialización de arreglos con READ Valores de los arreglos Normalmente se usan valores de 1 a N Ej: REAL, DIMENSION (3) : : A ⇒ A(1), A(2), A(3) Muchas veces resulta útil que los subíndices tomen otros valores. Para definir los: REAL, DIMENSION (imin, imax) : : B Ej: REAL, DIMENSION (5) :: AA REAL, DIMENSION (-2 : 2) :: BB REAL, DIMENSION ( 7:11) :: CC Los 3 arreglos tienen la misma forma (igual dimensión e igual número de elementos
Se debe controlar que el índice se encuentre dentro de los límites del arreglo
A(1) A(2) A(3) A(4) A(5) B(1) B(2) B(3) B(4) ……
Si se utiliza el A(6) puede conducir a errores.
Uso de PARAMETER: Es mejor declarar el tamaño de los arreglos
usando PARAMETER y realizar cambios rápidamente.
Se utiliza para cambiar de manera simple el tamaño de los arreglos. INTEGER, PARAMETER : : imax=1000 REAL : : a1(imax) REAL : : a2(2*imax) REAL : : a3(imax,imax)
VECTORES
Subconjunto de un arreglo
Para utilizar una sección del arreglo se especifican los índices : inicio:fin:incremento subíndice triple Ej : INTEGER, DIMENSION : : A(/1, 2, 3, 4, 5, 6, 7, 8, 9, 10/) El subconjunto A( 1:10: 2) A(1), A(3), A(5), A(7) y A(9) 1, 3, 5, 7 y 9 inicio → 1 ; fin → 10 ; incremento → 2
Ej: INTEGER :: i=3, j=7
REAL, DIMENSION (10) :: a (/1., -2., 3., -4., 5., -6., 7., -8., 9., -10./)
a(:) → todos los elementos
a( i: j) → del tercer elemento al séptimo ( 3., -4., 5., -6., 7)
a(i: j: i) → del tercer elemento al séptimo saltando de a 3 (3., -6.)
a(i: j: j) → del tercer elemento al séptimo saltando de a 7 (3.)
a(i:) → del tercer elemento al final (3., -4., 5., -6., 7., -8., 9., -10)
a(j:) → del séptimo elemento al final (7., -8., 9., -10)
a(: : i) → todos los elementos saltando 3 (1., -4., 7., -10.)
SUBCONJUNTO DE UN VECTOR
Subíndice vector especifica uno a uno los elementos del arreglo a ser usados en el cálculo. Ej: INTEGER, DIMENSION (5): : vec =(/1, 6, 4, 1, 9/) REAL, DIMENSION (10) : : a (/1., -2., 3., -4., 5., -6., 7., -8., 9., -10./) a(vec ) → es el arreglo [1., -6., -4., 1., 9.]
Entradas y salidas
Elemento por elemento Con DO implícito WRITE( *, *) a(1), a(2), a(3), a(4) WRITE( *, *) (a(i), i=1,4) Imprime: a(1), a(2), a(3) y a(4) En general: WRITE( unidad , format) (var1, var2, …. Indice= icomienzo, ifin. incre) READ ( unidad , format) (var1, var2, …. Indice= icomienzo, ifin. incre) Dentro del write se pueden incluir tareas Ej: WRITE( *, * ) (i, 2*i, 3*i, i= 1,4) Imprime 1 2 3 4 2 4 6 8 3 6 9 12
SUBCONJUNTO DE UN VECTOR
Ejemplo: Definición y asignación de un vector.
PROGRAM VECTOR IMPLICIT NONE REAL, DIMENSION(10) :: ARRAY ARRAY=(/1,2,3,4,5,6,7,8,9,10/) ARRAY(1)=20 ARRAY(2:3)=(/3,4/) WRITE(*,*) ARRAY STOP END PROGRAM VECTOR El resultado de la ejecución de este programa es que el contenido de la variable vector debe ser: 20 3 4 4 5 6 7 8 9 10
VECTORES
PROGRAM suma IMPLICIT NONE INTEGER :: i REAL, DIMENSION (4) :: a=(/ 1., 2., 3., 4./) REAL, DIMENSION (4) :: b=(/ 5., 6., 7., 8./) REAL, DIMENSION (4) :: c, d,e ! Suma Elemento por elemento DO i=1,4 c(i)= a(i)+b(i) END DO d= a+b ! Suma en forma conjunta los elementos de los vectores e= a*b ! Escribo los resultados WRITE(*,*) 'c' DO i=1,4 WRITE(*,*) c(i) END DO WRITE(*,*) 'd', d WRITE(*,*)'e= ',(e(i), i= 1, 4) END PROGRAM suma
VECTORES
Otro ejemplo de declaración y asignación de vectores. PROGRAM VECTOR IMPLICIT NONE REAL, DIMENSION :: VEC INTEGER :: i INTEGER, DIMENSION (3) :: SUBS=(/1,7,10/) VEC=0 !USANDO UN DO IMPLICITO VEC=(/(I,i=1,10)/) !USANDO UN VECTOR INTEGER PARA ASIGNAR ELEMENTOS DE UN VECTOR VEC(SUBS)=2 WRITE(*,*)VEC END PROGRAM VECTOR
En este caso el contenido de VEC es 2 2 3 4 5 6 2 8 9 2
EJEMPLO: Escribir un programa que calcule el producto escalar de dos
vectores A y B : implicit none integer A(5) !matriz columna integer B(5) !matriz columna integer i,j,k,l,m,sum1,i1,j1 integer prod A=(/1, 2 , 3, 4, 5/) B=(/2, 4, 6, 8, 10/) ! open(1,file='A.txt') ! open(2,file='B.txt') do 10 i=1,5 ! READ(1,*)A(i) ! READ(2,*)B(i) 10 continue sum1=0 do k = 1,5 sum1= sum1+A(k) * B(k) end do write(*,*)sum1 end
A.txt B.txt
1 2
2 4
3 6
4 8
5 10
VECTORES Escribir un programa que lea una lista de datos y lo ordene de mayor a menor
dimension zmax(10) open(1,file=‘mayor.txt') do 20 J=1,10 read(1,*)zmax(J) 20 continue ! do 10 M=1,9 do 10 I=1,9 if(zmax(I).lt.zmax(I+1)) then tmp=zmax(I) zmax(I)=zmax(I+1) zmax(I+1)=tmp endif 10 continue do 30 K=1,10 write(*,93)zmax(K) 93 format(f7.2) 30 continue ! write(*,94)zmax 94 format(10(f6.2,1x)) end
output
8.42 6.34 6.32 5.32 4.23 1.23 1.12 -1.54 -2.31 -9.17
mayor.txt
1.23 4.23 6.32
-2.31 1.12 6.34 5.32
-1.54 -9.17 8.42