Guia1 2024 Fortran

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 7

Métodos Numéricos

Guı́a 1
Marzo de 2024

Nota: La información, en la computadora que use, es guardada de forma permanente, en lo que se suele
llamar disco rı́gido. Es su responsabilidad mantener un sistema ordenado de trabajo, donde la información
está guardada en un árbol natural de organización. Dependiendo del sistema operativo, cuando se inicia una
ventana de trabajo o terminal, se puede estar en la ubicación inicial, que genéricamente llamaremos home,
que por ejemplo podrı́a ser:
/home/jaimito
si se está en linux (ubuntu). En el lugar donde en el ejemplo aparece jaimito deberı́a aparecer su nombre
de usuario. De aquı́ en adelante asumimos que trabaja con un sistema operativo linux, como por ejemplo
ubuntu.
Ejercicios de linux

Problema 1: En una terminal, estando en su directorio inicial de trabajo (home), cree un directorio nuevo
llamado metodos numericos; a propósito sin acento. Cambie de directorio desde el inicial al directorio
metodos numericos. En ese directorio cree otro directorio llamado guias; a propósito sin acento. Descargue
desde el navegador el archivo de esta guı́a y mueva el mismo al nuevo directorio. Cambie el nombre del archivo
a guia1.pdf y copie el archivo a otro con nombre Copia.pdf. Luego, liste el contenido del directorio y verifique
los nombres y el tamaño y fecha de los mismos. Averigüe qué espacio ocupa el directorio usando el comando
du -h. Finalmente, borre el archivo Copia.pdf. Para ver en qué lugar del árbol de directorio está, ejecute el
comando pwd.

Problema 2:

ˆ Asegúrese de que se encuentra en el directorio metodos numericos (pwd).

ˆ Cree 2 carpetas: ejercicios1, ejercicios2 (utilizando “mkdir”).

ˆ Acceda a ejercicios1 (utilizando “cd”).

ˆ Allı́, cree un archivo de texto llamado ”file1.dat” con la frase ”Hola mundo” (utilizando “kate”).
Asegúrese de guardarlo.
ˆ Sin moverse del directorio ejercicios1, haga una copia del archivo ”file1.dat” dentro de ejercicios2, y
llámela ”file1 copia.dat” (utilizando “cp”).
ˆ Acceda al directorio ejercicios2 (con “cd”) y verifique la existencia del archivo ”file1 copia.dat” en ese
directorio (con “ls”).

ˆ Muestre el contenido del archivo usando el comando ”cat”.

ˆ Cambie el nombre del archivo ”file1 copia.dat” a ”file1 movido.dat”, utilizando “mv”.

ˆ Ubı́quese en el directorio metodos numericos, haciendo “cd ..”. Haga “ls” (para ver el contenido) y
“pwd”.

ˆ Borre el directorio “ejercicios2” con todo su contenido, haciendo “rm -Rf ejercicios2”.
Ejercicios de gnuplot

Problema 3: Utilice el programa gnuplot para graficar la función f (x) = sin(2πx), para x ∈ [0 : 5]. Ajuste
la cantidad de puntos que usa gnuplot para graficar (samples) a 500 para mejorar la calidad del gráfico. Dé
nombre a los ejes, tı́tulo al gráfico y defina la leyenda para que aparezca f (x).

Problema 4: Abra una terminal y realice las siguientes acciones:

a) Vaya al directorio:
/home/jaimito/metodos numericos/
Donde, en lugar de “jaimito”, debe ser el nombre de su usuario. Allı́ cree el directorio
guia1
b) En ese nuevo directorio ejecute el editor kate liberando la lı́nea de comandos (utilice el sı́mbolo &).
c) En el editor de texto ingrese los siguientes datos en tres columnas, separados por dos espacios:

0.0 1.0 1.2


1.0 1.5 1.6
2.0 2.0 2.0
3.0 2.5 2.4

Grabe esta tabla en el archivo datos.dat. No cierre el editor.


d) Ahora utilice gnuplot para graficar la 2da y la 3era columna versus la primera. Grafique usando sólo
puntos. En el mismo gráfico incluya las funciones y = 0.5x + 1 y y = 0.4x + 1.2. Nombre al eje
horizontal x y al vertical y. Habilite la grilla. Titule el gráfico Funciones lineales. Cree archivos de
salida en formato png, pdf y postscript color y blanco y negro (nómbrelos p4.png, p4.pdf, p4 color.ps
y p4 byn.ps respectivamente). Abra otra terminal y con la aplicación okular visualice los archivos
de salida, a medida que los va generando). Luego, experimente graficar cambiando el tamaño de los
puntos y el grosor de las lı́neas, etc.

