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.
Para repetir un cálculo una cantidad conocida de veces, usa un bucle for
%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
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
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
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.
%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!'
En matlab
la principal estructura de datos es el array.
% 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
Creamos un array M cuadrado NxN donde M(i,j) = 1+i+j
N = 5;
M = zeros(N, N);
for i = 1:N
for j = 1:N
M(i,j) = 1 + i + j;
end
end
M
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
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
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];
%### 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
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)
%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
matriz(3)
Empaqueta el código del cuadro ### LISTA DE COLLATZ ###
Llama a esa función para todos los números iniciales desde 1 hasta 20
Por ahora, sólo veremos un ejemplo con plt.plot
, que es el tipo de gráfica que más vamos a usar:
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);
#### 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