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 \( K \) es el coeficiente adiabático del gas. Escribe esta expresión en Matlab/Octave y calcula su valor para los valores de \(K=1.4\), \( P_{\text{ext}} =1\) y \( P_{\text{int}} =2\). .
Solución:
% 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
P1 = 1;P2 = 2;K1=1.4;
resultado = flujo(P1, P2,k1);
fprintf('El flujo para P_ext=%.1f, P_int=%.1f y k=%.1f es: %.4f\n', P1, P2, K1, 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);
% Se pueden graficar estas funciones en una misma figura
plot(x,f1(x))
hold on
plot(x,f2(x))
plot(x,f3(x))
hold off
% También como una matriz de gráficos
% utilizando distintos estilos gráficos
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 del ejercicio anterior teniendo en cuenta que x
puede ser un vector.
Solución:
% Funciones anónimas
f=@(x) log(x+2)./x
g=@(x) x.^2+x+exp(x)
h=@(x) exp(x.^2).*sin(x)
%Evaluamos en x
x = linspace(0, pi, 30);
f(x)
g(x)
h(x)
Ejercicio 6: Función Definida por Tramos
Problema:
Define una función para representar la siguiente función a trozos y represéntala:
Solución:
% Crear vectores x para cada tramo
x1 = linspace(1, 3, 50);
x2 = linspace(3, 4, 50);
% Definir funciones anónimas para cada tramo
f1 = @(x) x.^2 + 3*x - 2;
f2 = @(x) 7*x.^3 - 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 - 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);
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);
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 enteras aleatorias entre -5 y 35 grados
temperaturas = randi([-5 35],1,24);
% Inicializar contadores
frio = sum(temperaturas < 10);
templado = sum(temperaturas >= 10 & temperaturas <= 20);
caluroso = sum(temperaturas >= 20);
%También podría hacerse con una estructura condicional
frio=0;templado=0;caluroso=0;
for i=1:24
if temperaturas(i)<10
frio=frio+1;
elseif temperaturas(i)<=20
templado=templado+1;
elseif temperaturas(i)>20
caluroso=caluroso+1;
end
end
% Se imprimen los resultados con fprintf
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 (notar que 10=10*2^0, 20=10*2^1, 40=10*2^2, ..., 10240= 10*2^10)
n = 10 * 2.^(0:10);
% Cálculo de los valores solicitados
% Con la fórmula
for i=1:11
suma1=sum(1:n(i));
suma2=(n(i) * (n(i) + 1)) / 2;
end
suma1
suma2
% ANALIZANDO TIEMPO COMPUTO
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
Nota: Usa la función mod para ver si el resto de la división es 0
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 las componentes ´que son pares y el número de ellas.
Solución:
% Con un ciclo
function [vpares, cantidad] = ContarPares(vector)
% Dimensión del vector
n=length(vector);
vpares=[];
for i=1:n
if mod(vector(i),2)==0
vpares=[vpares vector(i)];
end
end
cantidad = sum(vpares);
end
% Accediendo a los elementos de un vector con una condición
function [vpares, cantidad] = ContarPares(vector)
% Usar mod para identificar pares y sum para contar
vpares=v(mod(vector,2)==0);
cantidad = sum(vpares);
end
% Ejemplo de uso
v = [1 2 3 4 5 6 7 8 9 10];
[pares,num] = ContarPares(v);
fprintf('El vector contiene %d números pares\n', num);
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:
% Forma 1. Teniendo en cuenta que el número está en base 10
function suma = SumaCifras(numero)
suma=0;
while numero>0
m=mod(numero,10);
suma=suma+m;
numero=(numero-m)/10;
end
end
% Forma 2: Conversión de string a números y números a string
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.
NOTA: El algoritmo de Euclides para calcular el MCD(a,b) es:
- si b es divisor de a, entonces MCD(a,b)=b.
- si b no es divisor de a, entonces MCD(a,b)=MCD(b,r) siendo r el resto de la división de a entre b.
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
%También puede hacerse de forma recursiva
function mcd=MCD(a,b)
r=mod(a,b);
if r==0
mcd=b;
else
mcd=MCD(b,r);
end
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