e) Liste los archivos del directorio mostrando su tamaño y fecha. Averigüe qué espacio ocupan los archivos.
Finalmente, cierre la ventana del editor. Borre los archivos postscript y cierre la terminal.

Ejercicios de Fortran

Problema 5: Evaluar con un programa Fortran las siguientes operaciones matemáticas. Realice todas
las operaciones en forma secuencial en un mismo programa. Imprima por pantalla cada operación y su
resultado.

a) A = 5 / 2 + 20/ 6
b) B = 4 * 6 / 2 - 15 / 2
c) C = 5 * 15 / 2 / (4 - 2)

d) D = 1 + 1/4
e) E = 1. + 1/4
f ) F = 1 + 1./4
g) G = 1. + 1./4.

2
Problema 6: Escriba un programa Fortran que pida dos números reales e imprima en la pantalla el
mayor de ellos. El programa debe indicar si los números son iguales.

Problema 7: Escriba un programa Fortran que pida un número entero y determine si es múltiplo de 2 y
de 5.

Problema 8: Escriba una programa que ingrese los coeficientes A, B y C de un polinomio real de segundo
grado (Ax2 + Bx + C), calcule e imprima en pantalla las dos raı́ces del polinomio en formato complejo a + ib,
sin utilizar algebra compleja.

Problema 9: Implementar un programa Fortran para evaluar la suma (en precisión simple)
10 000
X000 1
n=1
n

primero, en el orden usual, y luego, en el orden opuesto. Explique las diferencias obtenidas e indique cuál
es más preciso y su justificación.

Problema 10: Diseñar una función que calcule la potencia enésima de un número, es decir que devuelva
X n para X real y n entero. Realice un programa que utilice la función e imprima en pantalla las primeras
5 potencias naturales de un número ingresado.

Problema 11: Escriba un programa, que utilizando una subrutina, multiplique un vector de N elementos,
por una matriz de N × N . El programa debe preguntar el valor de N y luego definir los arreglos, y darle
valores iniciales tal que, la matriz sea triangular superior, con todos sus elementos igual a 1, excepto los de
la diagonal que toman valor 3. El vector tendrá todos sus elementos pares igual a 2, y los impares igual a 3.

Problema 12: Se determinaron 9 mediciones de concentraciones de fósforo en un campo y los datos


obtenidos fueron:
479.80 ; 499.10 ; 510.20 ; 508.60; 503.30 ; 501.20; 507.30 ; 499.90 y 468.60.

a) Escriba estos valores en un archivo, en forma de columna y llame a este archivo datos1.dat.
b) Escriba un programa en fortran que pregunte el número de datos (9 en este caso), a ser ingresado
por teclado, que lea del archivo datos1.dat todos los valores guardándolos en un vector y que luego
calcule y muestre por pantalla el promedio y la desviación estándard de los datos. Además de mostrar el
resultado por pantalla, el programa debe escribirlo en un archivo llamado resultados1.dat. El programa
debe llamarse p1.f90
c) Utilice el programa para calcular el promedio y desviación estándard de los datos mencionados.

Nota:
El promedio se calcula de la siguiente forma:
n
1X
x= xi (1)
n i=1

siendo n el número de datos.


La desviación estándard se calcula de la siguiente forma:
v
u n
u 1 X
σ=t (xi − x)2 (2)
n − 1 i=1

siendo n el número de datos.

3
Alternativamente se puede utilizar la siguiente fórmula:
v
u n
u 1 X
σ=t ( x2 − nx2 ) (3)
(n − 1) i=1 i

Problema 13: Escriba un programa que permita convertir números naturales con base 10 a la base b <= 16.
El programa debe pedir como entrada b y el número natural a convertir (que debe estar en base 10). Utilice
SELECT CASE para asignar los dı́gitos (del resultado en base b). Utilice CASE DEFAULT (para asignar los
dı́gitos del 0 al 9).

Problema 14: Efectúe con un programa en Fortran en simple precisión los siguientes cálculos, matemáticamente
equivalentes,

a) 1 000 000 × 0.1


P1 000 000
b) n=1 0.1
P1 000 P1 000 

c) m=1 n=1 0.1

