Ejercicios MATLAB

Colección de ejercicios prácticos para aprender MATLAB

Ejercicio 1: Operaciones Algebraicas

Problema:

Define las tres variables variables a=1.5, b=4, c=3.5 y calcula el valor de:

\[d = \frac{a}{{\frac{b}{c} + \frac{{{c^2}}}{a}}}\]

Solución:

% Definir variables
a = 1.5;
b = 4;
c = 3.5;

% Calcular el denominador por partes para mayor claridad
den1 = b/c;
den2 = c^2/a;
den = den1 + den2;

% Calcular d
d = a/den

fprintf('El valor de d es: %.4f\n', d)
            

Ejercicio 2: Flujo de Gas

Problema:

Consideremos un gas que escapa de un tanque presurizado bajo un proceso adiabático. Su flujo másico se puede aproximar con la función: \[ f(P_{\text{ext}}, P_{\text{int}}, K) = P_{\text{int}} \sqrt{\frac{2K}{K-1} \left( 1 - \left( \frac{P_{\text{ext}}}{P_{\text{int}}} \right)^{\frac{K-1}{K}} \right)} \] donde \( P_{\text{int}} \) es la presión interna en el tanque, \( P_{\text{ext}} \) es la presión externa fuera del tanque t \( K \) es el coeficiente adiabático del gas. Escribe esta expresión en Octave y calcula su valor para los valores de \(K=1.4\), \( P_{\text{ext}} =1\) y \( P_{\text{int}} =2\). .

Solución:

% Definir constantes
K = 1.4;

% Crear función anónima para el flujo
flujo = @(P_ext, P_int,k) P_int*sqrt(2*K/(K-1) *  (1 - (P_ext/P_int)^((K-1)/K)));

% Calcular para ejemplo con P_ext = 1 atm y P_int = 2 atm
P_ext = 1;
P_int = 2;
resultado = flujo(P_ext, P_int);

fprintf('El flujo para P_ext=%.1f y P_int=%.1f es: %.4f\n', P_ext, P_int, resultado);
            

Ejercicio 3: Generación de Vectores

Problema:

Genera los siguientes vectores utilizando los operadores adecuados de Matlab/Octave:

\[ v_1 = [1, 3, 5, ..., 25] \] \[ v_2 = [0, 0.1, 0.2, ..., 1] \] \[ v_3 = [\pi, 2\pi, 3\pi, ..., 10\pi] \] \[ v_4 = [10, 9, ..., 1, 0] \]

Solución:

% Vector v1: de 1 a 25 con paso 2
v1 = 1:2:25

% Vector v2: de 0 a 1 con paso 0.1
v2 = 0:0.1:1

% Vector v3: múltiplos de pi hasta 10pi
v3 = pi*(1:10)

% Vector v4: cuenta regresiva de 10 a 0
v4 = 10:-1:0
            

Ejercicio 4: Evaluación de Funciones

Problema:

Genera un vector x de 30 componentes regularmente espaciadas entre 0 y π. Evalúa x en cada una de las funciones siguientes:

\[ f(x) = \frac{\log(x+2)}{x} \] \[ f(x) = x^2 + x - e^x \] \[ f(x) = e^{x^2} \sin(x) \]

Solución:

% Generar vector x
x = linspace(0, pi, 30);

% Evaluar funciones
f1 = log(x + 2)./x;
f2 = x.^2 + x - exp(x);
f3 = exp(x.^2).*sin(x);

% Graficar resultados
figure;
subplot(3,1,1);
plot(x, f1, 'b-', 'LineWidth', 2);
title('f(x) = log(x+2)/x');

subplot(3,1,2);
plot(x, f2, 'r-', 'LineWidth', 2);
title('f(x) = x^2 + x - e^x');

subplot(3,1,3);
plot(x, f3, 'g-', 'LineWidth', 2);
title('f(x) = e^{x^2}sin(x)');
            

Ejercicio 5: Funciones anónimas

Problema:

Define funciones anónimas para evaluar las funciones anteriores teniendo en cuenta que x puede ser un vector.

Solución:

