informática - guión de prácticas



Para hacer cada ejercicio crea un archivo nuevo y, antes de empezar a escribir, grábalo con un nombre que sea una sola palabra sin signos "raros" y extensión .f90 en la carpeta alumno/simple (donde debe encontrarse el "Makefile").

Recuerda que después de "program" hay que poner un nombre (usando únicamente letras sin tilde o números), diferente de cualquier variable o función usada en el programa, y que es necesario declarar las variables que necesites inmediatamente después de "implicit none".

Cuando consigas que los programas funcionen correctamente transcríbelos a mano al cuaderno, incluyendo el enunciado y el tiempo total que has empleado en su resolución.


Sesión F0 (2016.09.20) Operaciones numéricas.

Sesión F1 (2016.09.27) Variables. Condiciones.

E.1.1 ecuación de segundo grado.


F.1.1 Escribe un programa que calcule e imprima el valor de la razón áurea

$$g = \frac{1+\sqrt{5}}{2} $$

y comprueba si cumple (aproximadamente) la ecuación

$$\frac{g+1}{g} = g$$

Recuerda que algunas funciones requieren argumentos reales y no funcionan con enteros. Por ejemplo, en lugar de sqrt(5) debemos poner sqrt(5.0) ó simplemente sqrt(5.). Si lo que tenemos es una variable entera n, hacemos sqrt(real(n)).

F.1.2 Escribe una expresión que convierta grados Fahrenheit en grados centígrados y comprueba su funcionamiento con unos cuantos valores de F.

$$C = \frac{F-32}{1.8}$$

(No te preocupes por ahora por la entrada de datos, puedes almacenar el valor que deseas convertir directamente en una variable.)

F.1.3 Utilizando las operaciones numéricas de tipo COMPLEX comprueba que

$$e^{i\pi}+1=0$$

F.1.4 Escribe un programa para resolver la ecuación de tercer grado.

Sesión F2 (2016.10.04) Bucles.

E.2.1 READ

E.2.2 do simple

E.2.3 tabla de conversión F-C

E.2.4 sumatorio

E.2.5 divisores

E.2.6 mcd

E.2.7 mcd (exit, stop)

E.2.8 aproximaciones sucesivas


F.2.1 Haz una tabla de conversión de grados Fahrenheit a Celsius, de $32F$ hasta $212F$ con una separación de $0.5F$.

F.2.2 Escribe un programa para calcular:

$$\sum_{k=10}^{30} 2k^3-k^2+5k$$

F.2.3 Escribe un programa que imprima todos los divisores propios impares de un número.

F.2.4 Escribe un programa que imprima las tablas de multiplicar.

F.2.5 Escribe un programa para calcular el máximo común divisor de dos números mediante el algoritmo de divisiones sucesivas.

F.2.6 Comprueba el teorema de Nichomacus para unos cuantos valores de $n$:

$$1^3 + 2^3 + 3^3 + \ldots + n^3 = (1+2+3+\ldots+n)^2 $$

F.2.7 Escribe un programa que calcule la raíz cúbica de un número mediante aproximaciones sucesivas.

Sesión F3 (2016.10.11) Funciones y arrays (Parte I).

E.3.1 función entera sencilla

E.3.2 función real, con una condición

E.3.2b función mcd, con variable local

E.3.4 operaciones con vectores

E.3.5 return, subroutine, logical, pack, argumento y resultado vector, allocatable.


F.3.1 Escribe una función para calcular el área de un triángulo a partir de las longitudes de sus lados (fórmula de Heron).

F.3.2 Calcula el sumatorio del ejercicio F.2.2 utilizando un vector.

F.3.3 Define la función factorial y apoyándote en ella define una función para calcular los coeficientes binomiales.

F.3.4 Escribe una función para calcular la distancia entre dos puntos de $\mathbb R^n$.

F.3.5 Escribe una función para calcular el área de un triángulo a partir de las coordenadas de sus vértices (expresadas como vectores de dimensión 2). Apóyate en F.3.1 y en F.3.4.

F.3.6 Descubre cuántos números primos consecutivos genera la expresión $n^2-n+41$ para n = 1,2,...

F.3.7 Intenta encontrar el número perfecto el número perfecto más grande que puedas.

F.3.8 Podemos representar fracciones mediante vectores enteros de 2 elementos. Escribe una función que reciba una fracción y devuelva la fracción irreducible equivalente. Puedes apoyarte en F.2.5.

Sesión F4 (2016.10.18) Gráficos

E.4.1 funciones gráficas

E.4.2 animaciones

E.4.3 plot, curvas paramétricas, linspace


F.4.1 Dibuja una campana de Gauss.

F.4.2 Dibuja una espiral.

F.4.3 Dibuja figuras de Lissajous.

F.4.4 Dibuja una rosa.

F.4.5 Crea una animación original.

Sesión F5 (2016.10.25) Simulaciones

E.5.1 Frecuencia de éxitos de un experimento aleatorio (Ejemplo exper.f90 de la carpeta graphics).