Explique las diferencias obtenidas entre resultados finales de a), b) y c) y muestre que el error relativo en b)
es del orden del 1%, pero es mucho menor en c). Resalte la conclusión de este ejercicio.

d) En los puntos b) y c), vaya guardando con un write (cada 1000 iteraciones en el caso b, y en todas
las iteraciones de la suma externa en c), los errores parciales en un archivo de datos. La primera
columna con los valores de los ı́ndices (multiplicados por 1000 para el caso c) de las sumas y segunda
columna con el error parcial, i.e., la diferencia entre el valor de la respectiva suma parcial y el valor
exacto (i ∗ 0.1). Grafique usando gnuplot, los errores parciales de b) y c) superpuestas, en función del
ı́ndice correspondiente, en un archivo“prob13.pdf” en color, con tı́tulo de gráfica“Problema 18, Guı́a
1”, con nombres adecuados en los ejes y con leyendas adecuadas. Los datos del b), graficarla con
puntos de tamaño 0.75 (el default es 1), y los de c) con lı́nea de grosor 1.6 (el default es también 1).
Luego de ver cómo le queda la gráfica en escala lineal, cambie el eje x, a escala logarı́tmica. Según su
criterio, en qué escala se aprecia mejor el resultado del problema para su análisis? Puede al eje y darle
escala logarı́tmica? Pruebe qué pasa si lo hace. Analice la conveniencia en general del uso de escalas
logarı́tmicas.
Finalmente deje el archivo grabado en escala lineal en y, y logarı́tmica en x, y diga el tamaño del
mismo tanto en bytes como Kbytes.

Problema 15:
Calcular sin(x), según su desarrollo en series de Taylor, teniendo en cuenta que:

X (−1)n 2n+1
sen(x) = x (4)
n=0
(2n + 1)!

Aproximar con los 9 primeros términos (hasta n = 8). Es decir, calcular:

8
X (−1)n 2n+1
sen(x) = x (5)
n=0
(2n + 1)!

Para ello:

a) Resuelva el problema para x = 0.1.

4
b) Realice los cálculos en simple precisión.
c) Guarde en un vector de números enteros, las factoriales hasta 2nmax + 1, siendo nmax = 8. (Ayuda1:
Utilice un “do” para ello. Ayuda2: al realizar operaciones, preste atención a si está trabajando con
enteros o con reales).

d) Calcule la suma desde 0 hasta nmax de los términos en orden directo.


e) Calcule la suma de los términos en orden inverso (es decir, desde nmax hasta 0).
f ) Muestre por pantalla el resultado de ambas sumas y el verdadero valor de sin(x).
g) Para el caso de la suma directa, vaya guardando en un archivo (llamado seno.dat) los sucesivos pasos
de la suma y el error cometido (la diferencia con el verdadero valor de sin(x)).
h) Analice cuál de las dos formas de sumar se aproxima más al resultado exacto y explique por qué.

Ejercicios Complementarios

Problema 16: Escriba un programa para calcular la posición y la velocidad en función del tiempo, para
un problema de tiro oblicuo. Debe preguntar el ángulo (en grados) y la velocidad inicial (en m/seg.),
asumiendo que el proyectil parte del origen. Elija el incremento temporal (∆t) de manera que la gráfica
tenga 600 puntos y abarque el intervalo entre el disparo y el instante en que el proyectil vuelve a tener
altura 0. Utilice funciones para calcular la posición y la velocidad. Escriba la salida del programa en un
archivo de texto, con 5 columnas (t, x(t), y(t),vx (t),vy (t)). La primera lı́nea debe comenzar con #, e incluir
la descripción de los datos de cada columna. Los datos en la tabla deben tener 6 cifras significativas y estar
escritos en notación exponencial. Grafique x(t), y(t) y vy (t) en función de t, y la trayectoria del proyectil,
utilizando gnuplot.

Problema 17: Escribir un programa que pida una contraseña de tres dı́gitos y permita leer tres intentos.
Si el usuario da la contraseña correcta responde responde “Correcto” y queda inactivo, con este mensaje.
En caso contrario el programa escribe “Lo siento, contraseña equivocada” y se cierra de inmediato.

Problema 18: Escribir un programa que, dado un año y el nombre de un mes, saque por pantalla el número
de dı́as del mes (tenga en cuenta que algunos años son bisiestos).

Problema 19: Escriba un programa para calcular un valor aproximado de π utilizando