% Funciones anónimcas
f=@(x) log(x+2)./x
g=@(x) lx.^2+x+exp(x)
h=@(x)  exp(x.^2).*sin(x)

            

Ejercicio 6: Función Definida por Tramos

Problema:

Define funciones anónimas para evaluar las funciones anteriores teniendo en cuenta que x puede ser un vector. Representa gráficamente la función definida a trozos:

\[ f(x) = \begin{cases} x^2 + 3x - 2, & \text{si } 1 \leq x < 3 \\ 7x - 3, & \text{si } 3 \leq x \leq 8 \end{cases} \]

Solución:

% Crear vectores x para cada tramo
x1 = linspace(1, 3, 100);
x2 = linspace(3, 8, 100);

% Definir funciones anónimas para cada tramo
f1 = @(x) x.^2 + 3*x - 2;
f2 = @(x) 7*x - 3;

% Evaluar funciones
y1 = f1(x1);
y2 = f2(x2);

% Graficar
figure;
plot(x1, y1, 'b-', x2, y2, 'r-', 'LineWidth', 2);
grid on;
title('Función definida por tramos');
xlabel('x');
ylabel('f(x)');
legend('x^2 + 3x - 2', '7x - 3');

% Agregar punto de conexión
hold on;
plot(3, f1(3), 'ko', 'MarkerSize', 10);
            

Ejercicio 7: Manipulación de Matrices

Problema:

Diseña un script en Matlab/Octave que genere una matriz cuadrada A de tamaño n × n, con n proporcionado por el usuario. Llena la matriz con valores aleatorios entre 1 y n, duplica los valores de la diagonal principal y reduce a la mitad los valores de la diagonal secundaria.

Solución:

% Tamaño de la matriz
n = input('Introduzca el tamaño de la matriz: ');

% Generar matriz aleatoria
A = randi([1 n], n, n);
disp('Matriz original:');
disp(A);

% Duplicar diagonal principal
for i = 1:n
    A(i,i) = 2 * A(i,i);
end

% Reducir diagonal secundaria
for i = 1:n
    A(i,n-i+1) = A(i,n-i+1) / 2;
end

disp('Matriz modificada:');
disp(A);

% Visualización gráfica
figure;
subplot(1,2,1);
imagesc(A);
colorbar;
title('Matriz Modificada');
xlabel('Columna');
ylabel('Fila');
            

Ejercicio 8: Comparación de Vectores

Problema:

Escribe un programa en Matlab/Octave que cree dos vectores X e Y de longitud 10 con números aleatorios entre 1 y 20. Compara elemento a elemento:

  • Si X[i] > Y[i], almacena la suma en un nuevo vector Z
  • Si X[i] ≤ Y[i], almacena el valor absoluto de su diferencia en Z

Solución:

% Generar vectores aleatorios
X = randi([1 20], 1, 10);
Y = randi([1 20], 1, 10);

% Inicializar vector resultado
Z = zeros(1, 10);

% Comparar y operar
for i = 1:10
    if X(i) > Y(i)
        Z(i) = X(i) + Y(i);
    else
        Z(i) = abs(X(i) - Y(i));
    end
end

% Mostrar resultados
disp('Vector X:'); disp(X);
disp('Vector Y:'); disp(Y);
disp('Vector Z:'); disp(Z);