En la segunda parte de la sesión resolvemos algunos problemas físicos sencillos mediante una aproximación numérica a la derivada de una función (método de Euler). En resumen, para un $\Delta x = x _ {k+1} - x _ k$ suficientermente pequeño podemos aproximar la derivada como el cociente de incrementos finitos:

$$\frac{df}{dx}(x_k) \simeq \frac{\Delta f}{\Delta x} = \frac{f(x _ {k+1})-f(x _ k)}{x _ {k+1} - x _ k}$$

Si conocemos la función y su derivada en un punto $x _ k$ podemos obtener una aproximación a su valor en un punto muy próximo:

$$ f(x _ {k+1}) \simeq f(x _ k) + \Delta x \frac{df}{dx}(x_k) $$

E.5.2 Gráfica de una función y de su integral (euler0.f90).

E.5.3 Solución mediante el método de Euler de $x''(t) = a x(t) + b x'(t)$ (euler1.f90).

E.5.4 Solución mediante el método de Euler del lanzamiento de un objeto con fricción.


F.5.1 Determina mediante simulación qué suceso es más probable: a) obtener al menos un seis al lanzar 6 dados, b) obtener al menos 2 seises al lanzar 12 dados. c) obtener al menos 3 seises al lanzar 18 dados.

F.5.2 Simulación de una órbita planetaria (newton.f90).

F.5.3 Investiga lo que ocurriría si la fuerza de la gravedad no fuera cuadrática inversa.

F.5.4 Escribe un programa para simular la interacción gravitatoria de 3 objetos (tal vez merezca la pena resolver el problema general de N cuerpos). Explora los puntos de Lagrange.

F.5.5 Escribe un programa para simular en 2D el movimiento de un peso colgado de un muelle.

F.5.6 Representa el atractor de Lorenz.

Ejercicios propuestos

F.6.1 Dibuja un polígono regular de n lados que se apoya en el segmento (x1,y1) (x2,y2).

F.6.2 Haz un programa que aplique el método de Newton para encontrar la solución de una ecuación f(x)=0.

F.6.3 Calcula una aproximación numérica a la siguiente integral usando una aproximación lineal a trozos con 20 intervalos:

$$ \int_0^1 e^{-2x^2}\cos(3\pi x) dx $$

F.6.4 Escribe una función para calcular la desviación típica de un conjunto de números. Puedes partir del siguiente esqueleto:

program desvtip
    implicit none
    real :: x(10) = [3.5, -2.8, 1.8, 7.4, 8., 0., 3., 4., 11., -13.1]

    print *, std(x)

contains

! ???

end

F.6.5 Observa el resultado del siguiente programa, en el que definimos una variable de tipo "cadena de caracteres" y extraemos de ella una subsecuencia:

program p
    implicit none

    character(7) :: s = 'palabra'

    print *, s, s(3:5)
end

Usando algo parecido a esto, escribe un programa que calcule la letra del DNI (aquí explican la forma de hacerlo).

F.6.6 Escribe un programa que encuentre el segundo mayor número contenido dentro de un array de enteros.

F.6.7 Escribe una función para ordenar un array de enteros de menor a mayor.

F.6.8 Escribe una función para calcular el producto vectorial de dos vectores.

F.6.9 Escribe una versión recursiva de la función "máximo común divisor" de dos enteros.

F.6.10 Escribe una función que, dado un número inicial, calcula el número de pasos que necesita la secuencia "Collatz" para terminar. Utiliza esta función para encontrar el punto de partida menor que 1000 que requiere más pasos para terminar.

F.6.11 Observa el programa randwalk.f90. Haz experimentos computacionales para estudiar como aumenta la distancia de la partícula al origen con el paso del tiempo.

F.6.12 Modifica el programa tree.f90 para conseguir un aspecto más natural.

F.6.13 Observa el resultado de koch.f90 y modifícalo para dibujar un copo de nieve.

funciones especiales para vectores

size

sum, product

maxval, minval

maxloc, minloc

count, all, any

pack

funciones gráficas (provisional)

pizarra(ancho,alto,nombre_ventana), escala(x1,x2,y1,y2), autoescala(x1,x2,yc), ejes(b,s)

color(r,g,b), fondo(r,g,b)

punto(x,y), recta(x1,y1,x2,y2), rectangulo(x1,y1,x2,y2), trigono(x1,y1,x2,y2,x3,y3)

plot(xs,ys)

circulo(x,y,r), circunferencia(x,y,r)

texto(x,y,mensaje)

rectaA(x,y), avanza(distancia), gira(grados)

pixel(x,y,r,g,b), textow(x,y,mensaje)

esperatecla

saveimage(num), loadimage('file.bmp')

dibuja(f(tecla)), animate(f(tecla,time))

utilidades

linspace(a,b,n)

init_random_seed

random_integer(a,b), random_real(a,b)

randomsi(n,a,b), randomsr(n,a,b)

bernoulli(p)