a) la fórmula recurrente de Arquı́medes, que acota π entre Pn y pn , con pn < π < Pn . Siendo pn y Pn
los perı́metros de los polı́gonos regulares de n lados inscriptos y circunscriptos, respectivamente, en la
circunsferencia de radio 1/2. La fórmula de recurrencia que encontró Arquı́mides es la siguiente:

2pn Pn
P2n =
pn + Pn
p
p2n = P2n pn

Usando los valores P6 = 2 3 y p6 = 3, correspondientes al hexágono, escriba un programa que realice
20 iteraciones, con n = 6 × 2k , y k = 1, · · · , 20, y escriba los resultados en pantalla.
b) la productoria de Wallis

π Y (2n)2 4 16 36 64
= 2
= ...
2 n=1
(2n) − 1 3 15 35 63

Calcule el valor de π truncando la productoria a 106 factores.

5
Problema 20: Escriba el siguiente programa y explique por qué los valores obtenidos no son iguales:

program test
implicit none
integer, parameter :: pr = kind(1.0)
real(pr) :: sum0,sum1
integer :: i
!
sum0 = 0. pr ; sum1 = 1. pr
do i=1,10000
sum0 = sum0 + 1.e-8 pr
sum1 = sum1 + 1.e-8 pr
end do
sum0 = sum0 + 1. pr
write(*,*) sum0, sum1
end program test

Problema 21: Dado el siguiente programa y su correspondiente subrutina:

program test
implicit none subroutine sum(z,w,ss)
real(kind(1.)) :: x, y,s implicit none
integer :: i,j real(kind(1.)), INTENT(IN) :: z, w
i = 6; j = 3; x = 4.; y = 8. real(kind(1.)), INTENT(OUT) :: ss
call sum(i,x,s) ss = z + w
write(*,’(F4.1,” + ”,F4.1,” = ”,F5.1)’) real(i),x,s end subroutine sum
end program test

Escriba, compile y ejecute el programa de las siguiente manera:

a) con el programa tal como está, incluyendo la subrutina en el mismo archivo o en archivo separado.
b) modificando el programa con la cláusula CONTAINS, para que contenga a la subrutina.

c) creando un modulo que contenga la subrutina, y usando este en el programa.

Verifique que en el primer caso compila sin errores y produce resultados incorrectos, y en los otros casos no.

Problema 22: Interprete el resultado de los siguientes programas en virtud de la representación de punto
flotante de los números reales.

ˆ program test igualdad


implicit none
integer, parameter :: pr=kind(1.d0) ! pr puede ser simple o doble

if (19.08 pr + 2.01 pr == 21.09 pr) then


write(*,*) ’19.08 + 2.01 = 21.09 ’
else
write(*,*) ’19.08 + 2.01 /= 21.09 ’
endif
end program test igualdad

6
ˆ program test igualdad2
implicit none
integer, parameter :: pr=kind(1.d0) ! pr puede ser simple o doble
real(pr) :: a

a = 2.05 pr
if (a*100. pr == 205. pr) then
write(*,*) ’2.05*100 = 205 ’
else
write(*,*) ’2.05*100 /= 205 ’
endif
end program test igualdad2

Problema 23: Escriba un programa, que utilizando una subrutina, multiplique un vector de N elementos,
por una matriz de N × N . El programa debe preguntar el valor de N y luego definir los arreglos, y darle
valores iniciales tal que, la matriz sea triangular superior, con todos sus elementos igual a 1, excepto los de
la diagonal que toman valor 3. El vector tendrá todos sus elementos pares igual a 2, y los impares igual a 3.
No utilice DO para las inicializar el vector, ni DO anidados para inicializar la matriz.

Problema 24: La fórmula cuadrática nos dice que las raı́ces de ax2 + bx + c = 0 son
√ √
−b + b2 − 4ac −b − b2 − 4ac
x1 = , x2 = .
2a 2a
Si b2 ≫ 4ac, entonces, cuando b > 0 el cálculo de x1 involucra en el numerador la sustracción de dos números
casi iguales, mientras que si b < 0, esta situación ocurre para el cálculo de x2 . “Racionalizando el numerador”
se obtienen las siguientes fórmulas alternativas que no sufren este problema:
−2c 2c
x1 = √ , x2 = √ ,
b+ b2 − 4ac −b + b2 − 4ac
siendo la primera adecuada cuando b > 0, y la segunda cuando b < 0. Escriba un programa en precisión
simple que utilice la fórmula usual y la “racionalizada” para calcular las raı́ces de

x2 + 6210x + 1 = 0.

Interprete los resultados.

También podría gustarte