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')

Nº (x)     ln(x)
  10     2.303
  20     2.996
  40     3.689
  60     4.094
  80     4.382

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

X = 3x1 double
2.0000 4.0000 1.0000

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)

L = 3x3 double
1.0000 0 0 0.5000 1.0000 0 -1.0000 -0.7273 1.0000
U = 3x3 double
4.0000 -2.0000 -10.0000 0 11.0000 -7.0000 0 0 0.9091

Como podemos comprobar, LU nos devuelve la matriz original:

A_2 = L*U

A_2 = 3x3 double
4.0000 -2.0000 -10.0000 2.0000 10.0000 -12.0000 -4.0000 -6.0000 16.0000

Resolucíon del sistema con

X = inv(U)*inv(L)*B

X = 3x1 double
2.0000 4.0000 1.0000

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)

V = 3x3 double
0.7071 -0.2182 -0.0921 -0.0000 -0.4364 -0.5523 0.7071 -0.8729 -0.8285
D = 3x3 double
-1.0000 0 0 0 -2.0000 0 0 0 -3.0000

Comprobación de A*V = V*D.

M1= A*V

M1 = 3x3 double
-0.7071 0.4364 0.2762 0.0000 0.8729 1.6570 -0.7071 1.7457 2.4856

M2= V*D

M2 = 3x3 double
-0.7071 0.4364 0.2762 0.0000 0.8729 1.6570 -0.7071 1.7457 2.4856

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

V =
   3.5902 +35.0928i
   6.0155 +36.2212i

La potencia de la fuente es: S = V*I

S= V.*conj(I)

S =
   1.0e+03 *

   1.5114 + 0.9092i
   0.6636 + 0.6342i

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)

Las varillas se denominan mediante caracteres, normalmente:

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')

Mueva el disco 1 de A a C
Mueva el disco 2 de A a B
Mueva el disco 1 de C a B
Mueva el disco 3 de A a C
Mueva el disco 1 de B a A
Mueva el disco 2 de B a C
Mueva el disco 1 de A a C
Mueva el disco 4 de A a B
Mueva el disco 1 de C a B
Mueva el disco 2 de C a A
Mueva el disco 1 de B a A
Mueva el disco 3 de C a B
Mueva el disco 1 de A a C
Mueva el disco 2 de A a B
Mueva el disco 1 de C a B
Mueva el disco 5 de A a C
Mueva el disco 1 de B a A
Mueva el disco 2 de B a C
Mueva el disco 1 de A a C
Mueva el disco 3 de B a A
Mueva el disco 1 de C a B
Mueva el disco 2 de C a A
Mueva el disco 1 de B a A
Mueva el disco 4 de B a C
Mueva el disco 1 de A a C
Mueva el disco 2 de A a B
Mueva el disco 1 de C a B
Mueva el disco 3 de A a C
Mueva el disco 1 de B a A
Mueva el disco 2 de B a C
Mueva el disco 1 de A a 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)

p = 1x3 double
4.0233 2.0107 9.6783

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

  1. Graficar e en función de ωt en la parte superior izquierda
  2. Graficar en la parte superior izquierda
  3. Para , graficar , y en función de ωt en la parte inferior izquierda
  4. 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)

r = 4x1 double
-6.4910 4.8706 2.0000 -0.3796

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)

ans = 1x5 double
1.0000 0.0000 -35.0000 50.0000 24.0000

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