Tarea Matlab - Ejercicios de programación
Oasis Sancibrián Lana
Ejercicio 1
Imprimir una tabla formateada (entero y real) del logaritmo natural de los números 10, 20, 40, 60, y 80. Sugerencia: usar el comando fprintf y vectores
x = [10; 20; 40; 60; 80];
y = [x, log(x)];
fprintf('\n Nº (x) ln(x)\n'),fprintf('%4i \t %8.3f\n',y')
Ejercicio 2
Resolución el sistema de ecuaciones lineales dado por la siguiente ecuación matricial:
A=[4 -2 -10; 2 10 -12; -4 -6 16];
B=[-10; 32; -16];
X = A\B
Ejercicio 3
Para la matriz de coeficientes anterior encuentra la factorización LU, es decir A = LU y aplicar a continuación
para resolver el sistema anterior.
A=[4 -2 -10; 2 10 -12; -4 -6 16];
B=[-10; 32; -16];
Factorización LU
[L, U] = lu(A)
Como podemos comprobar, LU nos devuelve la matriz original:
A_2 = L*U
Resolucíon del sistema con
X = inv(U)*inv(L)*B
Ejercicio 4
Hallar los autovalores y autovectores de la matriz A:
A=[0 1 -1; -6 -11 6; -6 -11 5];
Cálculo de los autovalores y autovectores con el comando eig(A)
[V,D] = eig(A) devuleve una matriz diagonal D de autovalores y una matriz V cuyas columnas son los correspondientes autovectores, tal que A*V = V*D.
[V,D]=eig(A)
Comprobación de A*V = V*D.
M1= A*V
M2= V*D
Ejercicio 5
Para el siguiente circuito, determinar los voltajes de los nodos y
y la potencia entregada por cada fuente:
Aplicando Kirchoff se obtiene el siguiente sistema:
Sea Y la matriz de admitancias, e I el vector de corrientes:
Y=[1.5-2j -.35+1.2j; -.35+1.2j 0.9-1.6j];
I=[30+40j;20+15j];
Obtenemos las tensiones de los nodos y
con:
V=Y\I
La potencia de la fuente es: S = V*I
S= V.*conj(I)
Ejercicio 6
Escribir una función recursiva para resolver el problema de la Torres de Hanoi y probarla para un valor 5 discos.
Torres de Hanoi
Argumentos: Hanoi(N, Ti, Ta, To)
- N = Número de discos (N∈ℤ,N>0)
- Ti = Torre inicial
- Ta = Torre auxiliar
- To = Torre objetivo
Las varillas se denominan mediante caracteres, normalmente:
- 'A' (Para Torre inicial Ti)
- 'B' (Para Torre auxiliar Ta)
- 'C' (Para Torre objetivo To)
function Hanoi(N, Ti, Ta, To)
if N > 0
% Mueve N-1 discos de Ti a Ta (Para que no estorben)
Hanoi(N-1, Ti, To, Ta);
% Mueve el M-esimo disco a Td
fprintf('Mueva el disco %d de %c a %c \n', N, Ti, To);
% Mueve los N-1 discos desde Ta hasta To
Hanoi(N-1, Ta, Ti, To);
end
Hanoi(5,'A','B','C')
Ejercicio 7
Ajustar un polinomio de orden 2 a los siguientes datos:
y graficar los puntos dados con el símbolo x y la curva ajustada con una línea sólida. Colocar una leyenda adecuada, etiquetas en los ejes y un título al gráfico.
Vectores de datos:
x= 0:0.5:5; % Vector con datos de 0 a 5 con paso de 0.5
y=[10 10 16 24 30 38 52 68 82 96 123];
Ajuste polinómico:
p = polyfit(x,y,n) devuelve los coeficientes del polinomio p(x) de grado n que es el mejor ajuste (Por mínimos cuadrados) de los datos en y. Los coeficientes en p son escritos en orden de potencia descendiente:
p=polyfit(x,y,2)
El polinomio hallado es:
Representación usando el comando polyval (Evalúa el polinomio en los valores de x dados) y plot
y_eval=polyval(p,x);
plot(x,y,'or',x,y_eval,'LineWidth',1.7);
xlabel('Eje x'),ylabel('Eje y'),grid,title('Ajuste polinomico Grado II')
legend('Puntos (Datos)','Ajuste polinomico p(x)')
Ejercicio 8
Partir la ventana Figure en cuatro particiones (2x2) y graficar las siguientes funciones para ωt de 0 a 3π en pasos de 0.05
- Graficar
e
en función de ωt en la parte superior izquierda
- Graficar
en la parte superior izquierda
- Para
, graficar
,
y
en función de ωt en la parte inferior izquierda
- Para
, construir un círculo de radio
en la parte inferior derecha
Datos y funciones
wt=0:0.05:3*pi;
v=120*sin(wt);
i=100*sin(wt-pi/4);
p=v.*i;
Fm=3.0;
fa=Fm*sin(wt);
fb=Fm*sin(wt-2*pi/3);
fc=Fm*sin(wt-4*pi/3);
fR= 3*Fm/2;
Para dividir una figure hacemos uso del comando subplot
Es posible crear una figure con un tamaño personalizado, que permita una mejor visualización, haciendo uso de los comandos:
get(groot,'ScreenSize') que devuelve las dimensiones de la pantalla, en pixels; y figure('Position',[left bottom width height]) que permite establecer la ubicación y el tamaño de la figure.
scrsz = get(groot,'ScreenSize');
figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])
subplot(2,2,1)
plot(wt,v,wt,i)
title('Tensión e Intensidad')
ylabel('v, A'),xlabel('\omegat, rad')
subplot(2,2,2)
plot(wt,p)
title('Potencia')
ylabel('Potencia, W'),xlabel('\omegat, rad')
subplot(2,2,3)
plot(wt,fa,wt,fb,wt,fc)
title('CA sinusoidal')
xlabel('\omegat, rad')
legend('fa','fb','fc','Location','southwest','Orientation','horizontal')
legend('boxoff')
subplot(2,2,4)
plot(fR*cos(wt),fR*sin(wt))
title('Circulo de radio f_R'),axis equal
Como alternativa, una mejor representación se lograr de esta forma:
figure()
figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/1.25])
subplot(3,2,[1,2])
plot(wt,v,wt,i)
title('Tensión e Intensidad')
ylabel('v, A'),xlabel('\omegat, rad')
subplot(3,2,[3,4])
plot(wt,fa,wt,fb,wt,fc)
title('CA sinusoidal')
xlabel('\omegat, rad')
legend('fa','fb','fc','Location','best'),legend('boxoff')
subplot(3,2,5)
plot(wt,p)
title('Potencia')
ylabel('Potencia, W'),xlabel('\omegat, rad')
subplot(3,2,6)
plot(fR*cos(wt),fR*sin(wt))
title('Circulo de radio f_R'),axis equal
Ejercicio 9
Graficar la curva paramétrica
Para un intervalo de 0 a
Definición de datos:
t=linspace(0,16*pi,400);
x=exp(-0.03*t).*cos(t);
y=exp(-0.03*t).*sin(t);
z=t;
figure(),subplot(1,1,1)
plot3(x,y,z,'LineWidth',1.5)
Ejercicio 10
Grafica de la curva parametrica
Para un intervalo de -4 a 4 en pasos de 0.3
El comando [X,Y] = meshgrid(xgv,ygv) crea replicas de los replica la "red" (grid) de vectores xgv y ygv para generar una red completa
[x,y]=meshgrid(-4:0.3:4);
z=sin(x).*cos(y).*exp(-(x.^2+y.^2).^0.5);
Hay gran variedad de comandos para representar la curva: mesh,meshz, surf, surfc... En este caso se ha optado por usar surfc que además proyecta una representación del contorno debajo de la figura.
figure(),surfc(x,y,z) , axis off
Ejercicio 11
Raíces del polinomio
Introducimos el polinomio como un vector con sus coeficientes:
p=[1,0,-35,50,24];
Calculamos las raices con el comando roots(p)
r=roots(p)
Comentario: Con el comando poly(r) podemos construir un polinomio a partir de sus raices. Es decir, es la función inversa a roots:
poly(r)
Ejercicio 12
Resolver la ec. diferencial:
Sujeta a las condiciones iniciales: y
Considerando el caso donde
y la región de interés de la solución 0 ≤ t ≤ 35
function ode
[t, yy] = ode45(@fsin, [0 35], [1 0], [], 0.15);
plot(t, yy(:,1))
function y = fsin(t, y, z)
h = sin(pi*t/5).*(t<=5);
y = [y(2); -2*z*y(2)-y(1)+h];
figure()
ode
title('Solución de la ecuación diferencial')
Ejercicio 13
Tomando como base las condiciones del ejemplo de la transformada de Fourier de los apuntes (pág. 124), graficar para las siguientes señales la gráfica de la señal en el tiempo y la gráfica de la amplitud espectral en función de la frecuencia:
figure();figure('Position',[1 1 scrsz(3)/2 scrsz(4)/2])
k = 5; m = 10; fo = 10; Bo = 2.5; N = 2^m; T = 2^k/fo;
t = (0:N-1)*T/N; df = (0:N/2-1)/T;
g1 = Bo*sin(2*pi*fo*t)+Bo/2*sin(2*pi*2*fo*t);
An = abs(fft(g1, N))/N;
subplot(2,1,1)
plot(t, g1)
title('g_1(t)=B_o·sin(2·\pi·f_o·t) + B_o/2·sin(2\pi·2f_o·t)');
subplot(2,1,2);
plot(df, 2*An(1:N/2))
title('Amplitud espectral de g_1(t) en función de f');
figure();figure('Position',[1 1 scrsz(3)/2 scrsz(4)/2])
g2 = exp(-2*t).*sin(2*pi*fo*t);
An1 = abs(fft(g2, N))/N;
subplot(2,1,1)
plot(t, g2)
title('g_2(t)=e^{-2t}·sin(2\pi f_ot)');
subplot(2,1,2)
plot(df, 2*An1(1:N/2))
title('Amplitud espectral de g_2(t) en función de f');
figure();figure('Position',[1 1 scrsz(3)/2 scrsz(4)/2])
g3 = sin(2*pi*fo*t + 5*sin(2*pi*fo/10*t));
An2 = abs(fft(g3, N))/N;
subplot(2,1,1)
plot(t, g3)
title('g_3(t)=sin(2\pi f_ot + 5 sin(2\pi 2 f_o/10t))');
subplot(2,1,2)
plot(df, 2*An2(1:N/2))
title('Amplitud espectral de g_3(t) en función de f');
figure();figure('Position',[1 1 scrsz(3)/2 scrsz(4)/2])
g4 = sin(2*pi*fo*t - 5*exp(-2*t));
An3 = abs(fft(g4, N))/N;
subplot(2,1,1)
plot(t, g4)
title('g_4(t)=sin(2\pi f_o t - 5 e^{-2t})');
subplot(2,1,2)
plot(df, 2*An3(1:N/2))
title('Amplitud espectral de g_4(t) en función de f');
Ejercicio 14
Leer y graficar la imagen WindTunnel.jpg de las transparencias y graficar en sendos gráficos el valor del color rojo de la imagen en función del ancho de la imagen y el histograma del mismo para una fila de la imagen que se pide al usuario. Mostrar el valor para 200
Lectura y representación de la imagen
A = imread('WindTunnel.jpg', 'jpeg');
figure(), image(A), axis image off
fila=input('Elija una fila:');
scrsz = get(groot,'ScreenSize');
figure();figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])
R = A(fila, :, 1);
s1=subplot(2,1,1);s1.YGrid='on';
stem(R,'Marker','none','LineWidth',2,'Color',[1 0 0]);
xlim([0 275]);ylim([0 255]);
title(['Niveles de color rojo en la fila ',num2str(fila)]);
xlabel('Ancho de la imagen (px)')
s2=subplot(2,1,2);
hist(R,0:5:255);xlim([0 275]);
s2.XTick=0:25:275;
title(['Histograma del color rojo en la fila ',num2str(fila)]);
xlabel('Ancho de la imagen (px)')
Ejercicio 15
Graficar la siguiente función curva en coordenadas polares:
th = linspace(-pi, pi);
r = 2-4*cos(th);
figure(),polarplot(th, r);
title('Grafico polar de r = 2 - 4cos(\theta) en (-\pi \leq \theta \leq \pi)');