Tareas habituales

He intentado juntar en un cuaderno las tareas más habituales para empezar a resolver los ejercicios. Los ejemplos no están desarrollados. Tienes muchos más detalles en los cuadernos de la carpeta PYTHON o en multitud de manuales de python que puedes pedir al profesor.

Bucles

Para repetir un cálculo una cantidad conocida de veces, usa un bucle for

Ejemplo: Algoritmo babilonio para calcular raíces cuadradas

In [2]:
%Numero cuya raiz cuadrada queremos calcular
a = 2;
%Primera aproximacion a la raíz
x0 = 1;
% N veces iteraciones
N = 5;
for j = 1:N
    %Algoritmo babilonio para calcular raices cuadradas
    %https://es.wikipedia.org/wiki/C%C3%A1lculo_de_la_ra%C3%ADz_cuadrada#Algoritmo_babil%C3%B3nico
    x0 = (x0 + a/x0)/2
end
x0 =  1.5000
x0 =  1.4167
x0 =  1.4142
x0 =  1.4142
x0 =  1.4142

Si necesitas iterar hasta que se cumpla una condición, y no sabes a priori cuántas veces vas a iterar, usa un bucle while.

Por ejemplo, usamos el algoritmo anterior hasta que el error es menor que un cierto umbral

In [5]:
a = 2;
x0 = 1;
epsilon = 1e-4;

errory = abs(x0^2 - a);
while errory > epsilon
    x0 = (x0 + a/x0)/2
    errory = abs(x0^2 - a);
end
x0 =  1.5000
x0 =  1.4167
x0 =  1.4142

Atención: Los bucles while son peligrosos, un error puede hacer que el bucle no termine nunca. Si te ocurre, pulsa Control+C en el interfaz de matlab.

In [18]:
%Prueba con otros valores de n
n = 5
% Nadie sabe si este bucle while termina en tiempo finito
% para cualquier valor de n
% (conjetura de Collatz)
while n!=1
    if mod(n,2)==0
        n = floor(n/2)
    else
        n = 3*n+1
    end
end
'1!'
n =  5
n =  16
n =  8
n =  4
n =  2
n =  1
ans = 1!

Arrays

En matlab la principal estructura de datos es el array.

Crear un array y poblarlo según una fórmula

In [19]:
% Lista con los cuadrados de los N primeros números naturales
%range(N) empieza en 0 y termina en N-1
N = 10;
xs = zeros(1,N);
for j=1:N
    xs(j) = j**2;
end
xs
xs =

     1     4     9    16    25    36    49    64    81   100

Creamos un array M cuadrado NxN donde M(i,j) = 1+i+j

In [20]:
N = 5;
M = zeros(N, N);
for i = 1:N
    for j = 1:N
        M(i,j) = 1 + i + j;
    end
end
M
M =

    3    4    5    6    7
    4    5    6    7    8
    5    6    7    8    9
    6    7    8    9   10
    7    8    9   10   11

Crear un array con datos de otros arrays

Ejemplo, tenemos un array 1D P, y queremos conseguir un array 2D A, cuya primera columna consista de unos, y cuya segunda columna sea P

In [27]:
P_values = [20.79, 20.79, 22.4, 22.67, 23.15, 23.35, 23.89, 23.99, 24.02, 24.01, 25.14, 26.57, 28.49, 27.76, 29.04, 29.88, 30.06];
% el número de filas de P_values
[nfilas, ncolumnas] = size(P_values);
% dimensionamos el nuevo array
A = zeros(ncolumnas, 2);
% Sustituimos la primera columna de ceros, por unos
A(:,1) = ones(ncolumnas,1);
% Sustituimos la segunda columna de ceros, por P_values
A(:,2) = P_values;
A
A =

    1.0000   20.7900
    1.0000   20.7900
    1.0000   22.4000
    1.0000   22.6700
    1.0000   23.1500
    1.0000   23.3500
    1.0000   23.8900
    1.0000   23.9900
    1.0000   24.0200
    1.0000   24.0100
    1.0000   25.1400
    1.0000   26.5700
    1.0000   28.4900
    1.0000   27.7600
    1.0000   29.0400
    1.0000   29.8800
    1.0000   30.0600