% Visualización gráfica
figure;
bar([X; Y; Z]');
legend('X', 'Y', 'Z');
title('Comparación de Vectores');
xlabel('Índice');
ylabel('Valor');
            

Ejercicio 9: Clasificación de Temperaturas

Problema:

Escribe un script que clasifique un conjunto de 24 mediciones de temperaturas en tres categorías: 'Frío' (< 10°C), 'Templado' (10-20°C), y 'Caluroso' (> 20°C). Muestra los conteos de cada categoría.

Solución:

% Generar temperaturas aleatorias entre -5 y 35 grados
temperaturas = -5 + (35+5)*rand(1,24);

% Inicializar contadores
frio = sum(temperaturas < 10);
templado = sum(temperaturas >= 10 & temperaturas <= 20);
caluroso = sum(temperaturas > 20);

% Mostrar resultados
fprintf('Clasificación de temperaturas:\n');
fprintf('Frío (< 10°C): %d mediciones\n', frio);
fprintf('Templado (10-20°C): %d mediciones\n', templado);
fprintf('Caluroso (> 20°C): %d mediciones\n', caluroso);

% Visualización gráfica
figure;
subplot(2,1,1);
histogram(temperaturas, 10);
title('Distribución de Temperaturas');
xlabel('Temperatura (°C)');
ylabel('Frecuencia');

subplot(2,1,2);
pie([frio templado caluroso]);
title('Clasificación de Temperaturas');
legend('Frío', 'Templado', 'Caluroso');
            

Ejercicio 10: Suma de Números Naturales

Problema:

Para n = 10, 20, 40, 80, ..., 10240, calcula la suma de los n primeros números naturales aplicando y sin aplicar la fórmula S(n) = n(n+1)/2. Muestra los resultados.

Solución:

% Generar valores de n
n = 10 * 2.^(0:10);

% Inicializar arrays para resultados
suma_formula = zeros(size(n));
suma_bucle = zeros(size(n));
tiempo_formula = zeros(size(n));
tiempo_bucle = zeros(size(n));

% Calcular sumas y medir tiempos
for i = 1:length(n)
    % Usando fórmula
    tic;
    suma_formula(i) = (n(i) * (n(i) + 1)) / 2;
    tiempo_formula(i) = toc;

    % Usando bucle
    tic;
    suma_bucle(i) = sum(1:n(i));
    tiempo_bucle(i) = toc;
end

% Mostrar resultados
for i = 1:length(n)
    fprintf('n = %5d: Fórmula = %10d (%8.6fs), Bucle = %10d (%8.6fs)\n', ...
        n(i), suma_formula(i), tiempo_formula(i), ...
        suma_bucle(i), tiempo_bucle(i));
end

% Visualización gráfica
figure;
loglog(n, tiempo_formula, 'b-o', n, tiempo_bucle, 'r-o');
grid on;
legend('Tiempo Fórmula', 'Tiempo Bucle');
title('Comparación de Tiempos de Ejecución');
xlabel('n');
ylabel('Tiempo (s)');
            

Ejercicio 11: Función Múltiplo

Problema:

Escribe una M-función llamada Multiplo que, dados dos números k y h, devuelva:

  • 1 si k + h es múltiplo de 2
  • 2 si también es múltiplo de 3
  • 0 en caso contrario

Solución:

function resultado = Multiplo(k, h)
    suma = k + h;

    % Verificar si es múltiplo de 2 y 3
    if mod(suma, 2) == 0
        if mod(suma, 3) == 0
            resultado = 2;
        else
            resultado = 1;
        end
    else
        resultado = 0;
    end
end

% Ejemplos de uso:
disp(Multiplo(3, 3));  % Devuelve 2 (6 es múltiplo de 2 y 3)
disp(Multiplo(2, 2));  % Devuelve 1 (4 es múltiplo de 2)
disp(Multiplo(2, 3));  % Devuelve 0 (5 no es múltiplo de 2)
            

Ejercicio 12: Sucesión Recursiva

Problema:

Construye un vector con los diez primeros términos de la sucesión:

\[ x_{n+1} = \frac{1}{2 - x_n} \quad \text{con } x_1 = 1 \quad \text{para } n \geq 1 \]

Solución:

% Inicializar vector
x = zeros(1, 10);
x(1) = 1;  % Primer término

% Calcular términos sucesivos
for n = 1:9
    x(n+1) = 1 / (2 - x(n));
end

% Mostrar resultados
disp('Los 10 primeros términos son:');
for i = 1:10
    fprintf('x_%d = %.6f\n', i, x(i));
end

% Visualización
plot(1:10, x, 'bo-', 'LineWidth', 2);
grid on;
title('Términos de la Sucesión');
xlabel('n');
ylabel('x_n');
            

Ejercicio 13: Contar Números Pares

Problema:

Escribe una M-función llamada ContarPares que reciba un vector como argumento y devuelva el número de componentes pares.

Solución:

function cantidad = ContarPares(vector)
    % Usar mod para identificar pares y sum para contar
    cantidad = sum(mod(vector, 2) == 0);
end

% Ejemplo de uso
v = [1 2 3 4 5 6 7 8 9 10];
pares = ContarPares(v);
fprintf('El vector contiene %d números pares\n', pares);

% Test con diferentes vectores
vectores_prueba = {
    [1 3 5 7 9],
    [2 4 6 8 10],
    [1 2 3 4 5]
};

for i = 1:length(vectores_prueba)
    fprintf('Vector %d: %d pares\n', i, ContarPares(vectores_prueba{i}));
end
            

Ejercicio 14: Suma de Cifras

Problema:

Escribe una M-función que calcule la suma de las cifras de un número natural dado. Por ejemplo, SumaCifras(325) debería devolver 10.

Solución:

function suma = SumaCifras(numero)
    % Convertir a string para facilitar el proceso
    str_num = num2str(numero);

    % Inicializar suma
    suma = 0;

    % Sumar cada dígito
    for i = 1:length(str_num)
        suma = suma + str2double(str_num(i));
    end
end

% Ejemplos de uso
numeros_prueba = [325, 1234, 9999, 100, 7];
for num = numeros_prueba
    suma = SumaCifras(num);
    fprintf('Suma de cifras de %d = %d\n', num, suma);
end
            

Ejercicio 15: Máximo Común Divisor

Problema:

Utilizando el algoritmo de Euclides, escribe una M-función que calcule el máximo común divisor de dos números. Ejemplo: MCD(24, 15) debería devolver 3.

Solución:

function mcd = MCD(a, b)
    % Implementación del algoritmo de Euclides
    while b ~= 0
        temp = b;
        b = mod(a, b);
        a = temp;
    end
    mcd = a;
end

% Ejemplos de uso
pares = [
    24 15;
    48 36;
    17 23;
    100 75
];

for i = 1:size(pares, 1)
    resultado = MCD(pares(i,1), pares(i,2));
    fprintf('MCD(%d, %d) = %d\n', pares(i,1), pares(i,2), resultado);
end
            

Ejercicio 16: Suma de Cuadrados Mayores

Problema:

Escribe una M-función que, a partir de tres números dados, calcule la suma de los cuadrados de los dos números mayores. Por ejemplo, SumaCuadrados(5, 3, 4) debería devolver 41.

Solución:

function suma = SumaCuadrados(a, b, c)
    % Ordenar los números de mayor a menor
    nums = sort([a b c], 'descend');

    % Sumar los cuadrados de los dos mayores
    suma = nums(1)^2 + nums(2)^2;
end

% Ejemplos de uso
casos_prueba = [
    5 3 4;
    1 2 3;
    7 7 1;
    2 2 2
];

for i = 1:size(casos_prueba, 1)
    resultado = SumaCuadrados(casos_prueba(i,1), casos_prueba(i,2), casos_prueba(i,3));
    fprintf('SumaCuadrados(%d, %d, %d) = %d\n', ...
        casos_prueba(i,1), casos_prueba(i,2), casos_prueba(i,3), resultado);
end
            

Ejercicio 17: Elementos Superiores a la Media

Problema:

Escribe una M-función llamada SuperaMedia que reciba un vector y devuelva otro vector con los elementos que sean mayores o iguales a la media del vector de entrada.

Solución:

function resultado = SuperaMedia(vector)
    % Calcular la media
    media = mean(vector);

    % Seleccionar elementos mayores o iguales a la media
    resultado = vector(vector >= media);
end

% Ejemplos de uso
vectores_prueba = {
    [1 2 3 4 5],
    [10 20 30 40 50],
    [1 1 1 1 5],
    [-2 0 2 4 6]
};

for i = 1:length(vectores_prueba)
    v = vectores_prueba{i};
    r = SuperaMedia(v);
    fprintf('\nVector original: '); disp(v);
    fprintf('Media: %.2f\n', mean(v));
    fprintf('Elementos que superan la media: '); disp(r);
end