Ejercicio 1: Operaciones Algebraicas
Problema:
Define las tres variables variables a=1.5, b=4, c=3.5 y calcula el valor de:
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:
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:
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:
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:
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