Tarea 1

Contents

Ejercicio 1.A

function [salida] = factr(n)
    %FACTR es una función que calcula el factorial de un número de forma
    %recursiva.
    %El número ha de ser un entero positivo
     if n==1
         salida= n;
     elseif n==0
         salida=1;
     elseif n~=1
         salida= n.*factr(n-1);
     end
end

Ejercicio 1.B

function [salida] = combina(n,i)
  %COMBINA funcion devuelve el número de combinaciones de tamaño i de una
  %coleccion de tamaño n
  %Está construida a partir de factr
  salida=(factr(n))./(factr(i).*factr(n-i));
end

Ejercicio 1.C

function [salida] = bernstein(n,i,t)
  %bernstein devuelve el valor para un polinomio de Brenstein contreto y para
  %un valor de t
  %   Depende de combina y factr
   salida=combina(n,i).*t.^i.*(1-t).^(n-i);
end
function dibujo_b(n)
  xd=linspace(0,1);
   for i=0:n
       yd=bernstein(n,i,xd);
       plot(xd,yd)
       hold on
   end
   legend('B_3_0','B_3_1','B_3_2','B_3_3')
 end

Ejercicio 1.D

t=linspace(0,1);
vx=[1,2,4,4.6];
vy=[1,3,-1,1.5];
plot(vx,vy)
hold on
xsalida=0;
ysalida=0;
n=length(vx)-1; %orden de la curva de Beizer

for i=0:n
    xdd=bernstein(n,i,t)*vx(i+1);
    ydd=bernstein(n,i,t)*vy(i+1);
    xsalida=xsalida+xdd;
    ysalida=ysalida+ydd;
end
plot(xsalida,ysalida)

Ejercicio 2.A

Desarrollar un script que lea los datos de velocidad del viento (xlsread) y grafique el histograma (hist) considerando intervalos de clase entre [0,25].

[NUMEROS,TEXTO,RESTO]=xlsread('sotaventogaliciaanual.xlsx');
figure(2)
histogram(NUMEROS,0:25) %Uso histohram en lugar de hist porque MatLab lo recomienda.

Ejercicio 2.B

%Desarrollar un script que lea los datos de velocidad del viento (xlsread), los convierta a un
%histograma de frecuencias y ajuste a una distribución de Weibull mediante una regresión no
%lineal (nlinfit) usando como valores iniciales de los parámetros k y c los valores del promedio
%y el cuadrado de la desviación estándar de la velocidad del viento respectivamente. Graficar
%en un mismo gráfico el diagrama de frecuencias y la curva de ajuste.
[NUMEROS,TEXTO,RESTO]=xlsread('sotaventogaliciaanual.xlsx');
k0=mean(NUMEROS);
c0=std(NUMEROS)^2;
y=histc(NUMEROS,0:25);
frecuencias=y/sum(y);
a0=[c0 k0];
x=0:25;
x=x';
f=@(a,x) (a(1)/a(2))*((x/a(2)).^(a(1)-1)).*exp(-(x/a(2)).^a(1));
af=nlinfit(x,frecuencias,f,a0);

xd=linspace(0,25);
yd=f(af,xd);
bar(0:25,frecuencias)
hold on
plot(xd,yd)

Ejercicio 2.C

Desarrollar un script para interpolar (interp1) la curva de potencia del generador mediante un polinomio cúbico (pchip). Graficar los puntos de la curva y los valores de la interpolación.

[NUMEROS,TEXTO,RESTO]=xlsread('sotavento_curva potencia.xlsx');
velocidad=NUMEROS(:,1);
pot=NUMEROS(:,2);
xd=linspace(0,25);
yd=interp1(velocidad,pot,xd,'pchip');
plot(velocidad,pot,'*')
hold on
plot(xd,yd)

Ejercicio 2.D

Desarrollar un script para agrupar los pasos b y c y calcular la integración (quad) necesaria para calcular la potencia media. (Referencia)

[NUMEROS,TEXTO,RESTO]=xlsread('sotaventogaliciaanual.xlsx');
k0=mean(NUMEROS);
c0=std(NUMEROS)^2;
BINS=0:25;
y=histc(NUMEROS,BINS);
frecuencias=y/sum(y);
a0=[c0 k0];
x=0:25;
x=x';
f=@(a,x) (a(1)/a(2))*((x/a(2)).^(a(1)-1)).*exp(-(x/a(2)).^a(1)); %distribución de weibull
af=nlinfit(x,frecuencias,f,a0);

%función de potencia
[NUMEROS,TEXTO,RESTO]=xlsread('sotavento_curva potencia.xlsx');
velocidad=NUMEROS(:,1);
pot=NUMEROS(:,2);
P=polyfit(velocidad,pot,3);
g=@(x) f(af,x).*polyval(P,x);
ff=@(x) f(af,x);
Potencia_media=quad(g,0,14)+1300*quad(ff,14,25)
Potencia_media =

   221.1094

Ejercicio 3

%En este ejercicio se procede a la resolución de una ODE de segundo orden
%mediante el método de "ode45". Esto lo hacemos descomponiendo la ecuación
%diferencial de segundo orden en un sistema de dos ecuaciones de primer
%orden.



m=20; %masa del cuerpo
k=20; %constanteelástica del muelle
%condiciones iniciales
x0=[1,0]; % 1 es posición inicial, 0 es velocidad inicial
tf=40; %tiempo final
figure(3)
for c=[5,40,200]
    f=@(t,x) [x(2);(-k*x(1)-c*x(2))/(m)]; % x(1) es el desplazamiento y x(2) es la velocidad
    [t,x]=ode45(f,[0,tf],x0);
    plot(t,x(:,1))
    hold on

end
legend('Constante de amortiguación 5','Constante de amortiguación 40','Constante de amortiguación 200')
grid on
xlabel('Tiempo (s)')
ylabel('Desplazamiento (m)');
title('Sistema masa-resorte-amortiguador')

Ejercicio 4

Desarrollar una GUI para calcular la flecha y longitud de un cable suspendido entre dos apoyos situados en el mismo nivel, así como la gráfica de la catenaria.

Código de la interfaz