Si quieres guardar resultados, pero no sabes cuántos, puedes combinar un bucle while con un array que crece de forma dinámica, usando la notación

A = [A x];
In [28]:
%### LISTA DE COLLATZ ###
%Prueba con otros valores de n
n = 3;
collatz = [n];
% Nadie sabe si este bucle while termina en tiempo finito
% para cualquier valor de n
while n!=1
    if mod(n,2)==0
        n = floor(n/2);
    else
        n = 3*n+1;
    end
    collatz = [collatz n];
end
collatz
collatz =

    3   10    5   16    8    4    2    1

Funciones

Siempre que quieras repetir un código cambiando ligeramente los datos, crea una función que devuelva un resultado.

function [out1, out2] = mi_funcion(argumento1, argumento2)
%Documentación de la función
%
%  argumento1: describe el tipo de datos aceptable y el papel que juega
%  argumento2: idem
%
%    Devuelve x, y
... haz todos los cálculos intermedios que necesites ...
%Este comentario no es parte de la documentación
%y almacena el resultado en las variables out1, out2
out1 = ...
out2 = ...

El código de la función mi_funcion debe guardarse en un archivo mi_funcion.m, que debe estar en el path de matlab.

luego llama a la función con

x0,y0 = funcion(a,b)
In [29]:
%Empaquetamos código de un apartado anterior que crea una matriz NxN

function M = matriz(N)
%crea una matriz NxN cuyo elemento M[i,j] es 1+i+j
%   
%    N: número de filas (y columnas) del array
%    
%    Devuelve un array NxN
    M = zeros(N, N);
    for i=1:N
        for j=1:N
            M(i,j) = 1 + i + j;
        end
    end
end
In [30]:
matriz(3)
ans =

   3   4   5
   4   5   6
   5   6   7

Ejercicio:

Empaqueta el código del cuadro ### LISTA DE COLLATZ ###

Llama a esa función para todos los números iniciales desde 1 hasta 20

In [ ]:

Gráficas

  • Todas las gráficas deben tener título.
  • Todas las gráficas deben tener etiquetas en los ejes.
  • Si las cantidades representadas en los ejes tienen unidades, estas unidades deben aparecer en las etiquetas de los ejes.
  • Si muestras varias líneas en la misma gráfica, es necesaria una leyenda.

Por ahora, sólo veremos un ejemplo con plt.plot, que es el tipo de gráfica que más vamos a usar:

In [39]:
x_samp = [194.5, 194.3, 197.9, 198.4, 199.4, 199.9, 200.9, 201.1, 201.4, 201.3, 203.6, 204.6, 209.5, 208.6, 210.7, 211.9, 212.2];
y_samp = [20.79, 20.79, 22.4, 22.67, 23.15, 23.35, 23.89, 23.99, 24.02, 24.01, 25.14, 26.57, 28.49, 27.76, 29.04, 29.88, 30.06];
[nfilas, ndatos] = size(x_samp);
# dimensionamos el nuevo array
A = zeros(ndatos, 2);
# Sustituimos la primera columna de ceros, por unos
A(:,1) = ones(ndatos,1);
# Sustituimos la segunda columna de ceros, por P_values
A(:,2) = x_samp;
b = y_samp';
sol = (A'*A)\(A'*b);
c = sol(1);
m = sol(2);
In [ ]:
#### Gráfica de la recta de regresión
plot(x_samp, y_samp,'r.')

hold on
plot(x_samp, y_samp,'r.')

% xs es un array con 200 elementos equiespaciados 
%  entre el minimo y el maximo de x_samp
xs = linspace(min(x_samp), max(x_samp), 200);
ys = xs*m+c;
plot(xs,ys,'g')

title('Regresion de la temperatura de ebullicion contra la presion atmosferica');
xlabel('Presion (mm Hg)');
ylabel('Temperatura (F)');
legend('data', sprintf("T = %.2f + %.2f*P;", c, m))
hold off
In [ ]: