clasefor4_vector.pdf

16
AREGLOS Y MATRICES (I)

Transcript of clasefor4_vector.pdf

Page 1: clasefor4_vector.pdf

AREGLOS Y

MATRICES (I)

Page 2: clasefor4_vector.pdf

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

Page 3: clasefor4_vector.pdf

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)

Page 4: clasefor4_vector.pdf

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

Page 5: clasefor4_vector.pdf

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

Page 6: clasefor4_vector.pdf

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

Page 7: clasefor4_vector.pdf

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

Page 8: clasefor4_vector.pdf

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

Page 9: clasefor4_vector.pdf

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

Page 10: clasefor4_vector.pdf

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

Page 11: clasefor4_vector.pdf

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

Page 12: clasefor4_vector.pdf

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

Page 13: clasefor4_vector.pdf

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

Page 14: clasefor4_vector.pdf

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

Page 15: clasefor4_vector.pdf

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

Page 16: clasefor4_vector.pdf

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