ANEXO: PROGRAMAS DE MATLAB
CÁLCULO DE DESPLAZAMIENTOS
HOMERBUCLE.M
clear all;
global E;
global IX; % direccion general de ...
% A continuacion modificaremos los valores de la geometria para poder
% obtener una representacion mas compleja y real de ...
% y: punto de Gauss
% w: coeficientes de Gauss
% Las tres matrices R M y C son matrices 2*n,2*n o vectores de
dimensiones ...
if (force(s)==1)&&(moment_torsion(s)==0) % si
hay solo fuerza puntual
deltaest(i,j+1)=deltaest(i,j+1) +
w1(y((i+1)/2),a(s)...
% Calculo del desplazamiento en todos los puntos de la viga:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
...
elseif (force(s)==1)&&(moment_torsion(s)==1) % hay
fuerza puntual y momento de torsion
deltaest(i,j+1)=deltaest(i,j+1) +
w...
% teta((i+2)/3,j)=-delta(i+1,j);
% fi((i+2)/3,j)=-delta(i+2,j);
% end
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%...
%hold on
%pause(0.1)
%axis([38.5 40 -6e-5 1e-8])
%end
%end
% Y para visualizar la evolucion de cada punto de la viga en fu...
milsim
end
if met=='rk2'
runkut2
end
if met=='rk4'
runkut4
end
STOERM.M
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%...
GAUSS.M
function[x,w]=gauss(x1,x2,n)
eps=0.001;
m=(n+1)/2;
xm=0.5*(x1+x2);
xl=0.5*(x2-x1);
for i=1:m
z=cos(pi*(i-0.25)/(n+...
% rapido.
% Asi:
L=26; % longitud de la viga(m)
planosZ=linspace(0,L,L+1); % vector longitud en el que vamos a
calcular va...
W1.M
function [reponse] = w1(x,xi)
global E;
global IX;
global IY;
global IXY;
global K;
global area;
global G;
global mod...
% metodo Hermite:
XH=linspace(0,xi,puntis); % XH es la variable de
integracion.
MfH=P*(xi-XH);
%Para no torsion:
%I=pchip(...
FI1.M
function [reponse] = fi1(x,xi)
global E;
global IX;
global IY;
global IXY;
global K;
global area;
global G;
global m...
% añadimos la parte de hermite a la parte ttrapezoidal.
h = diff(XH);
delta = diff(FH)./h;
d = pchipslopes(h,delta);
D = s...
CÁLCULO DE FUERZAS
FUERZASCICLO.M
% Este programa permite calcular las fuerzas aerodinámicas a las que
% se encuentra some...
%lan=(omega/Vhub)*r; % parametro de avance local de la pala
sigma=(N/pi)*cuerda./r; % solidez local de la pala
% Considera...
%coefresist2(j)= pchip(cl1,cd,coefsust2(j));
%coefresist3(j)= pchip(cl1,cd,coefsust3(j));
coefresist1(j)= pchip(alfa,cd,al...
%a(j+1)=fzero(g,[0 1],[],0,constante1,constante2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%...
%title('Velocidad inducida axial a')
%xlabel('r/R')
%ylabel('a')
%grid
%figure(2)
%plot(x(1:k),Aprima,x(1:k),Aprima,'mo');...
%L2=0.5*ro*cuerda(1:elementos).*(W2.^2).*Coefsust2*deltaR;
%L3=0.5*ro*cuerda(1:elementos).*(W3.^2).*Coefsust3*deltaR;
% Fu...
% la funcion de distribucion de masas es
Funmasa=areatot.*dens;
% las fuerzas masicas que analizaremos con el modelo de ca...
VIENTO.M
% Funcion de variacion de la velocidad del aire con la altura.
function [v] = viento(h,v0,h0)
% La funcion de vel...
CL6=matrix6(:,2);
CD6=matrix6(:,3);
CM6=matrix6(:,4);
% seccion L=7m
matrix7=XLSREAD('perfil7m.xls','tableExtrap','H15:K82...
matrix21=XLSREAD('perfil21m.xls','tableExtrap','H15:K82');
alpha21=matrix21(:,1);
CL21=matrix21(:,2);
CD21=matrix21(:,3);
...
% seccion L=13m
Cl13=pchip(alpha13,CL13,alfa);
Cd13=pchip(alpha13,CD13,alfa);
Cm13=pchip(alpha13,CM13,alfa);
% seccion L=1...
% definimos el peso: W
W=((l(j)-9)/(11-9));
Cd(j,:)=W*Cd11 + (1-W)*Cd9;
Cl(j,:)=W*Cl11 + (1-W)*Cl9;
Cm(j,:)=W*Cm11 + (1-W)...
end
end
RAFAGA_PARKED.M
% Programa de determinación de las fuerzas a las que esta sometida la
pala con el rotor parada baj...
teta=torsion*pi/180; % pasamos torsion q esta en grados a radianes.
giro1=pi/2; % angulo de giro en el que se encuentra la...
Mtorsor(j,:)=(xg-0.25*cuerda).*(-Ftan(j,:).*sin(torsion*pi/180)-
Fax(j,:).*cos(torsion*pi/180)) + yg.*(-
Ftan(j,:).*cos(to...
GEOMETRÍA Y PARÁMETROS ESTRUCTURALES
NACA44XX.M
% Funcion q nos determinara la forma de un perfil naca 44xx de cuerda
1.
f...
% Línea de curvatura media:
k=0;
for s=x
k=k+1;
if s<=p
Yc(k)=(m/p^2)*(2*p*s-s^2);
DerYc(k)=(m/p^2)*(2*p-2*s);
teta(k)=ata...
% la pala (m).
L=26; % 26m de longitud de pala
lon=length(l);
for i=1:lon
if l(i)<0 | l(i)>L
error('introduzca un/unos val...
dweb2max=0.5*C1; % distancia desde el borde de ataque hasta la linea
media de web2 en el perfil de cuerda maxima (m)
web2m...
%grosmat(j)=espe*cuerda(j);% grosor de material en este tramo
(2% de la cuerda)
end
end
% A continuacion obtendremos el an...
xx1=3; xx4=le(long); xx2=7 ; xx3=20; % si ponemos xx1=6 ==>xx2=10; si
xx1=3 ==> xx2=7
yy1=esperel(xx1/0.5+1); yy4=esperel(...
% yintra: Matriz cuyas filas son las coordenadas de las y
intrados para
% cada plano de corte Z
% Este programa nos genera...
Yuper=Yuunit*cuerdaper;
Xlper=Xlunit*cuerdaper;
Ylper=Ylunit*cuerdaper;
% Definimos el vector de puntos a lo largo de la c...
% Rectas del intrados:
% Generamos los vectores directores de las rectas: v=AB=B(x,y,z)-
A(x,y,z)
% siendo B los puntos de...
areaextH=aexttrap-(Dsup-Dinf);
area(j)=areaextH;
% Calulo de las cosas usando pchip:
ppsup=pchip(xextra(j,:),yextra(j,:));...
ppinf=pchip(xintra(j,:),yintra(j,:));
intsup=quad(@ppval,xextra(j,1),xextra(j,end),[],[],ppsup);
intinf=quad(@ppval,xintra...
end
% Las coordenadas de la zona exterior de la seccion las obtenemos
mediante
% la funcion seccionext.
[xext,yextraext,yi...
else
k=k+1; % contador para la variable poscinicial y poscfinal.
ver mas abajo.
[cuerda,torsion,espesorrel,xoffset,web1,we...
% Obtengo puntos equidistantes entre los puntos superior e
inferior de cada
% pared de cada lateral.
lat11=linspace(lat11i...
paso2=0.001*cuerda;
% Hacemos el barrido
for x=posweb21:paso2:cuerda-xoffset*cuerda
Wu=pchip(Xinterior,Yinterior,x);
Wl=pc...
% CELDA CENTRAL (2):
% Usando PCHIP:
xcelda2=linspace(posweb12,posweb21,npuntos1);
% Extrados interno:
[yextraint2] = pchi...
%Intardos interno:
[yintraint3] = pchip(Xinterior1,Yinterior1,xcelda3);
% introducimos estos datos en las variables de sal...
% utilizando pchip:
ppsup=pchip(xinter,yextrainter); % pp = piecewise
polynomial.
ppinf=pchip(xinter,yintrainter);
intsup=...
exteriorinf(1,:)=xext(j,:) + xoffset(j)*cuerda(j);
exteriorinf(2,:)=yintraext(j,:);
% Sy:
%ZONA EXTERIOR:
% utilizando sol...
sum(diff(linspace(0,exteriorsup(2,1),30)).*(inteupabajo2(1:end-
1)+inteupabajo2(2:end))/2);
momxup=momxuparriba-momxupabaj...
% exactas (pasando el extrados e intrados por (0,0) y (c,0)) como
hace
% Xfoil (el programa nuestro naca44xx no pasa exact...
Dlowabajo = sum((hlowabajo.^2).*(dlowabajo(2:end)-dlowabajo(1:end-
1))/12);
if exteriorinf(2,1)<0
hlowabajo2 = diff(linspa...
Dinf = sum((hl.^2).*(dl(2:end)-dl(1:end-1))/12);
momyinfH=momyinf-Dinf;
momyHinte=momysupH-momyinfH;
% Una vez analizadas ...
huparriba = diff(interiorsup(2,end:-1:indi));
deltauparriba = diff(inteuparriba)./huparriba;
duparriba = pchipslopes(hupar...
integrandou=(celdacensup(1,:)).*celdacensup(2,:);
integrandol=(celdaceninf(1,:)).*celdaceninf(2,:);
momysup=sum(diff(celda...
sum(diff(celdacensup(2,1:in)).*(integrandou3(1:end-
1)+integrandou3(2:end))/2)-...
sum(diff(linspace(0,celdacensup(2,1),30...
momxHtotality=momxHexte-momxHceldacen;
Sx(j)=momxHtotality; % ponemos como resultado final el
de integracion con polinomio...
Dinf = sum((hl.^2).*(dl(2:end)-dl(1:end-1))/12);
momyinfH=momyinf-Dinf;
momyHceldaizq=momysupH-momyinfH;
% CELDA CENTRAL:
...
nd-1)+integrandol1(2:end))/2)-
sum(diff(celdaizqinf(2,:)).*(integrandol2(1:end-
1)+integrandol2(2:end))/2);
momxceldaizq=m...
momxsup=sum(diff(celdacensup(2,end:-
1:in)).*(integrandou1(1:end-1)+integrandou1(2:end))/2)+...
sum(diff(linspace(0,celdac...
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
ejemplos matlab
Próxima SlideShare
Cargando en…5
×

ejemplos matlab

245 visualizaciones

Publicado el

PROGRAMAS EN MATLAB
ejemplos

Publicado en: Ingeniería
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
245
En SlideShare
0
De insertados
0
Número de insertados
3
Acciones
Compartido
0
Descargas
12
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

ejemplos matlab

  1. 1. ANEXO: PROGRAMAS DE MATLAB CÁLCULO DE DESPLAZAMIENTOS HOMERBUCLE.M clear all; global E; global IX; % direccion general de batimiento global IY; % direccion general de arrastre global IXY; % producto de inercia para esos ejes. global K; global area; global G; global modtor; global Kt; global CL; global L; global planosZ; %global xi; %global x; global temps0; %%%%%%%%%%%% Propiedades del material: material sandwich.%%%%%%%%%%%%% E=1.2261e10; %2.6733e+010; Modulo elastico del material(N/m2) K=5/6; % Rigidez de la viga (para una viga de seccion rectangular toma este valor) nu=0.3; % Coeficiente de Poisson %G=1.0282e+010; G=2.3e+009; % Modulo a cortante del material Kt=1e15; %-0.0304e6 % Si no hay acoplamiento Kt=-infinito. % Acoplamiento flexion-torsion ro=857.7; %densidad del material sándwich (kg/m3) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%Geometria%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% % Datos iniciales para una viga de geometria cuadrada: %base=2.5; % base(m) %hauteur=0.2*base; % altura(m) L=26; % longitud de la viga(m) %I=(base*hauteur^3)/12; % momento de inercia respecto al eje x de la seccion (Ix) %A=base*hauteur; % area de la seccion rectangular %J=(1/12)*base*hauteur*(base*base+hauteur*hauteur); % momento polar de inercia de la seccion: J=Ix+Iy %Is=ro*J; % elemento de la matriz de masas(kg*m)
  2. 2. % A continuacion modificaremos los valores de la geometria para poder % obtener una representacion mas compleja y real de la pala. %%%%%%%%%%% datos que definen la geometria %%%%%%%%%%%%%%%%%%% % Se encuentran guardados en el mat-file geometria, si se quieren modificar % los datos de la pala, hay que modificarlos en los respectivos programas y % correr el script palahomer.m que nos modificara las variables del % mat-file ''geometria''. load geometria %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Una vez tenemos estos valores, podemos obtener las variables para % cualquier punto de la pala mediante interpolacion con pchip. %%%%%%%%%%% Otras variables importantes del programa%%%%%%%%%%%%%%%%%%%%%% CL=1; type=2; % Si es uno analizaremos el estado 1 de carga. a=[7:2:25]./L; % vector de puntos de aplicacion (adimensional)de las cargas exteriores variables en el tiempo dimension=length(a); % número de cargas exteriores (longitud de a). force=ones(1,10); % vector de la misma longitud que 'a' donde sus elementos valen 1 si hay fuerza puntual exterior en la posicion 'a' ; 0 si no %force=zeros(1,10); moment_torsion=ones(1,10); % % vector de la misma longitud que 'a' donde sus elementos valen 1 si hay momento torsor exterior en la posicion 'a' ; 0 si no %moment_torsion=zeros(1,10); temps0=2.4; % tiempo que duran las fuerzas exteriores. Todas duran lo mismo en el tiempo (con 3.6 segundos ya no me converge) n=4; % numero de puntos de Gauss m=1.2e3; % numero de intervalos de integracion h=temps0/m; %h=temps0/m; %H/m; % tamaño del intervalo de integracion met='sto'; % Metodo numerico de integracion ver el archivo metodo.m % comienzo del programa %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% R=zeros(2*n,2*n); M=zeros(2*n,2*n); C=zeros(2*n,2*n); [y,w]=gauss(0,L,n); y=y/L; % adimensionalizamos los valores de los puntos de gauss, pues las funciones de influencia estan % adimensionalizadas en longitud.
  3. 3. % y: punto de Gauss % w: coeficientes de Gauss % Las tres matrices R M y C son matrices 2*n,2*n o vectores de dimensiones 2*n, pues por cada punto de gauss hay que % calcular dos despalazamientos (desplazamiento vertical lineal y giro por torsion en el plano perpendicular a la seccion de la viga o % giro por flexion en el plano de carga de la viga). % Implementacion de la matriz de integracion[R] for i=1:2:2*n; R(i,i)=w((i+1)/2); R(i+1,i+1)=w((i+1)/2); end % Implementacion de la matriz de masas [M] % Para ello necesitamos calcular los valores de densidad,area y modulo de % torsion en los puntos de gauss: usaremos polinomios interpoladores. % inicialmente consideramos que la densidad es constante en toda la pala. A=pchip(planosZ,area,y*L); % valores de area en los puntos de gauss. J=pchip(planosZ,modtor,y*L); % valores del modulo torsion en puntos gauss Is=ro.*J; for i=1:2:2*n; M(i,i)=ro.*A((i+1)/2); M(i+1,i+1)=Is((i+1)/2); end % Implementacion de la matriz de funciones de influencia [C] for i=1:2:2*n; for j=1:2:2*n; C(i,j)=w1(y((i+1)/2),y((j+1)/2)); C(i,j+1)=w3(y((i+1)/2),y((j+1)/2)); C(i+1,j)=fi1(y((i+1)/2),y((j+1)/2)); C(i+1,j+1)=fi3(y((i+1)/2),y((j+1)/2)); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % calculo del desplazamiento estatico (deltaest) deltaest=zeros(2*n,m); % la matriz de desplazamientos es una matriz donde en cada una de las columnas se han almacenado % los 2 desplazamientos de cada punto de gauss en un instante concreto de tiempo. for i=1:2:2*n for s=1:dimension for j=0:m-1 if j*h<temps0 [effort,m_torsion]=actionbuclejf(j*h,a(s),type,s);
  4. 4. if (force(s)==1)&&(moment_torsion(s)==0) % si hay solo fuerza puntual deltaest(i,j+1)=deltaest(i,j+1) + w1(y((i+1)/2),a(s))*effort; % asi vamos añadiendo al valor anterior el nuevo desplazamiento generado por nueva carga. deltaest(i+1,j+1)=deltaest(i+1,j+1) + fi1(y((i+1)/2),a(s))*effort; elseif (force(s)==0)&&(moment_torsion(s)==1) % si hay solo momento de torsion deltaest(i,j+1)=deltaest(i,j+1) + w3(y((i+1)/2),a(s))*m_torsion; deltaest(i+1,j+1)=deltaest(i+1,j+1) + fi3(y((i+1)/2),a(s))*m_torsion; elseif (force(s)==1)&&(moment_torsion(s)==1) % hay fuerza puntual y momento de torsion deltaest(i,j+1)=deltaest(i,j+1) + w1(y((i+1)/2),a(s))*effort + w3(y((i+1)/2),a(s))*m_torsion; deltaest(i+1,j+1)=deltaest(i+1,j+1) + fi1(y((i+1)/2),a(s))*effort + fi3(y((i+1)/2),a(s))*m_torsion; else % no hay cargas (force=0 y moment_torsion=0) deltaest(i,j+1)=deltaest(i,j+1); deltaest(i+1,j+1)=deltaest(i+1,j+1); break % pongo esto para no estar entrando continuamente en el bucle sin analizar nada. end else deltaest(i,j+1)=0; deltaest(i+1,j+1)=0; % ¿ Haria falta poner esto, si nunca entra aqui j*h siempre es menor que temps0 end end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% PRINCIPO DE STOERM %%%%%%%%%%%%%%%%%%%%% % resolucion de la ecuacion diferencial % algoritmo de Stoerm metodo % corremos el programa metodo, el cual, al estar definida la variable met como 'sto' nos ejecuta el algoritmo de stoerm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% FINAL DE STOERM %%%%%%%%%%%%%%%%%%%%%%%%%%%% % Del algoritmo de Stoerm acabamos obteniendo el valor de delta. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. 5. % Calculo del desplazamiento en todos los puntos de la viga: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nb=40; % numero de puntos deseados deltapp=zeros(2*n,m); % esto se podria quitar point=zeros(nb,1); % esto se podria quitar for i=1:nb+1; point(i)=1/nb*(i-1); end % Point es un vector donde se representa la posicion de nb puntos de la viga con equiespaciado entre puntos de 1/nb deltapp=-invCRM*(delta-deltaest); % matriz que representa la segunda derivada de delta. C=zeros(2*nb,2*n); for i=1:2:2*nb; for j=1:2:2*n; C(i,j)=w1(point((i+1)/2),y((j+1)/2)); C(i,j+1)=w3(point((i+1)/2),y((j+1)/2)); C(i+1,j)=fi1(point((i+1)/2),y((j+1)/2)); C(i+1,j+1)=fi3(point((i+1)/2),y((j+1)/2)); end end % Ahora llenamos la matriz de funciones de influencia colocando en cada funcion de influencia los puntos % de gauss como valores de chi, y valores equiespaciados de la posicion de la viga como valores de x % (ya no introducimos como haciamos antes en los valores de x de las funciones de influencia los puntos de gauss) deltaest=zeros(2*nb,m); for i=1:2:2*nb for s=1:dimension for j=0:m-1 if j*h<temps0 [effort,m_torsion]=actionbuclejf(j*h,a(s),type,s); if (force(s)==1)&&(moment_torsion(s)==0) % si hay solo fuerza puntual deltaest(i,j+1)=deltaest(i,j+1) + w1(point((i+1)/2),a(s))*effort; deltaest(i+1,j+1)=deltaest(i+1,j+1) + fi1(point((i+1)/2),a(s))*effort; elseif (force(s)==0)&&(moment_torsion(s)==1) % si hay solo momento de torsion deltaest(i,j+1)=deltaest(i,j+1) + w3(point((i+1)/2),a(s))*m_torsion; deltaest(i+1,j+1)=deltaest(i+1,j+1) + fi3(point((i+1)/2),a(s))*m_torsion;
  6. 6. elseif (force(s)==1)&&(moment_torsion(s)==1) % hay fuerza puntual y momento de torsion deltaest(i,j+1)=deltaest(i,j+1) + w1(point((i+1)/2),a(s))*effort + w3(point((i+1)/2),a(s))*m_torsion; deltaest(i+1,j+1)=deltaest(i+1,j+1) + fi1(point((i+1)/2),a(s))*effort + fi3(point((i+1)/2),a(s))*m_torsion; else % si no hay fuerza ni momento el desplazamiento es el % que habia antes. deltaest(i,j+1)=deltaest(i,j+1); deltaest(i+1,j+1)=deltaest(i+1,j+1); break % ponemos esto para no estar entrando continuamente en el bucle sin analizar nada. end else deltaest(i,j+1)=0; deltaest(i+1,j+1)=0; end end end end delta=zeros(2*nb,m); % esto se podria quitar delta=deltaest-C*R*M*deltapp; %despl=zeros(m/100,nb); %teta=zeros(m/100,nb); %fi=zeros(m/100,nb); for i=1:2:2*nb for j=1:1:m despl(j,(i+1)/2)=delta(i,j); fi(j,(i+1)/2)=delta(i+1,j); tiempo(j)=t(j); end end % esto nos permite separar de la matriz de desplazamientos, el desplazamiento vertical, giro por flexion y % giro por torsion en funcion del tiempo de cada uno de los nb puntos seleccionados de la viga en tres % vectores distintos que los almacenan: despl, teta y fi respectivamente. % El vector de tiempos es el ya obtenido en el algoritmo de stoerm: es un vector equiespaciado. tiempo2=tiempo'; % trasponemos el vector para que quede igual que despl, teta y fi, en cuyas columnas se almacenan % los desplazamientos correspondientes a cada uno de los puntos de la viga en el transcurso del tiempo. %for i=1:3:3*nb % for j=1:m % despl((i+2)/3,j)=-delta(i,j);
  7. 7. % teta((i+2)/3,j)=-delta(i+1,j); % fi((i+2)/3,j)=-delta(i+2,j); % end %end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % affichage du resultat % Graficos de desplazamiento vertical: figure(1) plot(tiempo2,despl(:,40),'.b-') % nos permite ver la evolucion de un punto de la viga en el tiempo title('evolucion del extremo de la viga en el tiempo') xlabel('tiempo(s)') ylabel('desplazamiento vertical (m)') grid figure(2) plot(1:40,despl(1200,:),'.r-') % nos permite ver la deformada de la viga en un determinado tiempo title('deformada de la viga en un determinado tiempo') xlabel('posicion de los puntos de la viga (pto 40 = extremo)') ylabel('desplazamiento vertical (m)') grid %Graficos de angulo de torsion: figure(3) plot(tiempo2,fi(:,40),'.b-') % nos permite ver la evolucion del angulo torsion de un punto de la viga en el tiempo title('evolucion del angulo de torsion del extremo de la viga en el tiempo') xlabel('tiempo(s)') ylabel('angulo de torsion') grid figure(4) plot(1:40,fi(1200,:),'.r-') % nos permite ver el angulo de torsion de la viga en un determinado tiempo title('angulo de torsion de la viga en un determinado tiempo') xlabel('posicion de los puntos de la viga (pto 40 = extremo)') ylabel('angulo de torsion') grid % Hemos puesto como amplitud de la fuerza en el programa action un valor de Pmax = 20: % Para este valor los valores de axis del programita siguiente nos permiten verlo bien. % Probar esta secuencia para ver bien los resultados: % Para visualizar la deformada de la viga en el transcurso del tiempo: %for i=1:1200 %if i<600 %plot(1:40,despl(i,:),'r-') %hold on %pause(0.1) %axis([38.5 40 -6e-5 1e-8]) %else %plot(1:40,despl(i,:),'b-')
  8. 8. %hold on %pause(0.1) %axis([38.5 40 -6e-5 1e-8]) %end %end % Y para visualizar la evolucion de cada punto de la viga en funcion del tiempo: %for i=1:40 %plot(tiempo2,despl(:,i)) %hold on %pause(1) %end ACTIONBUCLEJF.M function [effort,moment_torsion] = actionbuclejf(ti,a,type,s) global temps0; factorcarga=1.35; if type==1 load cargasoperacion tiempo=(giro1)*60/(25*2*pi); %effort0=pchip(tiempo,Fax1(:,s),ti); effort0=pchip(tiempo,Ftantot(:,s),ti); effort=effort0*factorcarga; moment_torsion0=pchip(tiempo,Mtorsor(:,s),ti); moment_torsion=moment_torsion0*factorcarga; elseif type==2 load cargaextrema effort0=pchip(t,Fax(:,s),ti); effort=effort0*factorcarga; moment_torsion0=pchip(t,Mtorsor(:,s),ti); moment_torsion=moment_torsion0*factorcarga; end %moment_torsion=0; METODO.M % Seleccion del metodo numerico para integral la ecuacion diferencial if met=='sto' stoerm end if met=='abm' adbami end if met=='ham' hamming end if met=='msi'
  9. 9. milsim end if met=='rk2' runkut2 end if met=='rk4' runkut4 end STOERM.M %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% PRINCIPIO DE STOERM %%%%%%%%%%%%%%%%%%%%% % resolucion de la ecuacion diferencial. % algoritmo de Stoerm % Si nos fijamos en los apuntes se ve como la y de la ecuacion corresponde a nuestra delta % que es funcion del tiempo (el equivalente a la variable x de la formula). La funcion de la % derecha de la ecuacion, que es f(x,y) esta representada en nuestro problema por (deltaest-delta)/CRM % que es una funcion de x y de y, o lo que es lo mismo de t y de delta, pues la variable delta % esta representada por el termino delta y la varieble del tiempo por deltaest, pues es funcion solo % de t ya que en x esta evaluada sobre los puntos de gauss. % Asi x0=t0; y(x0)=y(t0)=y0=delta0; z0 es igual: dy/dx=ddelta/dt=z0. t0=0; z0=0; delta0=0; delta=zeros(2*n,m); invCRM=inv(C*R*M); inc=zeros(2*n,m); inc(:,1)=h*(z0+1/2*h*invCRM*(deltaest(:,1)-delta(:,1))); delta(:,2)=delta(:,1)+inc(:,1); for k=2:m-1 inc(:,k)=inc(:,k-1)+h*h*invCRM*(deltaest(:,k)-delta(:,k)); delta(:,k+1)=delta(:,k)+inc(:,k); end t=zeros(1,m); for k=1:m t(k)=t0+(k-1)*h; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% FINAL DE STOERM %%%%%%%%%%%%%%%%%%%%%%%%%%%%
  10. 10. GAUSS.M function[x,w]=gauss(x1,x2,n) eps=0.001; m=(n+1)/2; xm=0.5*(x1+x2); xl=0.5*(x2-x1); for i=1:m z=cos(pi*(i-0.25)/(n+0.5)); p1=1; p2=0; for j=1:n p3=p2; p2=p1; p1=((2*j-1)*z*p2-(j-1)*p3)/j; end pp=n*(z*p1-p2)/(z*z-1); z1=z; z=z1-p1/pp; while abs(z-z1)>eps p1=1; p2=0; for j=1:n p3=p2; p2=p1; p1=((2*j-1)*z*p2-(j-1)*p3)/j; end pp=n*(z*p1-p2)/(z*z-1); z1=z; z=z1-p1/pp; end x(i,1)=xm-xl*z; x(n+1-i,1)=xm+xl*z; w(i,1)=2*xl/((1-z*z)*pp*pp); w(n+1-i,1)=w(i); end; PALAHOMER.M % Este script nos va a permitir obtener los datos geometricos necesarios % para el programa homer, de manera que si queremos modificar esos datos % simplemente tendremos que correr previamente este script para generar el % mat file usado en homer. Hacemos esto porq si no hay q modificar ningun % dato de la pala, es decir, estamos analizando una pala de unas % caracteristicas concretas, el programa de analisis homer se ejecutara mas
  11. 11. % rapido. % Asi: L=26; % longitud de la viga(m) planosZ=linspace(0,L,L+1); % vector longitud en el que vamos a calcular valores tipo=2; % definimos el tipo de pala que queremos de los modelos a estudio. % Recordar: tipo=1 pala con distribucion de webs desde transicion % tipo=2 pala con webs solo zona aerodinamica % tipo=3 pala sin ninguna distribucion de webs. % Centros de masas de las secciones (consideraremos ademas que coinciden % con los centros de torsion o shear center, por lo que la inercia y la % torsion se producira sobre estos puntos): [xg,yg] = cmasas(planosZ,tipo); % estos valores estan calculados para cada seccion % respecto a unos ejes x,y que pasan por su leading edge. % Momentos de inercia de las secciones: [cuerda,torsion,espesorrel,xoffset,web1,web2,grosmat] = palalmlineal(planosZ); [Ixggir,Iyggir,Ixyggir] = mominercia(planosZ,tipo,xg,yg,torsion); % inercia sobre ejes que pasan por xg,yg % Hay que pasar estos valores a las direcciones globales de batimiento y % arrastre: IX=Iyggir; % Direccion general de batimiento de la pala (X). IY=Ixggir; % Direccion general de arrastre de la pala (Y). IXY=-Ixyggir; % Efecto en el cambio del producto de inercia por el sentido de ejes considerado % Sentido de la direccion de batimiento: sentido de la velocidad del viento. % Sentido de la direccion de arrastre: Hacia el extrados del perfil. % Areas de las secciones: variable area [xext,yextraext,yintraext,xint,yextraint,yintraint,area]=secciontotpch ip(planosZ,tipo); % Modulos de torsion: 'modtor' [modtor]=modulotorsion(planosZ); % Una vez obtenidas estas variables generamos un mat-file para el programa % homer que las contenga. Este archivo se llamara geometria: save geometria
  12. 12. W1.M function [reponse] = w1(x,xi) global E; global IX; global IY; global IXY; global K; global area; global G; global modtor; global Kt; global CL; global L; global planosZ; x=x*L; xi=xi*L; P=1; puntis=30; if CL==1 if x<xi if x==0 reponse=0; % la viga esta empotrada, su extremo no se mueve. else % metodo Hermite: XH=linspace(0,x,puntis); % XH es la variable de integracion. MfH=P*(xi-XH); %Para no torsion: %I=pchip(planosZ,IY,XH); % BATIMIENTO (FLAP) %I=pchip(planosZ,IX,XH); % ARRASTRE (LAG) %FH=(MfH./(E.*I)).*(x-XH); % Para torsion: Iy=pchip(planosZ,IY,XH); Ix=pchip(planosZ,IX,XH); Ixy=pchip(planosZ,IXY,XH); FH=((MfH.*Ix)./(E.*(Ix.*Iy-Ixy.^2))).*(x-XH); % BATIMIENTO (FLAP) %FH=((MfH.*Iy)./(E.*(Ix.*Iy-Ixy.^2))).*(x-XH); % ARRASTRE (LAG) trapecio=sum(diff(XH).*(FH(1:end-1)+FH(2:end))/2); % añadimos la parte de hermite a la parte ttrapezoidal. h = diff(XH); delta = diff(FH)./h; d = pchipslopes(h,delta); D = sum((h.^2).*(d(2:end)-d(1:end-1))/12); reponse=trapecio-D; %reponse =-(x^2*L^3/(2*E*I)*(x/3-xi)); sin cortante %1 reponse = -(-(L/(K*A*G)*x) + x^2*L^3/(2*E*I)*(x/3- xi)); con %cortante end else if x==0 reponse=0; % la viga esta empotrada, su extremo no se mueve. else
  13. 13. % metodo Hermite: XH=linspace(0,xi,puntis); % XH es la variable de integracion. MfH=P*(xi-XH); %Para no torsion: %I=pchip(planosZ,IY,XH); % BATIMIENTO (FLAP) %I=pchip(planosZ,IX,XH); % ARRASTRE (LAG) %FH=(MfH./(E.*I)).*(x-XH); % Para torsion: Iy=pchip(planosZ,IY,XH); Ix=pchip(planosZ,IX,XH); Ixy=pchip(planosZ,IXY,XH); FH=((MfH.*Ix)./(E.*(Ix.*Iy-Ixy.^2))).*(x-XH); % BATIMIENTO (FLAP) %FH=((MfH.*Iy)./(E.*(Ix.*Iy-Ixy.^2))).*(x-XH); % ARRASTRE (LAG) trapecio=sum(diff(XH).*(FH(1:end-1)+FH(2:end))/2); % añadimos la parte de hermite a la parte ttrapezoidal. h = diff(XH); delta = diff(FH)./h; d = pchipslopes(h,delta); D = sum((h.^2).*(d(2:end)-d(1:end-1))/12); reponse=trapecio-D; %reponse = -(xi^2*L^2/(2*E*I)*(xi/3-x)*L); %1 reponse = -(-L/(K*A*G)*xi + xi^2*L^2/(2*E*I)*(xi/3-x)*L); end end end W3.M function [reponse] = w3(x,xi) global E; global IX; global IY; global IXY; global K; global area; global G; global modtor; global Kt; global CL; global L; global planosZ; if CL==1 if x<xi reponse =L^2/(2*Kt)*x^2; else reponse =L^2/(2*Kt)*xi^2; % xi*L/Kt*(xi/2-x)*L; end end
  14. 14. FI1.M function [reponse] = fi1(x,xi) global E; global IX; global IY; global IXY; global K; global area; global G; global modtor; global Kt; global CL; global L; global planosZ; if CL==1 if x<xi reponse =x*L/Kt*(xi-x/2)*L; else reponse =xi^2*L^2/(2*Kt); end end FI3.M function [reponse] = fi3(x,xi) global E; global IX; global IY; global IXY; global K; global area; global G; global modtor; global Kt; global CL; global L; global planosZ; x=x*L; xi=xi*L; puntis=30; if CL==1 if x<xi if x==0 reponse=0; % la viga esta empotrada, su extremo no se mueve. else % metodo Hermite: XH=linspace(0,x,puntis); % XH es la variable de integracion. MtH=1; J=pchip(planosZ,modtor,XH); FH=(MtH./(G.*J)); trapecio=sum(diff(XH).*(FH(1:end-1)+FH(2:end))/2);
  15. 15. % añadimos la parte de hermite a la parte ttrapezoidal. h = diff(XH); delta = diff(FH)./h; d = pchipslopes(h,delta); D = sum((h.^2).*(d(2:end)-d(1:end-1))/12); reponse=trapecio-D; %reponse =-(x^2*L^3/(2*E*I)*(x/3-xi)); sin cortante %1 reponse = -(-(L/(K*A*G)*x) + x^2*L^3/(2*E*I)*(x/3- xi)); con %cortante end else if x==0 reponse=0; % la viga esta empotrada, su extremo no se mueve. else % metodo Hermite: XH=linspace(0,xi,puntis); % XH es la variable de integracion. MtH=1; J=pchip(planosZ,modtor,XH); FH=(MtH./(G.*J)); trapecio=sum(diff(XH).*(FH(1:end-1)+FH(2:end))/2); % añadimos la parte de hermite a la parte ttrapezoidal. h = diff(XH); delta = diff(FH)./h; d = pchipslopes(h,delta); D = sum((h.^2).*(d(2:end)-d(1:end-1))/12); reponse=trapecio-D; %reponse = -(xi^2*L^2/(2*E*I)*(xi/3-x)*L); %1 reponse = -(-L/(K*A*G)*xi + xi^2*L^2/(2*E*I)*(xi/3-x)*L); end end end
  16. 16. CÁLCULO DE FUERZAS FUERZASCICLO.M % Este programa permite calcular las fuerzas aerodinámicas a las que % se encuentra sometida una pala del aerogenerador en su movimiento de % giro , dando lugar a fuerzas ciclicas de frecuencia 1P. giro1=[0:20:360]*pi/180; num=length(giro1); % Programa calculo aerogenerador STRIP THEORY (CIEMAT) % Vamos a intentar calcular la distribucion de fuerzas sobre un rotor % que presenta las siguientes caracteristicas geometricas en sus palas. % Llamada a los programas que contienen la geometria del rotor. rbuje=1; % (m) L=26; % (m) R=L+rbuje; % Radio de 27 m. %x=0.1:0.01:1; x=(7:2:25)*(1/L); % vector de puntos con longitudes adimensionales con la longitud de la pala. puntos=length(x); % numero de puntos en q dividimos la pala elementos=puntos-1; % numero de elementos de pala en que queda dividida la misma. l=x*L; % distribucion de longitudes de pala (distancias medidas desde la base de la pala) r=l+rbuje; % distribución de radios N=3; % número de palas de la aeroturbina (separadas por tanto 120 grados entre si). ro=1.225; % densidad del aire a T=25ºC nu=1.5e-5; % viscosidad cinematica del aire a T=25ºC, nu = viscosidad dinamica/ro (m^2/s) omrpm=25; % velocidad de giro de la maquina en revoluciones por minuto omega=omrpm/(60/(2*pi)); % velocidad de giro de la maquina en rad/s %Vhub=omega*R/lambda; % velocidad del viento a la altura del buje (m/s) Vhub=25; % velocidad del viento a la altura del buje (m/s) lambda=omega*R/Vhub; % cociente entre la velocidad de punta de pala y la velocidad viento en el buje hbuje=50; % altura del buje. Se puede utilizar la expresion hbuje=0.75D +10 m siendo D el diámetro del rotor. [cuerda,torsion,espesorrel]=palalmlineal(l); % variacion lineal de la cuerda. teta=torsion*pi/180; % pasamos torsion q esta en grados a radianes. %%%%%%%%%%% CALCULO DE LOS VALORES ADIMENSIONALES DEL PROBLEMA %%%%%%%%%%
  17. 17. %lan=(omega/Vhub)*r; % parametro de avance local de la pala sigma=(N/pi)*cuerda./r; % solidez local de la pala % Consideraremos en este apartado que el viento no es uniforme sino que presenta cortadura vertical. % Cada pala esta afectada por un viento distinto, asi que numeraremos las tres palas con los coeficientes 1,2 y 3. for s=1:num %giro1=0; % angulo de giro en el que se encuentra la pala 1 en el plano del rotor giro2=giro1(s)+(2/3)*pi; % angulo en el que se encuentra la pala 2 (120 grados mas que la 1) giro3=giro1(s)-(2/3)*pi; % angulo en el que se encuentra la pala (120 grados menos que la 1) % Calculo de las palas. h1=hbuje+r.*sin(giro1(s)); % vector de alturas de los elementos de pala de la pala 1. h2=hbuje+r.*sin(giro2); % vector de alturas de los elementos de pala de la pala 2. h3=hbuje+r.*sin(giro3); % vector de alturas de los elementos de pala de la pala 3. v1=viento(h1,Vhub,hbuje); % vector de velocidades de viento incidente en cada tramo de la pala 1. % se ve como se ha llamado a la funcion viento, considerando como valores % de referencia la velocidad q queremos en el buje y la altura del mismo. v2=viento(h2,Vhub,hbuje); % vector de velocidades de viento incidente en cada tramo de la pala 2. v3=viento(h3,Vhub,hbuje); % vector de velocidades de viento incidente en cada tramo de la pala 3. for k=1:puntos; % k = seccion de la pala. La ultima es la anterior a la punta. j=1; a(1)=0; % valor inicial del parametro de velocidad inducida axial aprima(1)=0; % valor inicial del parametro de velocidad inducida tangencial [alfa,cl,cd,cm] = polarespala(l(k)); % Obtenemos los datos de las curvas polares de la seccion. while j<50 FI1(j)=atan((v1(k)/(omega*r(k)))*((1-a(j))/(1+aprima(j)))); FI2(j)=atan((v2(k)/(omega*r(k)))*((1-a(j))/(1+aprima(j)))); FI3(j)=atan((v3(k)/(omega*r(k)))*((1-a(j))/(1+aprima(j)))); alfa1(j)=FI1(j)-teta(k); alfa2(j)=FI2(j)-teta(k); alfa3(j)=FI3(j)-teta(k); alfagrad1(j)=alfa1(j)*180/pi; alfagrad2(j)=alfa2(j)*180/pi; alfagrad3(j)=alfa3(j)*180/pi; coefsust1(j)=pchip(alfa,cl,alfagrad1(j)); coefsust2(j)=pchip(alfa,cl,alfagrad2(j)); coefsust3(j)=pchip(alfa,cl,alfagrad3(j)); %coefresist1(j)= pchip(cl1,cd,coefsust1(j));
  18. 18. %coefresist2(j)= pchip(cl1,cd,coefsust2(j)); %coefresist3(j)= pchip(cl1,cd,coefsust3(j)); coefresist1(j)= pchip(alfa,cd,alfagrad1(j)); coefresist2(j)= pchip(alfa,cd,alfagrad2(j)); coefresist3(j)= pchip(alfa,cd,alfagrad3(j)); % Vamos a incluir los efectos de perdida en punta de pala a traves % del factor de Prandtl Fp. Fp1(j)=(2/pi)*acos(exp(-(N*(R-r(k)))/(2*r(k)*sin(FI1(j))))); Fp2(j)=(2/pi)*acos(exp(-(N*(R-r(k)))/(2*r(k)*sin(FI2(j))))); Fp3(j)=(2/pi)*acos(exp(-(N*(R-r(k)))/(2*r(k)*sin(FI3(j))))); % Vamos a ver el resultado segun dos libros diferentes, el de % Arnalte Gomez y el del Ciemat (al primero le daremos el subindice % 1 para los datos calculados y al segundo el valor 2) Y(j)=(1/Vhub^2)*(sigma(k)/(8*N))*((v1(k)^2/(sin(FI1(j)))^2)*(coefsust1 (j)*cos(FI1(j))+coefresist1(j)*sin(FI1(j)))+... (v2(k)^2/(sin(FI2(j)))^2)*(coefsust2(j)*cos(FI2(j))+coefresist2(j)*sin (FI2(j)))+... (v3(k)^2/(sin(FI3(j)))^2)*(coefsust3(j)*cos(FI3(j))+coefresist3(j)*sin (FI3(j)))); Z(j)=(1/Vhub)*(sigma(k)/(8*N))*((v1(k)/(sin(FI1(j))*cos(FI1(j))))*(coe fsust1(j)*sin(FI1(j))-coefresist1(j)*cos(FI1(j)))+... (v2(k)/(sin(FI2(j))*cos(FI2(j))))*(coefsust2(j)*sin(FI2(j))- coefresist2(j)*cos(FI2(j)))+... (v3(k)/(sin(FI3(j))*cos(FI3(j))))*(coefsust3(j)*sin(FI3(j))- coefresist3(j)*cos(FI3(j)))); % Segun libro Arnalte Gomez. % a(j+1)=Y(j)*(1/Fp(j))/(Y(j)*(1/Fp(j))+1); % aprima(j+1)=Z(j)*(1/Fp(j))/(1-Z(j)*(1/Fp(j))); % En este caso como divide directamente por los coeficientes Y y Z % por el factor Fp se dispara mas la solucion de A en la punta de % la pala q en el caso del ciemat, donde la subida no es tan % grande. % Segun libro del ciemat. %%%%%%%%%%%%%%%%%%%%%%%%% MATLAB 5.3 %%%%%%%%%%%%%%%%%%%%%%%%%%% %g=inline('(u.^2)*(constante1+constante2^2)- u*(2*constante1+constante2)+constante1','u','constante1','constante2') ; %constante1=Y(j); %constante2=Fp1(j);
  19. 19. %a(j+1)=fzero(g,[0 1],[],0,constante1,constante2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% MATLAB 7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% constante1=Y(j); constante2=Fp1(j); g=@(u)(u.^2)*(constante1+constante2^2)- u*(2*constante1+constante2)+constante1; a(j+1)=fzero(g,[0 1]); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Zprima(j)=Z(j)*(1-a(j+1))/(Fp1(j)*(1-a(j+1)*Fp1(j))); aprima(j+1)=Zprima(j)/(1-Zprima(j)); j=j+1; end % Guardamos en un nuevo vector los valores resultantes de la % convergencia (ver que j tiene q reducirse en 1 pues sale con un valor % adicional con el que ya no entra en el bucle. A(k)=a(j-1); Aprima(k)=aprima(j-1); fi1(k)=FI1(j-1); fi2(k)=FI2(j-1); fi3(k)=FI3(j-1); figrad1(k)=FI1(j-1)*180/pi; figrad2(k)=FI2(j-1)*180/pi; figrad3(k)=FI3(j-1)*180/pi; alphagrad1(k)=alfagrad1(j-1); alphagrad2(k)=alfagrad2(j-1); alphagrad3(k)=alfagrad3(j-1); Coefsust1(k)=coefsust1(j-1); Coefsust2(k)=coefsust2(j-1); Coefsust3(k)=coefsust3(j-1); Coefresist1(k)=coefresist1(j-1); Coefresist2(k)=coefresist2(j-1); Coefresist3(k)=coefresist3(j-1); Coefmoment1(k)=pchip(alfa,cm,alphagrad1(k)); Coefmoment2(k)=pchip(alfa,cm,alphagrad2(k)); Coefmoment3(k)=pchip(alfa,cm,alphagrad3(k)); y(k)=Y(j-1); z(k)=Z(j-1); fp1(k)=Fp1(j-1); fp2(k)=Fp2(j-1); fp3(k)=Fp3(j-1); end % Nota: hay que darse cuenta que no se han calculado en el bucle los % valores de los datos correspondientes a la punta de la pala. Esto nos permite despues a la hora de calcular la distribucion de fuerzas sobre los elementos de pala de la misma no tener que eliminar el dato de los valores de la punta de pala de los distintos vectores, pues el numero de elementos de pala es igual al numero de puntos en que hemos dividido la pala menos 1. %figure(1) %plot(x(1:k),A,x(1:k),A,'mo');
  20. 20. %title('Velocidad inducida axial a') %xlabel('r/R') %ylabel('a') %grid %figure(2) %plot(x(1:k),Aprima,x(1:k),Aprima,'mo'); %title('Velocidad inducida tangencial aprima') %xlabel('r/R') %ylabel('aprima') %grid %%%%%%%% CALCULO DE LAS VARIABLES DIMENSIONALES DE TURBINA %%%%%%%%%%%%% elementos=puntos; W1=((omega*r(1:elementos).*(1+Aprima)).^2+(v1(1:elementos).*(1- A)).^2).^0.5; % velocidad relativa a los perfiles pala 1 %W2=((omega*r(1:elementos).*(1+Aprima)).^2+(v2(1:elementos).*(1- A)).^2).^0.5; % velocidad relativa a los perfiles pala 2 %W3=((omega*r(1:elementos).*(1+Aprima)).^2+(v3(1:elementos).*(1- A)).^2).^0.5; % velocidad relativa a los perfiles pala 3 deltaR=2; % elemento diferencial de radio (concentramos las cargas en distancias de 2m) Cx1=Coefsust1.*cos(fi1)+ Coefresist1.*sin(fi1); % Coeficiente Cx1 %Cx2=Coefsust2.*cos(fi2)+ Coefresist2.*sin(fi2); % Coeficiente Cx2 %Cx3=Coefsust3.*cos(fi3)+ Coefresist3.*sin(fi3); % Coeficiente Cx3 Cy1=Coefsust1.*sin(fi1)- Coefresist1.*cos(fi1); % Coeficiente Cy1 %Cy2=Coefsust2.*sin(fi2)- Coefresist2.*cos(fi2); % Coeficiente Cy2 %Cy3=Coefsust3.*sin(fi3)- Coefresist3.*cos(fi3); % Coeficiente Cy3 % distribución de fuerza axial en las palas (Newton) Fax1(s,:)=0.5*ro*cuerda(1:elementos).*(W1.^2).*Cx1*deltaR; %Fax2=0.5*ro*cuerda(1:elementos).*(W2.^2).*Cx2*deltaR; %Fax3=0.5*ro*cuerda(1:elementos).*(W3.^2).*Cx3*deltaR; % Numero de Reynolds del perfil: Re1=(W1.*cuerda(1:elementos))/nu; %Re2=(W2.*cuerda(1:elementos))/nu; %Re3=(W3.*cuerda(1:elementos))/nu; % distribucion de fuerza tangencial en las palas (Newton) Ftan1(s,:)=0.5*ro*cuerda(1:elementos).*(W1.^2).*Cy1*deltaR; %Ftan2=0.5*ro*cuerda(1:elementos).*(W2.^2).*Cy2*deltaR; %Ftan3=0.5*ro*cuerda(1:elementos).*(W3.^2).*Cy3*deltaR; % distribucion de momentos torsores o de cabeceo en los perfiles (N*m). Mca1(s,:)=0.5*ro*((cuerda(1:elementos)).^2).*(W1.^2).*Coefmoment1*delt aR; %Mca2=0.5*ro*((cuerda(1:elementos)).^2).*(W2.^2).*Coefmoment2*deltaR; %Mca3=0.5*ro*((cuerda(1:elementos)).^2).*(W3.^2).*Coefmoment3*deltaR; % Fuerzas de sustentacion en los perfiles (Newton). L1(s,:)=0.5*ro*cuerda(1:elementos).*(W1.^2).*Coefsust1*deltaR;
  21. 21. %L2=0.5*ro*cuerda(1:elementos).*(W2.^2).*Coefsust2*deltaR; %L3=0.5*ro*cuerda(1:elementos).*(W3.^2).*Coefsust3*deltaR; % Fuerzas de resistencia en los perfiles (Newton). D1(s,:)=0.5*ro*cuerda(1:elementos).*(W1.^2).*Coefresist1*deltaR; %D2=0.5*ro*cuerda(1:elementos).*(W2.^2).*Coefresist2*deltaR; %D3=0.5*ro*cuerda(1:elementos).*(W3.^2).*Coefresist3*deltaR; % Distancias entre el centro aerodinamico y el centro de presiones en cada perfil aerodinamico (m). lcp1=-Mca1./L1; %lcp2=-Mca2./L2; %lcp3=-Mca3./L3; end % NOTA: Hemos considerado la velocidad en el buje como una velocidad media % sobre las areas que atraviesa el viento. Esto seguramente puede ser % mejorado calculando una velocidad media sobre el área de paso de forma % mas precisa que esta mera aproximacion. En principio nos vale de momento % asi. % Una vez hecho esto, tenemos el modelo de cargas concentradas para los % distintos angulos de giro de la turbina. Las columnas de las matrices % corresponden a las variaciones de las fuerzas en el tiempo para las % secciones correspondientes (columna 1 = seccion 1 y así). % Si dibujamos la variación de la fuerza sobre una seccion, por ejemplo la % ultima, tenemos: figure(1) plot((giro1)*180/pi,Fax1(:,end),'-o') % Para todas las secciones figure(2) plot((giro1)*180/pi,Fax1,'-o') % Y como funcion del tiempo figure(3) plot((giro1)*60/(omrpm*2*pi),Fax1,'-o') % A continuacion calcularemos la funcion de distribucion de masas. k= 10/4; % relación de espesor entre el núcleo y las pieles del sandwich. dens=(2*1750+144*k)/(2+k); % densidad del sandwich (kg/m^3): fibra de vidrio epoxi + balsa core. tipo=2; g=9.81 % aceleracion de la gravedad (m/s^2) [xextH,yextraextH,yintraextH,xintH,yextraintH,yintraintH,areatot]=secc iontotpchip(l,tipo);
  22. 22. % la funcion de distribucion de masas es Funmasa=areatot.*dens; % las fuerzas masicas que analizaremos con el modelo de cargas concentradas % seran: Peso=Funmasa*deltaR*g; % La funcion peso varía en el tiempo su contribucion a la Ftangencial que % mueve el aerogenerador. Esa variacion es de tipo cosenoidal: for f=1:num Ftanpeso(f,:)=-Peso(1:end)*cos(giro1(f)); % hay una seccion menos como en el resto de fuerzas end Ftantot=Ftan1+Ftanpeso; figure(4) plot((giro1)*60/(omrpm*2*pi),Ftantot,'-o') figure(5) plot((giro1)*60/(omrpm*2*pi),Ftantot(:,end),'-o') % Calculamos finalmente el momento torsor definitivo sobre las secciones: [xg,yg] = cmasas(l,tipo); [cuerda,torsion] = palalmlineal(l); for j=1:elementos Mtorsor(:,j)=(xg(j)-0.25*cuerda(j))*(- Ftan1(:,j)*sin(torsion(j)*pi/180)-Fax1(:,j)*cos(torsion(j)*pi/180)) + yg(j)*(- Ftan1(:,j)*cos(torsion(j)*pi/180)+Fax1(:,j)*sin(torsion(j)*pi/180))+(- Mca1(:,j)); end figure(6) plot((giro1)*60/(omrpm*2*pi),Mtorsor,'-o') save cargasoperacion Fax1 Ftan1 Ftanpeso Ftantot Mca1 Mtorsor giro1 omrpm
  23. 23. VIENTO.M % Funcion de variacion de la velocidad del aire con la altura. function [v] = viento(h,v0,h0) % La funcion de velocidad del viento depende de los siguientes parámetros: % h: altura (m) a la cual se quiere calcular la velocidad del viento v % (m/s) % v0: velocidad de referencia a la altura de referencia h0 (por ejemplo % velocidad medida por un anemómetro a una determinada altura). % h0: altura de referencia (m) a la que se conoce la velocidad. n=0.2; % coeficiente potencial que depende del tipo de terreno n = [0.13-0.20] en superficie moderadamente rugosa. v=v0*(h/h0).^n; % velocidad del viento a una altura h del suelo. POLARESPALA.M % Archivo que contiene las curvas polares de los perfiles de la pala LM26 % según la geometría definida en palalmlineal. % Procedamos a leer los datos de las secciones analizadas (uso de XFOIL y % AIRFOIL_PREP). function [alfa,Cl,Cd,Cm] = polarespala(l) % alfa es un vector, no una matriz como pueden ser el resto de salidas ya % que siempre consideraremos los mismos valores de alfa para todas las % secciones y todas las curvas (se queda en un vector porque no hace falta % hacer una matriz redundante con todas las filas iguales) L=26; % 26m de longitud de pala longit=length(l); for i=1:longit if l(i)<0 | l(i)>L error('introduzca un/unos valor/es de longitud entre L=0 y L=26 (m)') end end % sección L=3m; CILINDRO (consideramos CL=0,CM=0,CD=1.17= constante) CL3=0; CM3=0; CD3=1.17; % seccion L=6m: matrix6=XLSREAD('perfil6m.xls','tableExtrap','H15:K87'); alpha6=matrix6(:,1);
  24. 24. CL6=matrix6(:,2); CD6=matrix6(:,3); CM6=matrix6(:,4); % seccion L=7m matrix7=XLSREAD('perfil7m.xls','tableExtrap','H15:K82'); alpha7=matrix7(:,1); CL7=matrix7(:,2); CD7=matrix7(:,3); CM7=matrix7(:,4); % seccion L=9m matrix9=XLSREAD('perfil9m.xls','tableExtrap','H15:K82'); alpha9=matrix9(:,1); CL9=matrix9(:,2); CD9=matrix9(:,3); CM9=matrix9(:,4); % seccion L=11m matrix11=XLSREAD('perfil11m.xls','tableExtrap','H15:K82'); alpha11=matrix11(:,1); CL11=matrix11(:,2); CD11=matrix11(:,3); CM11=matrix11(:,4); % seccion L=13m matrix13=XLSREAD('perfil13m.xls','tableExtrap','H15:K82'); alpha13=matrix13(:,1); CL13=matrix13(:,2); CD13=matrix13(:,3); CM13=matrix13(:,4); % seccion L=15m matrix15=XLSREAD('perfil15m.xls','tableExtrap','H15:K82'); alpha15=matrix15(:,1); CL15=matrix15(:,2); CD15=matrix15(:,3); CM15=matrix15(:,4); % seccion L=17m matrix17=XLSREAD('perfil17m.xls','tableExtrap','H15:K82'); alpha17=matrix17(:,1); CL17=matrix17(:,2); CD17=matrix17(:,3); CM17=matrix17(:,4); % seccion L=19m matrix19=XLSREAD('perfil19m.xls','tableExtrap','H15:K82'); alpha19=matrix19(:,1); CL19=matrix19(:,2); CD19=matrix19(:,3); CM19=matrix19(:,4); % seccion L=21m
  25. 25. matrix21=XLSREAD('perfil21m.xls','tableExtrap','H15:K82'); alpha21=matrix21(:,1); CL21=matrix21(:,2); CD21=matrix21(:,3); CM21=matrix21(:,4); % seccion L=23m matrix23=XLSREAD('perfil23m.xls','tableExtrap','H15:K82'); alpha23=matrix23(:,1); CL23=matrix23(:,2); CD23=matrix23(:,3); CM23=matrix23(:,4); % seccion L=25m matrix25=XLSREAD('perfil25m.xls','tableExtrap','H15:K82'); alpha25=matrix25(:,1); CL25=matrix25(:,2); CD25=matrix25(:,3); CM25=matrix25(:,4); % seccion L=26m matrix26=XLSREAD('perfil26m.xls','tableExtrap','H15:K87'); alpha26=matrix6(:,1); CL26=matrix26(:,2); CD26=matrix26(:,3); CM26=matrix26(:,4); % Definamos los valores del angulo de ataque que queremos obtener: alfa=[-180:10:-20 -19:1:30 35:5:60 70:10:180]; % Con esos valores de alfa, definamos los valores de CD,CL,CM de las % secciones criticas, para que todas tengan el mismo numero de puntos y % para los mismos alfas. % seccion L=3m: Cl3=zeros(1,length(alfa)); Cd3=1.17*ones(1,length(alfa)); Cm3=zeros(1,length(alfa)); % seccion L=6m: Cl6=pchip(alpha6,CL6,alfa); Cd6=pchip(alpha6,CD6,alfa); Cm6=pchip(alpha6,CM6,alfa); % seccion L=7m Cl7=pchip(alpha7,CL7,alfa); Cd7=pchip(alpha7,CD7,alfa); Cm7=pchip(alpha7,CM7,alfa); % seccion L=9m Cl9=pchip(alpha9,CL9,alfa); Cd9=pchip(alpha9,CD9,alfa); Cm9=pchip(alpha9,CM9,alfa); % seccion L=11m Cl11=pchip(alpha11,CL11,alfa); Cd11=pchip(alpha11,CD11,alfa); Cm11=pchip(alpha11,CM11,alfa);
  26. 26. % seccion L=13m Cl13=pchip(alpha13,CL13,alfa); Cd13=pchip(alpha13,CD13,alfa); Cm13=pchip(alpha13,CM13,alfa); % seccion L=15m Cl15=pchip(alpha15,CL15,alfa); Cd15=pchip(alpha15,CD15,alfa); Cm15=pchip(alpha15,CM15,alfa); % seccion L=17m Cl17=pchip(alpha17,CL17,alfa); Cd17=pchip(alpha17,CD17,alfa); Cm17=pchip(alpha17,CM17,alfa); % seccion L=19m Cl19=pchip(alpha19,CL19,alfa); Cd19=pchip(alpha19,CD19,alfa); Cm19=pchip(alpha19,CM19,alfa); % seccion L=21m Cl21=pchip(alpha21,CL21,alfa); Cd21=pchip(alpha21,CD21,alfa); Cm21=pchip(alpha21,CM21,alfa); % seccion L=23m Cl23=pchip(alpha23,CL23,alfa); Cd23=pchip(alpha23,CD23,alfa); Cm23=pchip(alpha23,CM23,alfa); % seccion L=25m Cl25=pchip(alpha25,CL25,alfa); Cd25=pchip(alpha25,CD25,alfa); Cm25=pchip(alpha25,CM25,alfa); % seccion L=26m Cl26=pchip(alpha26,CL26,alfa); Cd26=pchip(alpha26,CD26,alfa); Cm26=pchip(alpha26,CM26,alfa); for j=1:longit if l(j)<=3 Cl(j,:)=Cl3; Cm(j,:)=Cm3; Cd(j,:)=Cd3; elseif l(j)<=6 % interpolamos entre la seccion L=3 y L=6 % definimos el peso: W W=((l(j)-3)/(6-3)); Cd(j,:)=W*Cd6 + (1-W)*Cd3; Cl(j,:)=W*Cl6 + (1-W)*Cl3; Cm(j,:)=W*Cm6 + (1-W)*Cm3; elseif l(j)<=7 % interpolamos entre la seccion L=6 y L=7 % definimos el peso: W W=((l(j)-6)/(7-6)); Cd(j,:)=W*Cd7 + (1-W)*Cd6; Cl(j,:)=W*Cl7 + (1-W)*Cl6; Cm(j,:)=W*Cm7 + (1-W)*Cm6; elseif l(j)<=9 % interpolamos entre la seccion L=7 y L=9 % definimos el peso: W W=((l(j)-7)/(9-7)); Cd(j,:)=W*Cd9 + (1-W)*Cd7; Cl(j,:)=W*Cl9 + (1-W)*Cl7; Cm(j,:)=W*Cm9 + (1-W)*Cm7; elseif l(j)<=11 % interpolamos entre la seccion L=9 y L=11
  27. 27. % definimos el peso: W W=((l(j)-9)/(11-9)); Cd(j,:)=W*Cd11 + (1-W)*Cd9; Cl(j,:)=W*Cl11 + (1-W)*Cl9; Cm(j,:)=W*Cm11 + (1-W)*Cm9; elseif l(j)<=13 % interpolamos entre la seccion L=11 y L=13 % definimos el peso: W W=((l(j)-11)/(13-11)); Cd(j,:)=W*Cd13 + (1-W)*Cd11; Cl(j,:)=W*Cl13 + (1-W)*Cl11; Cm(j,:)=W*Cm13 + (1-W)*Cm11; elseif l(j)<=15 % interpolamos entre la seccion L=13 y L=15 % definimos el peso: W W=((l(j)-13)/(15-13)); Cd(j,:)=W*Cd15 + (1-W)*Cd13; Cl(j,:)=W*Cl15 + (1-W)*Cl13; Cm(j,:)=W*Cm15 + (1-W)*Cm13; elseif l(j)<=17 % interpolamos entre la seccion L=15 y L=17 % definimos el peso: W W=((l(j)-15)/(17-15)); Cd(j,:)=W*Cd17 + (1-W)*Cd15; Cl(j,:)=W*Cl17 + (1-W)*Cl15; Cm(j,:)=W*Cm17 + (1-W)*Cm15; elseif l(j)<=19 % interpolamos entre la seccion L=17 y L=19 % definimos el peso: W W=((l(j)-17)/(19-17)); Cd(j,:)=W*Cd19 + (1-W)*Cd17; Cl(j,:)=W*Cl19 + (1-W)*Cl17; Cm(j,:)=W*Cm19 + (1-W)*Cm17; elseif l(j)<=21 % interpolamos entre la seccion L=19 y L=21 % definimos el peso: W W=((l(j)-19)/(21-19)); Cd(j,:)=W*Cd21 + (1-W)*Cd19; Cl(j,:)=W*Cl21 + (1-W)*Cl19; Cm(j,:)=W*Cm21 + (1-W)*Cm19; elseif l(j)<=23 % interpolamos entre la seccion L=21 y L=23 % definimos el peso: W W=((l(j)-21)/(23-21)); Cd(j,:)=W*Cd23 + (1-W)*Cd21; Cl(j,:)=W*Cl23 + (1-W)*Cl21; Cm(j,:)=W*Cm23 + (1-W)*Cm21; elseif l(j)<=25 % interpolamos entre la seccion L=23 y L=25 % definimos el peso: W W=((l(j)-23)/(25-23)); Cd(j,:)=W*Cd25 + (1-W)*Cd23; Cl(j,:)=W*Cl25 + (1-W)*Cl23; Cm(j,:)=W*Cm25 + (1-W)*Cm23; elseif l(j)<=26 % interpolamos entre la seccion L=25 y L=26 % definimos el peso: W W=((l(j)-25)/(26-25)); Cd(j,:)=W*Cd26 + (1-W)*Cd25; Cl(j,:)=W*Cl26 + (1-W)*Cl25; Cm(j,:)=W*Cm26 + (1-W)*Cm25;
  28. 28. end end RAFAGA_PARKED.M % Programa de determinación de las fuerzas a las que esta sometida la pala con el rotor parada bajo condiciones extremas de carga % Llamada a los programas que contienen la geometria del rotor. %palalm % programa q tiene la geometria de pala LM 26 (R = 26m) %rotor17 % programa q tiene la geometria de una pala de rotor 17m (R = 8.5m) rbuje=1; % (m) L=26; % (m) R=L+rbuje; % Radio de 27 m. %tetarad=tetagrad*pi/180; % distribución de torsion (radianes) %x=0.2:0.01:1; %x=0.1:0.01:1; x=(7:2:25)*(1/L); % vector de puntos con longitudes adimensionales con la longitud de la pala. puntos=length(x); % numero de puntos en q dividimos la pala elementos=puntos-1; % numero de elementos de pala en que queda dividida la misma. l=x*L; % distribucion de longitudes de pala (distancias medidas desde la base de la pala) r=l+rbuje; % distribución de radios %lambda=6; % cociente entre la velocidad de punta de pala y la velocidad viento en el buje N=3; % número de palas de la aeroturbina (separadas por tanto 120 grados entre si). ro=1.225; % densidad del aire a T=25ºC nu=1.5e-5; % viscosidad cinematica del aire a T=25ºC, nu = viscosidad dinamica/ro (m^2/s) %Vhub=11; % velocidad del viento en m/s en el buje del aerogenerador %omega=lambda*Vhub/R; % velocidad de giro de la aeroturbina (rad/s) %omrpm=omega*(60/(2*pi)); % velocidad giro en rpm %omrpm=25; % velocidad de giro de la maquina en revoluciones por minuto %omega=omrpm/(60/(2*pi)); % velocidad de giro de la maquina en rad/s %Vhub=omega*R/lambda; % velocidad del viento a la altura del buje (m/s) Vhub=70; %lambda=omega*R/Vhub; hbuje=50; % altura del buje. Se puede utilizar la expresion hbuje=0.75D +10 m siendo D el diámetro del rotor. %cuerda=spline(rc,c,r); % valores de cuerda para cada valor del vector x %teta=spline(rt,tetarad,r); % valores de angulo de torsion para valores de x (radianes) [cuerda,torsion,espesorrel]=palalmlineal(l); % variacion lineal de la cuerda. %[cuerda,torsion,espesorrel]=palalmpotencial(l); % variacion potencial de la cuerda.
  29. 29. teta=torsion*pi/180; % pasamos torsion q esta en grados a radianes. giro1=pi/2; % angulo de giro en el que se encuentra la pala 1 en el plano del rotor h1=hbuje+r.*sin(giro1); % vector de alturas de los elementos de pala de la pala 1. [alfa,cl,cd,cm] = polarespala(l); % Obtenemos los datos de las curvas polares de las secciones. alfagrad=90-torsion; % angulos de ataque de las secciones for j=1:puntos coefsust(j)=pchip(alfa,cl(j,:),alfagrad(j)); coefresist(j)=pchip(alfa,cd(j,:),alfagrad(j)); coefmoment(j)=pchip(alfa,cm(j,:),alfagrad(j)); end deltaR=2; % elemento diferencial de radio t0=3; % tiempo de duración del análisis t=0:0.01:t0; % vector de tiempos long=length(t); I=0.14; % factor de intensidad de la turbulencia omega=10; % frecuencia de las turbulencias en rad/s tipo=2; [xg,yg] = cmasas(l,tipo); %[cuerda,torsion] = palalmlineal(l); for j=1:long v1=(Vhub*(h1/hbuje).^0.11)*(1-I*cos(omega*t(j))); % vector de velocidades de viento incidente en cada tramo de la pala 1. % distribución de fuerza axial en las palas (Newton) Fax(j,:)=0.5*ro*cuerda(1:puntos).*(v1.^2).*coefresist*deltaR; % Numero de Reynolds del perfil: Re(j,:)=(v1.*cuerda(1:puntos))/nu; % distribucion de fuerza tangencial en las palas (Newton) Ftan(j,:)=0.5*ro*cuerda(1:puntos).*(v1.^2).*coefsust*deltaR; % distribucion de momentos torsores o de cabeceo en los perfiles (N*m). Mca(j,:)=0.5*ro*((cuerda(1:puntos)).^2).*(v1.^2).*coefmoment*deltaR;
  30. 30. Mtorsor(j,:)=(xg-0.25*cuerda).*(-Ftan(j,:).*sin(torsion*pi/180)- Fax(j,:).*cos(torsion*pi/180)) + yg.*(- Ftan(j,:).*cos(torsion*pi/180)+Fax(j,:).*sin(torsion*pi/180))+(- Mca(j,:)); end % Fuerza axial en toda la pala en un determinado tiempo plot(l,Fax(j,:),'.-') grid % Fuerza axial en las secciones en funcion del tiempo figure(2) plot(t,Fax,'.-') grid save cargaextrema Fax Ftan Mca Mtorsor t t0
  31. 31. GEOMETRÍA Y PARÁMETROS ESTRUCTURALES NACA44XX.M % Funcion q nos determinara la forma de un perfil naca 44xx de cuerda 1. function [Xu,Yu,Xl,Yl] = naca44xx(t) % Variables de entrada: % t = espesor por unidad de cuerda del perfil (valores entre 0 y 1) % Variables de salida: % Xu,Yu (upper) : determinan la forma del extrados del perfil (zona % superior) % Xl,Yl (lower) : determinan la forma del intrados del perfil (zona % inferior) % Perfiles NACA serie 4. % NACA cuatro cifras: % - La primera cifra indica la máxima flecha de la línea media en % con respecto a la cuerda. % Esta cifra define el parámetro m. % - La segunda cifra expresa la posición de la máxima flecha de la línea media con respecto % al borde de ataque, en tanto por diez respecto de la cuerda. Parámetro p. % - Por último las dos últimas cifras indican el espesor máximo del perfil en % con respecto % a la cuerda. Parámetro t. % De esta forma un perfil NACA 2415 presenta un espesor máximo de 15% relativo a cuerda (t=grosor/c=0.15) con % un valor de flecha máxima de la línea media del 2% relativo a la cuerda (m=Yc/c=0.02) situado a una % distancia del 40% de la cuerda desde el borde de ataque del perfil (p=posicion Yc/c=0.4). % A continuación escribiremos las ecuaciones que nos permitan determinar la geometria de este % tipo de perfiles. En función de los valores otorgados a m,p y t obtendremos un perfil u % otro de la mencionada serie. % A modo de ejemplo realizaremos el estudio del perfil NACA 4415. m=0.04; p=0.4; %[a,b]=TEXTREAD('extrados4415.txt','%f%f','headerlines',1); %x=a(end:-1:1)'; x=0:0.01:1; % Vector de puntos de la cuerda (cuerda unitaria)
  32. 32. % Línea de curvatura media: k=0; for s=x k=k+1; if s<=p Yc(k)=(m/p^2)*(2*p*s-s^2); DerYc(k)=(m/p^2)*(2*p-2*s); teta(k)=atan(DerYc(k)); else Yc(k)=(m/(1-p)^2)*((1-2*p)+2*p*s-s^2); DerYc(k)=(m/(1-p)^2)*(2*p-2*s); teta(k)=atan(DerYc(k)); end end % Distribución de espesor: Yt=(t/0.2)*(0.2969*x.^0.5-0.1260*x-0.3516*x.^2+0.2843*x.^3- 0.1015*x.^4); % Extradós del perfil(parte superior): Xu=x-Yt.*sin(teta); Yu=Yc+Yt.*cos(teta); % Intradós del perfil(parte inferior): Xl=x+Yt.*sin(teta); Yl=Yc-Yt.*cos(teta); PALALMLINEAL.M % Funcion que nos determina la geometria de la pala a una distancia l. function [cuerda,torsion,espesorrel,xoffset,web1,web2,grosmat] = palalmlineal(l) % Variables de entrada: Longitud en el que se quiere determinar la cuerda del % perfil (m). (valores comprendidos entre 0 y L = 26m.) % Variables de salida: % - Cuerda del perfil para una determinada distancia (m). % - Angulo de torsion o encastre (grados) del perfil para una longitud l. % - Espesor relativo del perfil en tanto por uno de la cuerda (m) para % una longitud dada l (m). % - Offset sobre el eje X de cada seccion, es decir, punto de % interseccion de la seccion con el eje X de envergadura de pala (en % tanto pot uno respecto de la cuerda de cada seccion) % - Posicion en tanto por uno de la cuerda que ocupa la web1 en los % distintos perfiles % - Posicion en tanto por uno de la cuerda que ocupa la web2 en los % distintos perfiles % - Distribucion de grosor de material a lo largo de la envergadura de
  33. 33. % la pala (m). L=26; % 26m de longitud de pala lon=length(l); for i=1:lon if l(i)<0 | l(i)>L error('introduzca un/unos valor/es de longitud entre L=0 y L=26 (m)') end end % Vamos a generar la siguiente distribucion de cuerdas. También % estableceremos las distribuciones de xoffset (como se coloca cada seccion % perpendicularmente al eje X de la pala, punto de corte de la seccion con % el eje X), la distribucion de las webs(listones perpendiculares q unen el % extrados e intrados del perfil para otorgarle mayor consistencia a la % seccion) y el espesor de material en cada seccion. relaspecto=0.02/0.15; % esta es la relacion grosor material/grosor del perfil. %espe=0.02; % tanto por uno respecto de la cuerda que quiero de espesor en las secciones. %C1=2.3; % cuerda maxima de la pala (m) n=-2; % exponente de la funcion de ajuste en las webs.(mas abajo indicado) en el tramo < lc1 % Si n=1 ===> Funcion lineal % Si n distinto de 1 ===> Funcion potencial % * n=0.5 ==> funcion raiz cuadrada sqrt(x) % * n=-1 ==> funcion 1/x % * n=-0.5 ==> funcion 1/sqrt(x) % * n=-2 ==> funcion 1/(x^2) ................... ajustar a la q mas nos guste. % Definimos los valores en las zonas clave de la pala: % Fin de la raiz: lc0=3; % longitud donde finaliza la zona que es igual q la raiz (m) C0=1.5; % cuerda en la raiz (m) xoffsraiz=0.5*C0; % offset de la raiz (m) dweb1raiz=(relaspecto/2)*C0; % distancia desde el borde de ataque hasta la linea media de web1 en la raiz (m) web1raiz=abs(xoffsraiz-dweb1raiz); % distancia absoluta de la linea media de la web1 al eje X longitudinal de la pala (m) dweb2raiz=C0-(relaspecto/2)*C0; % distancia desde el borde de ataque hasta la linea media de web2 en la raiz (m) web2raiz=abs(xoffsraiz-dweb2raiz); % distancia absoluta de la linea media de la web2 al eje X longitudinal de la pala (m) % Perfil de cuerda maxima de la pala lc1=6; % longitud del perfil de cuerda maxima (m) C1=2.3; % cuerda maxima de la pala (m) xoffsmax=0.325*C1; % offset en el perfil de cuerda maxima (m) dweb1max=0.15*C1; % distancia desde el borde de ataque hasta la linea media de web1 en el perfil de cuerda maxima (m) web1max=abs(xoffsmax-dweb1max); % distancia absoluta de la linea media de la web1 al eje X longitudinal de la pala (m)
  34. 34. dweb2max=0.5*C1; % distancia desde el borde de ataque hasta la linea media de web2 en el perfil de cuerda maxima (m) web2max=abs(xoffsmax-dweb2max); % distancia absoluta de la linea media de la web2 al eje X longitudinal de la pala (m) % Punta de la pala lc2=L; % longitud de la punta de la pala (m) C2=0.525; % cuerda en la punta de pala (m) xoffspunta=0.3*C2; % offset en el perfil de cuerda maxima (m) dweb1punta=0.15*C2; % distancia desde el borde de ataque hasta la linea media de web1 en el perfil de punta de pala (m) web1punta=abs(xoffspunta-dweb1punta); % distancia absoluta de la linea media de la web1 al eje X longitudinal de la pala (m) dweb2punta=0.5*C2; % distancia desde el borde de ataque hasta la linea media de web2 en el perfil de punta de pala (m) web2punta=abs(xoffspunta-dweb2punta); % distancia absoluta de la linea media de la web2 al eje X longitudinal de la pala (m) for j=1:lon if l(j)<lc0 cuerda(j)=C0; xoffset(j)=xoffsraiz/cuerda(j); % no hay webs en este tramo, de forma q vamos a hacer q estan % fusionadas con el espesor de la raiz, para obtener todos los % vectores de la misma longitud. dejeweb1(j)=web1raiz; % distancia de la web1 al eje X web1(j)=(xoffset(j)*cuerda(j)-dejeweb1(j))/cuerda(j); dejeweb2(j)=web2raiz; % distancia de la web2 al eje X web2(j)=(xoffset(j)*cuerda(j)+dejeweb2(j))/cuerda(j); %grosmat(j)=espe*C1; % grosor de material en este tramo (2% de la cuerda maxima) elseif l(j)< lc1 cuerda(j)=C0+((C1-C0)/(lc1-lc0))*(l(j)-lc0); xoffset(j)=(xoffsraiz+((xoffsmax-xoffsraiz)/(lc1-lc0))*(l(j)- lc0))/cuerda(j); dejeweb1(j)=web1raiz+((web1max-web1raiz)/(lc1^n- lc0^n))*(l(j)^n-lc0^n); % variacion potencial de la dist. al eje de la web1 web1(j)=(xoffset(j)*cuerda(j)-dejeweb1(j))/cuerda(j); dejeweb2(j)=web2raiz+((web2max-web2raiz)/(lc1^n- lc0^n))*(l(j)^n-lc0^n); % variacion potencial de la dist. al eje de la web2 web2(j)=(xoffset(j)*cuerda(j)+dejeweb2(j))/cuerda(j); %dejeweb1(j)=web1raiz+((web1max-web1raiz)/(lc1-lc0))*(l(j)- lc0); % variacion lineal de la dist. al eje de la web1 %dejeweb2(j)=web2raiz+((web2max-web2raiz)/(lc1-lc0))*(l(j)- lc0); % variacion lineal de la dist. al eje de la web2 %grosmat(j)=espe*C1;% grosor de material en este tramo (2% de la cuerda maxima) else cuerda(j)=C1+((C1-C2)/(lc1-lc2))*(l(j)-lc1); xoffset(j)=(xoffsmax+((xoffsmax-xoffspunta)/(lc1-lc2))*(l(j)- lc1))/cuerda(j); dejeweb1(j)=web1max+((web1max-web1punta)/(lc1-lc2))*(l(j)- lc1); % variacion lineal de la dist. al eje de la web1 web1(j)=(xoffset(j)*cuerda(j)-dejeweb1(j))/cuerda(j); dejeweb2(j)=web2max+((web2max-web2punta)/(lc1-lc2))*(l(j)- lc1); % variacion lineal de la dist. al eje de la web2 web2(j)=(xoffset(j)*cuerda(j)+dejeweb2(j))/cuerda(j);
  35. 35. %grosmat(j)=espe*cuerda(j);% grosor de material en este tramo (2% de la cuerda) end end % A continuacion obtendremos el angulo de torsion de la misma forma que para la pala lm 26 % DISTRIBUCION ANGULO DE TORSION DE LA PALA (grados): datos obtenidos libro % 'Sistemas eólicos de produccion de energia electrica'. lt=(0:0.5:L); % longitudes para los angulos de torsion (m) tetagrad=[0 0 0 0 0 0 0 8 10 11.5 12.75 14 15 14 12.75 12 11 10 9 8.5 8 7.5 7 6.5 6.25 6 5.5 5.25 5 4.5 4.25 4 3.5 3.25 3 2.75 2.5 2.25 2 1.75 1.5 1.25 1 0.9 0.8 0.7 0.5 0.25 0.2 0.1 0 0 0]; long=length(lt); %definimos las coordenadas de los puntos x,y por los que hacemos pasar la %funcion: x1=lc1; x4=lt(long); x2=12; x3=20; y1=tetagrad(x1/0.5+1); y4=tetagrad(long); y2=tetagrad(x2/0.5+1); y3=tetagrad(x3/0.5+1); %potencias de la funcion: pot=6; pot2=-1.5; MM=[x1^pot x1^pot2 x1 1;x2^pot x2^pot2 x2 1;x3^pot x3^pot2 x3 1;x4^pot x4^pot2 x4 1]; q=[y1 y2 y3 y4]'; solu=MMq; %la funcion es del tipo: %Fun=solu(1)*l.^pot + solu(2)*l.^pot2 + solu(3)*l + solu(4); for j=1:lon if l(j)<=3 torsion(j)=0; elseif (l(j)>3) & (l(j)<6) torsion(j)=spline(lt,tetagrad,l(j)); % valores de angulo de torsion para valores de l (grados) else torsion(j)=solu(1)*l(j).^pot + solu(2)*l(j).^pot2 + solu(3)*l(j) + solu(4); end end % A continuacion representamos el espesor maximo relativo a la cuerda para la pala lm 26 % DISTRIBUCION ESPESOR RELATIVO DE LA PALA (tanto por uno DE LA CUERDA):datos obtenidos libro % 'Sistemas eólicos de produccion de energia electrica'. le=lt; % longitudes de las secciones a estudio (m) esperel=[1 1 1 1 1 1 1 0.875 0.775 0.7 0.62 0.55 0.5 0.46 0.44 0.41 0.39 0.375 0.35 0.33 0.315 0.3 0.29 0.28 0.27 0.26 0.25 0.25- (0.05/8)*(1:8) 0.2-(0.05/18)*(1:18)]; %definimos las coordenadas de los puntos x,y por los que hacemos pasar la %funcion:
  36. 36. xx1=3; xx4=le(long); xx2=7 ; xx3=20; % si ponemos xx1=6 ==>xx2=10; si xx1=3 ==> xx2=7 yy1=esperel(xx1/0.5+1); yy4=esperel(long); yy2=esperel(xx2/0.5+1); yy3=esperel(xx3/0.5+1); %potencias de la funcion: po=0.5; po2=-0.5; Mat=[xx1^po xx1^po2 xx1 1;xx2^po xx2^po2 xx2 1;xx3^po xx3^po2 xx3 1;xx4^po xx4^po2 xx4 1]; qu=[yy1 yy2 yy3 yy4]'; so=Matqu; %la funcion es del tipo: %Fun2=so(1)*l.^po + so(2)*l.^po2 + so(3)*l + so(4); for j=1:lon if l(j)<=3 espesorrel(j)=1; else espesorrel(j)=so(1)*l(j).^po + so(2)*l(j).^po2 + so(3)*l(j) + so(4); % valores del espesor maximo relativo a la cuerda del perfil para valores de l (adim) end end % finalmente definiremos la distribucion de grosores GROSMAT %relaspecto=0.02/0.15; % esta es la relacion grosor material/grosor del perfil. for j=1:lon if l(j)<lc0 grosmat(j)=relaspecto*espesorrel(j)*cuerda(j); elseif l(j)< lc1 grosmat(j)=relaspecto*espesorrel(j)*cuerda(j); else grosmat(j)=relaspecto*espesorrel(j)*cuerda(j); end end grosmat=0.95*grosmat; SECCIONEXTPCHIP.M % La siguiente funcion nos va a dar la seccion exterior de los perfiles de % la pala a estudio. function [x,yextra,yintra,area]=seccionextpchip(planosZ) % Variables de entrada: vector con los planos Z donde quiero la seccion % Variables salida: % x: Matriz cuyas filas son las coordenadas de las x extrados para % cada plano de corte Z % x=xextra=xintra % yextra: Matriz cuyas filas son las coordenadas de las y extrados para % cada plano de corte Z
  37. 37. % yintra: Matriz cuyas filas son las coordenadas de las y intrados para % cada plano de corte Z % Este programa nos generara las secciones de cualquier zona de la pala. La % pala la podemos dividir en tres partes diferenciadas: 1- la zona de % encastre q es de seccion circular, 2- zona de transicion de la zona % circular a la zona aerodinamica de perfiles, 3- zona puramente % aerodinamica compuesta por perfiles aerodinamicos hasta la punta de pala. % Para ello definiremos las dos secciones entre las q se encuentra la % transicion descrita (seccion circular y perfil de cuerda maxima) mediante % el mismo numero de puntos, uniremos los puntos de una seccion con los de % la otra (dos a dos) para obtener rectas en tres dimensiones de las que % obtendremos sus ecuaciones, y al cortar por planos perpendiculares al de % envergadura o longitud de la pala (X) obtendremos puntos de las secciones % interiores de transicion. for i=planosZ if i<0 | i>26 error('introduzca un/unos valor/es de distancia del plano entre L=0 y L=26 (m)') end end % Secciones límite en la zona de transicion: % 1- Seccion circular:(cir) lcir=3; % distancia a la que se encuentra la seccion 1 de la raiz de la pala (m) % llamamos a la funcion que tiene la geometria de la pala [cuerdacir,torsioncir,espesorrelcir,xoffsetcir,web1cir,web2cir,grosmat cir] = palalmlineal(lcir); rcir=cuerdacir/2; % radio de la seccion % como ejes de las secciones definimos los ejes x,y como eje x en % direccion de la cuerda y eje y el perpendicular. npuntos=101; xcir=linspace(-rcir,rcir,npuntos); % generamos 101 puntos equiespaciados ==> dividimos en 100 partes el diametro. ycirsup=(rcir^2-xcir.^2).^0.5; % parte superior de la seccion ycirinf=-((rcir^2-xcir.^2).^0.5); % parte inferior de la seccion % 2- Seccion perfil de cuerda maxima:(per) lper=6; % distancia a la que se encuentra el perfil de cuerda maxima de la raiz de la pala (m) % llamamos a la funcion que tiene la geometria de la pala [cuerdaper,torsionper,espesorrelper,xoffsetper,web1per,web2per,grosmat per] = palalmlineal(lper); % Generamos el perfil de cuerda unidad y espesor espesorrelper [Xuunit,Yuunit,Xlunit,Ylunit] = naca44xx(espesorrelper); % Multiplicamos estos valores por la cuerda del perfil Xuper=Xuunit*cuerdaper;
  38. 38. Yuper=Yuunit*cuerdaper; Xlper=Xlunit*cuerdaper; Ylper=Ylunit*cuerdaper; % Definimos el vector de puntos a lo largo de la cuerda: xper0=linspace(0,cuerdaper,npuntos); % Obtenemos los puntos correspondientes a este vector en el extrados e intrados del % perfil mediante un ajuste con los polinomios cubicos a trozos % (pchip en principio mejor que con spline): ypersup=pchip(Xuper,Yuper,xper0); yperinf=pchip(Xlper,Ylper,xper0); % La altura o coordenada y de los puntos no varia al aplicar el offset % del perfil. Solo varia la coordenada x: xper=xper0-xoffsetper*cuerdaper; % Ya tenemos los puntos que definen las secciones limite. % Nota : hemos realizado el ajuste de las funciones antes del offset. % A continuacion estableceremos las rectas que unen los puntos de las % secciones dos a dos, para poder determinar los puntos de interseccion de % esas rectas con planos perpendiculares al eje longitudinal de la pala, % definiendo asi las secciones en los distintos planos. % Una recta en 3D entre 2 puntos A(x1,y1,z1) y B(x2,y2,z2) se puede definir % de la siguiente forma: % y=a*x+b donde a=pendientexy=v2/v1; b=o.origenxy=y1-(v2/v1)*x1 % z=c*x+d donde c=pendientexz=v3/v1; b=o.origenxz=z1-(v3/v1)*x1 % siendo v=vector director=(v1,v2,v3)=(x2-x1,y2- y1,z2-z1) % De esta forma introduciendo un valor para x, se obtiene y(x) y z(x). % Tomamos como ejes positivos de la pala los mencionados anteriormente, x direccion % cordal de las secciones y sentido borde de salida del perfil, y % perpendicular a x con sentido hacia el extrados del perfil, y z direccion % perpendicular a las secciones (longitudinal a la pala) hacia la punta de % pala. % Rectas del extrados: % Generamos los vectores directores de las rectas: v=AB=B(x,y,z)- A(x,y,z) % siendo B los puntos del perfil y A los de la seccion mas proxima a la % raiz. vx_ext=(xper-xcir); vy_ext=(ypersup-ycirsup); vz_ext=(lper-lcir)*ones(1,length(vx_ext)); % pendientes pend_xy_ext=vy_ext./vx_ext; pend_xz_ext=vz_ext./vx_ext; % ordenadas origen oo_xy_ext=ycirsup-pend_xy_ext.*xcir; oo_xz_ext=lcir*ones(1,length(vx_ext))-pend_xz_ext.*xcir;
  39. 39. % Rectas del intrados: % Generamos los vectores directores de las rectas: v=AB=B(x,y,z)- A(x,y,z) % siendo B los puntos del perfil y A los de la seccion mas proxima a la % raiz. vx_int=(xper-xcir); vy_int=(yperinf-ycirinf); vz_int=(lper-lcir)*ones(1,length(vx_int)); % pendientes pend_xy_int=vy_int./vx_int; pend_xz_int=vz_int./vx_int; % ordenadas origen oo_xy_int=ycirinf-pend_xy_int.*xcir; oo_xz_int=lcir*ones(1,length(vx_int))-pend_xz_int.*xcir; % En esta zona de transicion: % definido un vector de planos de corte Z (variable de entrada de la funcion) % calculamos los puntos x,y de esa seccion, pues conocemos la variable z, % de la siguiente manera: % x=(z-d)/c ====> y=a*x+b. % Vemos la longitud del vector de planos Z: longi=length(planosZ); for j=1:longi if (planosZ(j)>=0) & (planosZ(j)<=lcir) % Hasta la longitud lcir todas las secciones son circulares e % iguales. % extrados xextra(j,:)=xcir; yextra(j,:)=ycirsup; % intrados xintra(j,:)=xcir; yintra(j,:)=ycirinf; % CALCULO DEL AREA: area(j)=pi*(cuerdacir/2)^2; % metodo Hermite: aexttrap= sum(diff(xextra(j,:)).*(yextra(j,1:end- 1)+yextra(j,2:end))/2)-sum(diff(xintra(j,:)).*(yintra(j,1:end- 1)+yintra(j,2:end))/2); % regla trapecio compuesta % ahora lo calculamos mediante el metodo de Hermite: hsup = diff(xextra(j,:)); deltasup = diff(yextra(j,:))./hsup; dsup = pchipslopes(hsup,deltasup); % esto nos da las pendientes o derivadas del polinomio interpolador de Hermite en los puntos del perfil. hinf = diff(xintra(j,:)); deltainf = diff(yintra(j,:))./hinf; dinf = pchipslopes(hinf,deltainf); % esto nos da las pendientes o derivadas del polinomio interpolador de Hermite en los puntos del perfil. Dsup = sum((hsup.^2).*(dsup(2:end)-dsup(1:end-1))/12); Dinf = sum((hinf.^2).*(dinf(2:end)-dinf(1:end-1))/12);
  40. 40. areaextH=aexttrap-(Dsup-Dinf); area(j)=areaextH; % Calulo de las cosas usando pchip: ppsup=pchip(xextra(j,:),yextra(j,:)); % pp = piecewise polynomial. ppinf=pchip(xintra(j,:),yintra(j,:)); intsup=quad(@ppval,xextra(j,1),xextra(j,end),[],[],ppsup); intinf=quad(@ppval,xintra(j,1),xintra(j,end),[],[],ppinf); area(j)=intsup-intinf; elseif (planosZ(j)>lcir) & (planosZ(j)<=lper) %Zona de transicion de la pala.Obtenemos los puntos x,y mediante la %interseccion de los planos de corte con las rectas trazadas %anteriormente entre las secciones limite. Aplicando la formula %anteriormente descrita, al saber z, calculamos x e y para cada %seccion. [cuerda,torsion,espesorrel,xoffset,web1,web2,grosmat] = palalmlineal(planosZ(j)); % extrados xextra(j,:)=(planosZ(j)-oo_xz_ext)./pend_xz_ext; yextra(j,:)=pend_xy_ext.*xextra(j,:)+oo_xy_ext; % intrados xintra(j,:)=(planosZ(j)-oo_xz_int)./pend_xz_int; yintra(j,:)=pend_xy_int.*xintra(j,:)+oo_xy_int; % Calulo del area usando pchip: ppsup=pchip(xextra(j,:),yextra(j,:)); % pp = piecewise polynomial. ppinf=pchip(xintra(j,:),yintra(j,:)); intsup=quad(@ppval,xextra(j,1),xextra(j,end),[],[],ppsup); intinf=quad(@ppval,xintra(j,1),xintra(j,end),[],[],ppinf); area(j)=intsup-intinf; else % Aqui estamos en la zona puramente aerodinamica de la pala. Las % coordenadas de los perfiles las obtendremos ayudandonos de la % funcion q nos los genera q es naca44xx y de la distribucion de % espesores. [cuerdai,torsioni,espesorreli,xoffseti,web1i,web2i,grosmati] = palalmlineal(planosZ(j)); [Xuuniti,Yuuniti,Xluniti,Yluniti] = naca44xx(espesorreli); Xui=Xuuniti*cuerdai; Yui=Yuuniti*cuerdai; Xli=Xluniti*cuerdai; Yli=Yluniti*cuerdai; xi0=linspace(0,cuerdai,npuntos); % extrados xextra(j,:)=xi0-xoffseti*cuerdai; yextra(j,:)=pchip(Xui,Yui,xi0); % intrados xintra(j,:)=xi0-xoffseti*cuerdai; yintra(j,:)=pchip(Xli,Yli,xi0); % Calculo del area de las secciones utilizando pchip: ppsup=pchip(xextra(j,:),yextra(j,:)); % pp = piecewise polynomial.
  41. 41. ppinf=pchip(xintra(j,:),yintra(j,:)); intsup=quad(@ppval,xextra(j,1),xextra(j,end),[],[],ppsup); intinf=quad(@ppval,xintra(j,1),xintra(j,end),[],[],ppinf); area(j)=intsup-intinf; end end % NOTA: % Como hemos usado los mismos valores de x para las funciones de intrados y % extrados, los valores de xextra y xintra q se obtienen son los mismos, de % forma q podiamos poner un unico valor de salida x que fuera % x=xextra=xintra. x=xextra; % o x=xintra SECCIONTOTPCHIP.M % La siguiente funcion nos va a dar exactamente las distintas secciones de % la pala a estudio en funcion de su distancia al encastre de la pala. function [xext,yextraext,yintraext,xint,yextraint,yintraint,area]=secciontotpch ip(planosZ,tipo) % La variable tipo nos va a definir distintos tipos de interiores de la % pala. Asi, llamaremos: % TIPO = 1: La pala interiormente tiene una distribucion de webs que es la % que viene dada por el programa que especifica la geometria de la pala (en % nuestro caso,palalmlineal). % TIPO = 2: La pala interiormente solo presenta la distribucion de webs en % la zona puramente aerodinamica, tb segun indica palalmlineal. % TIPO = 3: La pala interiormente no presenta ninguna distribucion de webs. if nargin < 2 || isempty(tipo), tipo = 1; end; % si no ponemos nada en tipo o ponemos la matriz vacia analizamos por defecto el tipo 1 de pala. for i=planosZ if i<0 | i>26 error('introduzca un/unos valor/es de distancia del plano entre L=0 y L=26 (m)') end end if (tipo==1) | (tipo==2) | (tipo==3) % puede comenzar el programa else error('introduzca un valor de tipo que sea 1, 2 o 3 correspondiente a los modelos de pala')
  42. 42. end % Las coordenadas de la zona exterior de la seccion las obtenemos mediante % la funcion seccionext. [xext,yextraext,yintraext,areaext]=seccionextpchip(planosZ); % Para calcular ahora la parte interna de seccion procedemos como hemos hecho % anteriormente: % Vemos la longitud del vector de planos Z: longi=length(planosZ); global puntoscelda global poscfinal global poscinicial puntoscelda=33; % poner un numero impar que sea multiplo de 3 (numero de celdas). % si lo ponemos par nos da luego problemas al hacer diff(y) % en el programa de calculos de inercia posterior. Si lo % ponemos par, hay q cambiar en mominercia la manera de % calcular el mominerciax de la parte circular de la pala, % hacer la forma que usa pchip y quad. k=0; for j=1:longi if (planosZ(j)>=0) & (planosZ(j)<=3) [cuerda,torsion,espesorrel,xoffset,web1,web2,grosmat] = palalmlineal(planosZ(j)); rcirint=cuerda/2-grosmat; % radio de la seccion interior % como ejes de las secciones definimos los ejes x,y como eje x en % direccion de la cuerda y eje y el perpendicular. npuntos=3*puntoscelda; xcir=linspace(-rcirint,rcirint,npuntos); % generamos ''npuntos'' puntos equiespaciados. ycirsup=(rcirint^2-xcir.^2).^0.5; % parte superior de la seccion interior ycirinf=-((rcirint^2-xcir.^2).^0.5); % parte inferior de la seccion interior % extrados xextra(j,:)=xcir; yextraint(j,:)=ycirsup; % intrados xintra(j,:)=xcir; yintraint(j,:)=ycirinf; % como las xextra y xintra son iguales: xint(j,:)=xextra(j,:); % CALCULO DEL AREA: % El area de estas secciones es el area de una corona circular: area(j)=areaext(j)-pi*rcirint^2; %area2(j)=area(j); %areawebs(j)=area(j);
  43. 43. else k=k+1; % contador para la variable poscinicial y poscfinal. ver mas abajo. [cuerda,torsion,espesorrel,xoffset,web1,web2,grosmat] = palalmlineal(planosZ(j)); % Puntos del contorno interno de la seccion (extrados/intrados % interno): necesito primero obtener la derivada del contorno externo % de la seccion. % Calcularemos a continuacion la forma interior, mediante % los polinomios de Hermite de interpolacion. hsup = diff(xext(j,:)); deltasup = diff(yextraext(j,:))./hsup; dsup = pchipslopes(hsup,deltasup); % esto nos da las pendientes o derivadas del polinomio interpolador de Hermite en los puntos del perfil. hinf = diff(xext(j,:)); deltainf = diff(yintraext(j,:))./hinf; dinf = pchipslopes(hinf,deltainf); % esto nos da las pendientes o derivadas del polinomio interpolador de Hermite en los puntos del perfil. betasup=atan(dsup); betainf=atan(dinf); % Extrados interno: Xinterior=(xext(j,:))+(grosmat)*sin(betasup); Yinterior=yextraext(j,:)-(grosmat)*cos(betasup); %Intardos interno: Xinterior1=(xext(j,:))+(-grosmat)*sin(betainf); Yinterior1=yintraext(j,:)-(-grosmat)*cos(betainf); % Definimos los parametros importantes en la seccion interna, como son % las posiciones de las webs y demas. posweb11=(-xoffset+web1).*cuerda-grosmat./2; posweb12=(-xoffset+web1).*cuerda+grosmat./2; posweb21=(-xoffset+web2).*cuerda-grosmat./2; posweb22=(-xoffset+web2).*cuerda+grosmat./2; lat11sup=pchip(Xinterior,Yinterior,posweb11);; % coordenada de lat11 q saco de la parte superior (extrados) lat11inf=pchip(Xinterior1,Yinterior1,posweb11);% coordenada de lat11 q saco de la parte inferior (intrados) lat12sup=pchip(Xinterior,Yinterior,posweb12);;% coordenada de lat12 q saco de la parte superior (extrados) lat12inf=pchip(Xinterior1,Yinterior1,posweb12);% coordenada de lat12 q saco de la parte inferior (intrados) lat21sup=pchip(Xinterior,Yinterior,posweb21);;% coordenada de lat21 q saco de la parte superior (extrados) lat21inf=pchip(Xinterior1,Yinterior1,posweb21);% coordenada de lat21 q saco de la parte inferior (intrados) lat22sup=pchip(Xinterior,Yinterior,posweb22);;% coordenada de lat22 q saco de la parte superior (extrados) lat22inf=pchip(Xinterior1,Yinterior1,posweb22);% coordenada de lat22 q saco de la parte inferior (intrados)
  44. 44. % Obtengo puntos equidistantes entre los puntos superior e inferior de cada % pared de cada lateral. lat11=linspace(lat11inf,lat11sup,20); % su coordenada x es posweb11 lat12=linspace(lat12inf,lat12sup,20); % su coordenada x es posweb12 lat21=linspace(lat21inf,lat21sup,20); % su coordenada x es posweb21 lat22=linspace(lat22inf,lat22sup,20); % su coordenada x es posweb22 % Vamos a ir obteniendo el vector de puntos que me definan la parte % superior e inferior del perfil por su parte interna. % puntoscelda ====> estan definidos al principio del bucle. % Primeramente tenemos que calcular en este caso donde donde se juntan % las funciones de intrados y extrados (las internas se sobreentiende), % pues ambas convergen en dos puntos, uno en el borde de ataque de la % seccion y otro en el borde de salida, que son precisamente donde % comiennza y acaba la cuerda interior de las secciones. Esos puntos % son poscinicial y poscfinal. % Para ello haremos un barrido de las funciones y cuando su diferencia % sea nula obtendremos los valores finales de poscinicial y poscfinal. % POSCINICIAL: % Establecemos el paso del barrido: paso=-0.001*cuerda; % Hacemos el barrido for x=posweb12:paso:-xoffset*cuerda Wu=pchip(Xinterior,Yinterior,x); Wl=pchip(Xinterior1,Yinterior1,x); dif=Wu-Wl; if dif<0 xanterior=x-paso; %interpolamos entre x y x anterior la solucion poscinicial(k)=xanterior+((x-xanterior)/(difanterior- dif))*difanterior; break elseif dif==0 poscinicial(k)=x; break end difanterior=dif; % guardamos el valor de dif q es positivo para poderlo usar en la interpolacion al encontrar el negativo siguiente. end % POSCFINAL: % Establecemos el paso del barrido:
  45. 45. paso2=0.001*cuerda; % Hacemos el barrido for x=posweb21:paso2:cuerda-xoffset*cuerda Wu=pchip(Xinterior,Yinterior,x); Wl=pchip(Xinterior1,Yinterior1,x); dif=Wu-Wl; if dif<0 xanterior=x-paso; %interpolamos entre x y x anterior la solucion poscfinal(k)=xanterior+((x-xanterior)/(difanterior- dif))*difanterior; break elseif dif==0 poscfinal(k)=x; break end difanterior=dif; % guardamos el valor de dif q es positivo para poderlo usar en la interpolacion al encontrar el negativo siguiente. end % Ahora ya sabiendo el valor de poscinicial y poscfinal empezamos a % calcular los puntos iinteriores de la seccion. % Dependiendo de si estos valores son mayores o menores q los valores % de posicion de las webs tendremos mas o menos celdas interiores en la % seccion. Asi: if (tipo==1) | ((tipo==2)&(planosZ(j)>=6)) if (poscinicial(k)>=posweb11) & (poscfinal(k)<=posweb22) % Solo tenemos una celda, la central. npuntos=3*puntoscelda; % CELDA CENTRAL (2): % Usando PCHIP: xcelda2=linspace(posweb12,posweb21,npuntos); % Extrados interno: [yextraint2] = pchip(Xinterior,Yinterior,xcelda2); %Intardos interno: [yintraint2] = pchip(Xinterior1,Yinterior1,xcelda2); % introducimos estos datos en las variables de salida: xint(j,:)=xcelda2; yextraint(j,:)=yextraint2; yintraint(j,:)=yintraint2; elseif (poscinicial(k)<posweb11) & (poscfinal(k)<=posweb22) % Tenemos celda izquierda y central, pero derecha no. npuntos0=(3*puntoscelda-1)/2; % como puntos celda es impar hay que hacer q una celda tenga un punto mas q la otra npuntos1=3*puntoscelda-npuntos0; % CELDA IZQUIERDA (1): % Usando PCHIP: xcelda1=linspace(poscinicial(k),posweb11,npuntos0); % Extrados interno: [yextraint1] = pchip(Xinterior,Yinterior,xcelda1); %Intardos interno: [yintraint1] = pchip(Xinterior1,Yinterior1,xcelda1); % Aqui hemos obtenido las constantes del ajuste del perfil interno.
  46. 46. % CELDA CENTRAL (2): % Usando PCHIP: xcelda2=linspace(posweb12,posweb21,npuntos1); % Extrados interno: [yextraint2] = pchip(Xinterior,Yinterior,xcelda2); %Intardos interno: [yintraint2] = pchip(Xinterior1,Yinterior1,xcelda2); % introducimos estos datos en las variables de salida: xint(j,:)=[xcelda1 xcelda2]; yextraint(j,:)=[yextraint1 yextraint2]; yintraint(j,:)=[yintraint1 yintraint2]; elseif (poscinicial(k)>=posweb11) & (poscfinal(k)>posweb22) % En este caso no tendriamos celda 1, si 2 y 3. npuntos0=(3*puntoscelda-1)/2; npuntos1=3*puntoscelda-npuntos0; % CELDA CENTRAL (2): % Usando PCHIP: xcelda2=linspace(posweb12,posweb21,npuntos0); % Extrados interno: [yextraint2] = pchip(Xinterior,Yinterior,xcelda2); %Intardos interno: [yintraint2] = pchip(Xinterior1,Yinterior1,xcelda2); % CELDA DERECHA (3): % Usando PCHIP: xcelda3=linspace(posweb22,poscfinal(k),npuntos1); % Extrados interno: [yextraint3] = pchip(Xinterior,Yinterior,xcelda3); %Intardos interno: [yintraint3] = pchip(Xinterior1,Yinterior1,xcelda3); % introducimos estos datos en las variables de salida: xint(j,:)=[xcelda2 xcelda3]; yextraint(j,:)=[yextraint2 yextraint3]; yintraint(j,:)=[yintraint2 yintraint3]; elseif (poscinicial(k)<posweb11) & (poscfinal(k)>posweb22) % tenemos todas las celdas: npuntos=puntoscelda; % CELDA IZQUIERDA (1): % Usando PCHIP: xcelda1=linspace(poscinicial(k),posweb11,npuntos); % Extrados interno: [yextraint1] = pchip(Xinterior,Yinterior,xcelda1); %Intardos interno: [yintraint1] = pchip(Xinterior1,Yinterior1,xcelda1); % Aqui hemos obtenido las constantes del ajuste del perfil interno. % CELDA CENTRAL (2): % Usando PCHIP: xcelda2=linspace(posweb12,posweb21,npuntos); % Extrados interno: [yextraint2] = pchip(Xinterior,Yinterior,xcelda2); %Intardos interno: [yintraint2] = pchip(Xinterior1,Yinterior1,xcelda2); % CELDA DERECHA (3): % Usando PCHIP: xcelda3=linspace(posweb22,poscfinal(k),npuntos); % Extrados interno: [yextraint3] = pchip(Xinterior,Yinterior,xcelda3);
  47. 47. %Intardos interno: [yintraint3] = pchip(Xinterior1,Yinterior1,xcelda3); % introducimos estos datos en las variables de salida: xint(j,:)=[xcelda1 xcelda2 xcelda3]; yextraint(j,:)=[yextraint1 yextraint2 yextraint3]; yintraint(j,:)=[yintraint1 yintraint2 yintraint3]; end % CALCULO DEL AREA DE LA SECCION: if posweb11>poscinicial(k) ppsupcelda1=pchip(xcelda1,yextraint1); % pp = piecewise polynomial. ppinfcelda1=pchip(xcelda1,yintraint1); intsupcelda1=quad(@ppval,xcelda1(1),xcelda1(end),[],[],ppsupcelda1); intinfcelda1=quad(@ppval,xcelda1(1),xcelda1(end),[],[],ppinfcelda1); Acelda1=intsupcelda1-intinfcelda1; else Acelda1=0; end ppsupcelda2=pchip(xcelda2,yextraint2); % pp = piecewise polynomial. ppinfcelda2=pchip(xcelda2,yintraint2); intsupcelda2=quad(@ppval,xcelda2(1),xcelda2(end),[],[],ppsupcelda2); intinfcelda2=quad(@ppval,xcelda2(1),xcelda2(end),[],[],ppinfcelda2); Acelda2=intsupcelda2-intinfcelda2; if poscfinal(k)>posweb22 ppsupcelda3=pchip(xcelda3,yextraint3); % pp = piecewise polynomial. ppinfcelda3=pchip(xcelda3,yintraint3); intsupcelda3=quad(@ppval,xcelda3(1),xcelda3(end),[],[],ppsupcelda3); intinfcelda3=quad(@ppval,xcelda3(1),xcelda3(end),[],[],ppinfcelda3); Acelda3=intsupcelda3-intinfcelda3; else Acelda3=0; end area(j)=areaext(j)-(Acelda1 + Acelda2 + Acelda3); end if (tipo==3) | ((tipo==2)&(planosZ(j)<6)) % Obtenemos un vector de puntos representativo de todo el perfil % interno: npuntos=3*puntoscelda; xinter=linspace(poscinicial(k),poscfinal(k),npuntos); yextrainter=pchip(Xinterior,Yinterior,xinter); yintrainter=pchip(Xinterior1,Yinterior1,xinter); xint(j,:)=xinter; yextraint(j,:)=yextrainter; yintraint(j,:)=yintrainter; % CALCULO DEL AREA DE LA SECCION:
  48. 48. % utilizando pchip: ppsup=pchip(xinter,yextrainter); % pp = piecewise polynomial. ppinf=pchip(xinter,yintrainter); intsup=quad(@ppval,xinter(1),xinter(end),[],[],ppsup); intinf=quad(@ppval,xinter(1),xinter(end),[],[],ppinf); areaint=intsup-intinf; area(j)=areaext(j)-areaint; end end end CMASAS.M % Vamos a crear una funcion para calcular los centros de masas de las % secciones que nos da la funcion secciontotpchip. function [xg,yg] = cmasas(planosZ,tipo) if nargin < 2 || isempty(tipo), tipo = 1; end; [xext,yextraext,yintraext,xint,yextraint,yintraint,areatot]=secciontot pchip(planosZ,tipo); [cuerda,torsion,espesorrel,xoffset,web1,web2,grosmat] = palalmlineal(planosZ); posweb11=(-xoffset+web1).*cuerda-grosmat./2; % posicion de la web11 posweb12=(-xoffset+web1).*cuerda+grosmat./2; % posicion de la web12 posweb21=(-xoffset+web2).*cuerda-grosmat./2; % posicion de la web21 posweb22=(-xoffset+web2).*cuerda+grosmat./2; % posicion de la web22 global puntoscelda % numero de puntos definidos en secciontotpchip por celda global poscfinal % punto de interseccion de las funciones de extrados e intrados interno en la celda 3 definidas en secciontotpchip global poscinicial % punto de interseccion de las funciones de extrados e intrados interno en la celda 1 de la seccion pc=puntoscelda; % Procedamos al calculo del primer momento de area tanto sobre el eje x % como sobra el eje y. Estos momentos se identifican con la leta S (Sx,Sy) % de forma que xg=Sy/Aseccion e yg=Sx/Aseccion. long=length(planosZ); k=0; for j=1:long % CALCULAMOS PRIMERO LO REFERENTE A LAS ZONAS EXTERIORES: exteriorsup(1,:)=xext(j,:) + xoffset(j)*cuerda(j); % añadimos los offsets para calcular los momentos respecto sistema ejes q pasan por el borde ataque del perfil. exteriorsup(2,:)=yextraext(j,:);
  49. 49. exteriorinf(1,:)=xext(j,:) + xoffset(j)*cuerda(j); exteriorinf(2,:)=yintraext(j,:); % Sy: %ZONA EXTERIOR: % utilizando solo la regla del trapecio: integrandou=(exteriorsup(1,:)).*exteriorsup(2,:); integrandol=(exteriorinf(1,:)).*exteriorinf(2,:); momysup=sum(diff(exteriorsup(1,:)).*(integrandou(1:end- 1)+integrandou(2:end))/2); momyinf=sum(diff(exteriorinf(1,:)).*(integrandol(1:end- 1)+integrandol(2:end))/2); momyexte=momysup-momyinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: hu = diff(exteriorsup(1,:)); deltau = diff(integrandou)./hu; du = pchipslopes(hu,deltau); Dsup = sum((hu.^2).*(du(2:end)-du(1:end-1))/12); momysupH=momysup-Dsup; hl = diff(exteriorinf(1,:)); deltal = diff(integrandol)./hl; dl = pchipslopes(hl,deltal); Dinf = sum((hl.^2).*(dl(2:end)-dl(1:end-1))/12); momyinfH=momyinf-Dinf; momyHexte=momysupH-momyinfH; % Sx: % ZONA EXTERIOR: [maxi,indi]=max(exteriorsup(2,:)); [mini,indi2]=min(exteriorinf(2,:)); % utilizando solo la regla del trapecio: % extrados: (up es de extrados y arriba abajo corresponde a los dos tramos % de curva que se ven si se plotea (y^2)*x(y) frente a y, todo de extrados). inteuparriba=(exteriorsup(2,end:-1:indi)).*exteriorsup(1,end:- 1:indi); % invertimos los valores para integrar la funcion en el sentido de las x positivas. inteuparriba2=exteriorsup(1,end)*(linspace(0,exteriorsup(2,end),30)); % esto es la funcion y*xmax inteupabajo=(exteriorsup(2,1:indi)).*exteriorsup(1,1:indi); inteupabajo2=exteriorsup(1,1)*(linspace(0,exteriorsup(2,1),30));% esto es la funcion y*xmin momxuparriba=sum(diff(exteriorsup(2,end:- 1:indi)).*(inteuparriba(1:end-1)+inteuparriba(2:end))/2)+... sum(diff(linspace(0,exteriorsup(2,end),30)).*(inteuparriba2(1:end- 1)+inteuparriba2(2:end))/2); momxupabajo=sum(diff(exteriorsup(2,1:indi)).*(inteupabajo(1:end- 1)+inteupabajo(2:end))/2)+...
  50. 50. sum(diff(linspace(0,exteriorsup(2,1),30)).*(inteupabajo2(1:end- 1)+inteupabajo2(2:end))/2); momxup=momxuparriba-momxupabajo; % intrados: low es de intrados y arriba abajo corresponde a los dos tramos % de curva que se ven si se plotea (y^2)*x(y) frente a y, todo de intrados). intelowarriba=(exteriorinf(2,end:-1:indi2)).*exteriorinf(1,end:- 1:indi2); % invierto el sentido de la curva superior para integrar en el sentido de las x negativas (y) intelowarriba2=exteriorinf(1,end)*(linspace(0,exteriorinf(2,end),30)); % esto es la funcion y*xmax intelowabajo=(exteriorinf(2,1:indi2)).*exteriorinf(1,1:indi2); intelowabajo2=exteriorinf(1,1)*(linspace(0,exteriorinf(2,1),30));% esto es la funcion y*xmin momxlowarriba=sum(diff(exteriorinf(2,end:- 1:indi2)).*(intelowarriba(1:end-1)+intelowarriba(2:end))/2)+... sum(diff(linspace(0,exteriorinf(2,end),30)).*(intelowarriba2(1:end- 1)+intelowarriba2(2:end))/2);% las areas tienen q salir negativas aqui. momxlowabajo=sum(diff(exteriorinf(2,1:indi2)).*(intelowabajo(1:end- 1)+intelowabajo(2:end))/2)+... sum(diff(linspace(0,exteriorinf(2,1),30)).*(intelowabajo2(1:end- 1)+intelowabajo2(2:end))/2); momxlow=momxlowarriba-momxlowabajo; momxexte=momxup-momxlow; % lo q vale es restar no sumar (antes lo habia sumado) % esta es la que vale porque ambas partes, la positiva y negativa añaden inercia % si no, si la seccion fuera simetrica y las sumara, daria inercia nula y % eso esta mal. % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: huparriba = diff(exteriorsup(2,end:-1:indi)); deltauparriba = diff(inteuparriba)./huparriba; duparriba = pchipslopes(huparriba,deltauparriba); Duparriba = sum((huparriba.^2).*(duparriba(2:end)-duparriba(1:end- 1))/12); if exteriorsup(2,end)>0 huparriba2 = diff(linspace(0,exteriorsup(2,end),30)); deltauparriba2 = diff(inteuparriba2)./huparriba2; duparriba2 = pchipslopes(huparriba2,deltauparriba2); Duparriba2 = sum((huparriba2.^2).*(duparriba2(2:end)- duparriba2(1:end-1))/12); else Duparriba2=0; end % tengo q poner este if porq si me dieran las coordenadas del perfil
  51. 51. % exactas (pasando el extrados e intrados por (0,0) y (c,0)) como hace % Xfoil (el programa nuestro naca44xx no pasa exactamente por (0,0) y % (c,0)), el termino de inteuparriba se anula solo, pero a la hora de % añadir la parte de Hermite tendriamos problema porque dividiriamos por 0, % de forma q si estos puntos tienen y=0, tenemos q poner q D=0,parte de % Hermite nula (la parte de la regla del trapecio ya se anula sola como % hemos dixo antes, T=0). Esto hay q hacerlo tb para el punto del origen % en extrados, y repetirlo para origen y cuerda de intrados tb. momxuparribaH=momxuparriba-Duparriba-Duparriba2; hupabajo = diff(exteriorsup(2,1:indi)); deltaupabajo = diff(inteupabajo)./hupabajo; dupabajo = pchipslopes(hupabajo,deltaupabajo); Dupabajo = sum((hupabajo.^2).*(dupabajo(2:end)-dupabajo(1:end- 1))/12); if exteriorsup(2,1)>0 hupabajo2 = diff(linspace(0,exteriorsup(2,1),30)); deltaupabajo2 = diff(inteupabajo2)./hupabajo2; dupabajo2 = pchipslopes(hupabajo2,deltaupabajo2); Dupabajo2 = sum((hupabajo2.^2).*(dupabajo2(2:end)- dupabajo2(1:end-1))/12); else Dupabajo2=0; end momxupabajoH=momxupabajo-Dupabajo-Dupabajo2; hlowarriba = diff(exteriorinf(2,end:-1:indi2)); deltalowarriba = diff(intelowarriba)./hlowarriba; dlowarriba = pchipslopes(hlowarriba,deltalowarriba); Dlowarriba = sum((hlowarriba.^2).*(dlowarriba(2:end)- dlowarriba(1:end-1))/12); if exteriorinf(2,end)<0 % el intrados tiene y negativas hlowarriba2 = diff(linspace(0,exteriorinf(2,end),30)); deltalowarriba2 = diff(intelowarriba2)./hlowarriba2; dlowarriba2 = pchipslopes(hlowarriba2,deltalowarriba2); Dlowarriba2 = sum((hlowarriba2.^2).*(dlowarriba2(2:end)- dlowarriba2(1:end-1))/12); else Dlowarriba2=0; end momxlowarribaH=momxlowarriba-Dlowarriba-Dlowarriba2; hlowabajo = diff(exteriorinf(2,1:indi2)); deltalowabajo = diff(intelowabajo)./hlowabajo; dlowabajo = pchipslopes(hlowabajo,deltalowabajo);
  52. 52. Dlowabajo = sum((hlowabajo.^2).*(dlowabajo(2:end)-dlowabajo(1:end- 1))/12); if exteriorinf(2,1)<0 hlowabajo2 = diff(linspace(0,exteriorinf(2,1),30)); deltalowabajo2 = diff(intelowabajo2)./hlowabajo2; dlowabajo2 = pchipslopes(hlowabajo2,deltalowabajo2); Dlowabajo2 = sum((hlowabajo2.^2).*(dlowabajo2(2:end)- dlowabajo2(1:end-1))/12); else Dlowabajo2=0; end momxlowabajoH=momxlowabajo-Dlowabajo-Dlowabajo2; momxupH=momxuparribaH-momxupabajoH; momxlowH=momxlowarribaH-momxlowabajoH; momxHexte=momxupH-momxlowH; % esta es la buena % UNA VEZ HECHO ESTO SOLO FALTA LAS ZONAS INTERIORES: if (planosZ(j)>=0) & (planosZ(j)<=3) % solo tenemos una zona interior, no hay webs. % definimos variables: % ZONA INTERIOR: interiorsup(1,:)=xint(j,:) + xoffset(j)*cuerda(j); % añadimos los offsets para calcular los momentos respecto sistema ejes q pasan por el borde ataque del perfil. interiorsup(2,:)=yextraint(j,:); interiorinf(1,:)=xint(j,:) + xoffset(j)*cuerda(j); interiorinf(2,:)=yintraint(j,:); % CALCULO DE LOS MOMENTOS DE INERCIA: % Sy: % ZONA INTERIOR: % utilizando solo la regla del trapecio: integrandou=(interiorsup(1,:)).*interiorsup(2,:); integrandol=(interiorinf(1,:)).*interiorinf(2,:); momysup=sum(diff(interiorsup(1,:)).*(integrandou(1:end- 1)+integrandou(2:end))/2); momyinf=sum(diff(interiorinf(1,:)).*(integrandol(1:end- 1)+integrandol(2:end))/2); momyinte=momysup-momyinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: hu = diff(interiorsup(1,:)); deltau = diff(integrandou)./hu; du = pchipslopes(hu,deltau); Dsup = sum((hu.^2).*(du(2:end)-du(1:end-1))/12); momysupH=momysup-Dsup; hl = diff(interiorinf(1,:)); deltal = diff(integrandol)./hl; dl = pchipslopes(hl,deltal);
  53. 53. Dinf = sum((hl.^2).*(dl(2:end)-dl(1:end-1))/12); momyinfH=momyinf-Dinf; momyHinte=momysupH-momyinfH; % Una vez analizadas todas las partes simplemente queda restarlas: momytotality=momyexte-momyinte; momyHtotality=momyHexte-momyHinte; Sy(j)=momyHtotality;% ponemos como resultado final el de integracion con polinomio Hermite. xg(j)=Sy(j)/areatot(j); % Sx: % ZONA INTERIOR: [maxi,indi]=max(interiorsup(2,:)); [mini,indi2]=min(interiorinf(2,:)); % utilizando solo la regla del trapecio: % extrados: (up es de extrados y arriba abajo corresponde a los dos tramos % de curva que se ven si se plotea (y^2)*x(y) frente a y, todo de extrados). inteuparriba=(interiorsup(2,end:-1:indi)).*interiorsup(1,end:- 1:indi); % invertimos los valores para integrar la funcion en el sentido de las x positivas. inteupabajo=(interiorsup(2,1:indi)).*interiorsup(1,1:indi); momxuparriba=sum(diff(interiorsup(2,end:- 1:indi)).*(inteuparriba(1:end-1)+inteuparriba(2:end))/2); momxupabajo=sum(diff(interiorsup(2,1:indi)).*(inteupabajo(1:end- 1)+inteupabajo(2:end))/2); momxup=momxuparriba-momxupabajo; % intrados: low es de intrados y arriba abajo corresponde a los dos tramos % de curva que se ven si se plotea (y^2)*x(y) frente a y, todo de intrados). intelowarriba=(interiorinf(2,end:- 1:indi2)).*interiorinf(1,end:-1:indi2); % invierto el sentido de la curva superior para integrar en el sentido de las x negativas (y) intelowabajo=(interiorinf(2,1:indi2)).*interiorinf(1,1:indi2); momxlowarriba=sum(diff(interiorinf(2,end:- 1:indi2)).*(intelowarriba(1:end-1)+intelowarriba(2:end))/2);% las areas tienen q salir negativas aqui. momxlowabajo=sum(diff(interiorinf(2,1:indi2)).*(intelowabajo(1:end- 1)+intelowabajo(2:end))/2); momxlow=momxlowarriba-momxlowabajo; momxinte=momxup-momxlow; % lo q vale es restar no sumar (antes lo habia sumado) % esta es la que vale porque ambas partes, la positiva y negativa añaden inercia % si no, si la seccion fuera simetrica y las sumara, daria inercia nula y % eso esta mal. % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite:
  54. 54. huparriba = diff(interiorsup(2,end:-1:indi)); deltauparriba = diff(inteuparriba)./huparriba; duparriba = pchipslopes(huparriba,deltauparriba); Duparriba = sum((huparriba.^2).*(duparriba(2:end)- duparriba(1:end-1))/12); momxuparribaH=momxuparriba-Duparriba; hupabajo = diff(interiorsup(2,1:indi)); deltaupabajo = diff(inteupabajo)./hupabajo; dupabajo = pchipslopes(hupabajo,deltaupabajo); Dupabajo = sum((hupabajo.^2).*(dupabajo(2:end)-dupabajo(1:end- 1))/12); momxupabajoH=momxupabajo-Dupabajo; hlowarriba = diff(interiorinf(2,end:-1:indi2)); deltalowarriba = diff(intelowarriba)./hlowarriba; dlowarriba = pchipslopes(hlowarriba,deltalowarriba); Dlowarriba = sum((hlowarriba.^2).*(dlowarriba(2:end)- dlowarriba(1:end-1))/12); momxlowarribaH=momxlowarriba-Dlowarriba; hlowabajo = diff(interiorinf(2,1:indi2)); deltalowabajo = diff(intelowabajo)./hlowabajo; dlowabajo = pchipslopes(hlowabajo,deltalowabajo); Dlowabajo = sum((hlowabajo.^2).*(dlowabajo(2:end)- dlowabajo(1:end-1))/12); momxlowabajoH=momxlowabajo-Dlowabajo; momxupH=momxuparribaH-momxupabajoH; momxlowH=momxlowarribaH-momxlowabajoH; momxHinte=momxupH-momxlowH; % esta es la buena momxHtotality=momxHexte-momxHinte; Sx(j)=momxHtotality; % ponemos como resultado final el de integracion con polinomio Hermite. yg(j)=Sx(j)/areatot(j); else k=k+1; % contador para la variable poscinicial y poscfinal. if (tipo==1) | ((tipo==2)&(planosZ(j)>=6)) % Tenemos webs interiores, ahora hay q ver cuantas: if (poscinicial(k)>=posweb11(j)) & (poscfinal(k)<=posweb22(j)) % Solo tenemos una celda, la central. % CELDA CENTRAL (2): celdacensup(1,:)=xint(j,:) + xoffset(j)*cuerda(j); celdacensup(2,:)=yextraint(j,:); celdaceninf(1,:)=xint(j,:) + xoffset(j)*cuerda(j); celdaceninf(2,:)=yintraint(j,:); % Sy: % utilizando solo la regla del trapecio:
  55. 55. integrandou=(celdacensup(1,:)).*celdacensup(2,:); integrandol=(celdaceninf(1,:)).*celdaceninf(2,:); momysup=sum(diff(celdacensup(1,:)).*(integrandou(1:end- 1)+integrandou(2:end))/2); momyinf=sum(diff(celdaceninf(1,:)).*(integrandol(1:end- 1)+integrandol(2:end))/2); momyceldacen=momysup-momyinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: hu = diff(celdacensup(1,:)); deltau = diff(integrandou)./hu; du = pchipslopes(hu,deltau); Dsup = sum((hu.^2).*(du(2:end)-du(1:end-1))/12); momysupH=momysup-Dsup; hl = diff(celdaceninf(1,:)); deltal = diff(integrandol)./hl; dl = pchipslopes(hl,deltal); Dinf = sum((hl.^2).*(dl(2:end)-dl(1:end-1))/12); momyinfH=momyinf-Dinf; momyHceldacen=momysupH-momyinfH; momyHtotality=momyHexte-momyHceldacen; Sy(j)=momyHtotality; % ponemos como resultado final el de integracion con polinomio Hermite. xg(j)=Sy(j)/areatot(j); % Sx: % utilizando solo la regla del trapecio: [maxim,in]=max(celdacensup(2,:)); integrandou1=(celdacensup(2,end:- 1:in)).*celdacensup(1,end:-1:in); integrandou2=celdacensup(1,end)*(linspace(0,celdacensup(2,end),30)); % esto es la funcion y*xmax integrandou3=(celdacensup(2,1:in)).*celdacensup(1,1:in); integrandou4=celdacensup(1,1)*(linspace(0,celdacensup(2,1),30)); % esto es la funcion y*xmin integrandol1=(celdaceninf(2,end:- 1:1)).*celdaceninf(1,end:-1:1);% hay q invertir el sentido integrandol2=celdaceninf(1,end)*(linspace(0,celdaceninf(2,end),30)); % esto es la funcion y*xmax integrandol3=celdaceninf(1,1)*(linspace(0,celdaceninf(2,1),30)); % esto es la funcion y*xmin momxsup=sum(diff(celdacensup(2,end:- 1:in)).*(integrandou1(1:end-1)+integrandou1(2:end))/2)+... sum(diff(linspace(0,celdacensup(2,end),30)).*(integrandou2(1:end- 1)+integrandou2(2:end))/2)-...
  56. 56. sum(diff(celdacensup(2,1:in)).*(integrandou3(1:end- 1)+integrandou3(2:end))/2)-... sum(diff(linspace(0,celdacensup(2,1),30)).*(integrandou4(1:end- 1)+integrandou4(2:end))/2); momxinf=sum(diff(celdaceninf(2,end:- 1:1)).*(integrandol1(1:end-1)+integrandol1(2:end))/2)+... sum(diff(linspace(0,celdaceninf(2,end),30)).*(integrandol2(1:end- 1)+integrandol2(2:end))/2)-... sum(diff(linspace(0,celdaceninf(2,1),30)).*(integrandol3(1:end- 1)+integrandol3(2:end))/2); momxceldacen=momxsup-momxinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: % superior: hu1 = diff(celdacensup(2,end:-1:in)); deltau1 = diff(integrandou1)./hu1; du1 = pchipslopes(hu1,deltau1); Dsup1 = sum((hu1.^2).*(du1(2:end)-du1(1:end-1))/12); hu2 = diff(linspace(0,celdacensup(2,end),30)); deltau2 = diff(integrandou2)./hu2; du2 = pchipslopes(hu2,deltau2); Dsup2 = sum((hu2.^2).*(du2(2:end)-du2(1:end-1))/12); hu3 = diff(celdacensup(2,1:in)); deltau3 = diff(integrandou3)./hu3; du3 = pchipslopes(hu3,deltau3); Dsup3 = sum((hu3.^2).*(du3(2:end)-du3(1:end-1))/12); hu4 = diff(linspace(0,celdacensup(2,1),30)); deltau4 = diff(integrandou4)./hu4; du4 = pchipslopes(hu4,deltau4); Dsup4 = sum((hu4.^2).*(du4(2:end)-du4(1:end-1))/12); momxsupH=momxsup-Dsup1-Dsup2+Dsup3+Dsup4; % Inferior: hl1 = diff(celdaceninf(2,end:-1:1)); % invertimos el sentido como en el integrando deltal1 = diff(integrandol1)./hl1; dl1 = pchipslopes(hl1,deltal1); Dinf1 = sum((hl1.^2).*(dl1(2:end)-dl1(1:end-1))/12); hl2 = diff(linspace(0,celdaceninf(2,end),30)); deltal2 = diff(integrandol2)./hl2; dl2 = pchipslopes(hl2,deltal2); Dinf2 = sum((hl2.^2).*(dl2(2:end)-dl2(1:end-1))/12); hl3 = diff(linspace(0,celdaceninf(2,1),30)); deltal3 = diff(integrandol3)./hl3; dl3 = pchipslopes(hl3,deltal3); Dinf3 = sum((hl3.^2).*(dl3(2:end)-dl3(1:end-1))/12); momxinfH=momxinf-Dinf1-Dinf2+Dinf3; momxHceldacen=momxsupH-momxinfH;
  57. 57. momxHtotality=momxHexte-momxHceldacen; Sx(j)=momxHtotality; % ponemos como resultado final el de integracion con polinomio Hermite. yg(j)=Sx(j)/areatot(j); % Reinicializamos las matrices usadas para q luego no de % problemas el programa al asignar otros datos, pues si no % se quedarian guardadas las dimensiones actuales de % celdacensup y celdaceninf: celdacensup=[]; celdaceninf=[]; elseif (poscinicial(k)<posweb11(j)) & (poscfinal(k)<=posweb22(j)) % Tenemos celda izquierda y central, pero derecha no. npuntos0=(3*pc-1)/2; npuntos1=3*pc-npuntos0; % CELDA IZQUIERDA: celdaizqsup(1,:)=xint(j,1:npuntos0) + xoffset(j)*cuerda(j); celdaizqsup(2,:)=yextraint(j,1:npuntos0); celdaizqinf(1,:)=xint(j,1:npuntos0) + xoffset(j)*cuerda(j); celdaizqinf(2,:)=yintraint(j,1:npuntos0); % CELDA CENTRAL: celdacensup(1,:)=xint(j,npuntos0+1:end) + xoffset(j)*cuerda(j); celdacensup(2,:)=yextraint(j,npuntos0+1:end); celdaceninf(1,:)=xint(j,npuntos0+1:end) + xoffset(j)*cuerda(j); celdaceninf(2,:)=yintraint(j,npuntos0+1:end); % Sy: % CELDA IZQ: % utilizando solo la regla del trapecio: integrandou=(celdaizqsup(1,:)).*celdaizqsup(2,:); integrandol=(celdaizqinf(1,:)).*celdaizqinf(2,:); momysup=sum(diff(celdaizqsup(1,:)).*(integrandou(1:end- 1)+integrandou(2:end))/2); momyinf=sum(diff(celdaizqinf(1,:)).*(integrandol(1:end- 1)+integrandol(2:end))/2); momyceldaizq=momysup-momyinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: hu = diff(celdaizqsup(1,:)); deltau = diff(integrandou)./hu; du = pchipslopes(hu,deltau); Dsup = sum((hu.^2).*(du(2:end)-du(1:end-1))/12); momysupH=momysup-Dsup; hl = diff(celdaizqinf(1,:)); deltal = diff(integrandol)./hl; dl = pchipslopes(hl,deltal);
  58. 58. Dinf = sum((hl.^2).*(dl(2:end)-dl(1:end-1))/12); momyinfH=momyinf-Dinf; momyHceldaizq=momysupH-momyinfH; % CELDA CENTRAL: % utilizando solo la regla del trapecio: integrandou=(celdacensup(1,:)).*celdacensup(2,:); integrandol=(celdaceninf(1,:)).*celdaceninf(2,:); momysup=sum(diff(celdacensup(1,:)).*(integrandou(1:end- 1)+integrandou(2:end))/2); momyinf=sum(diff(celdaceninf(1,:)).*(integrandol(1:end- 1)+integrandol(2:end))/2); momyceldacen=momysup-momyinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: hu = diff(celdacensup(1,:)); deltau = diff(integrandou)./hu; du = pchipslopes(hu,deltau); Dsup = sum((hu.^2).*(du(2:end)-du(1:end-1))/12); momysupH=momysup-Dsup; hl = diff(celdaceninf(1,:)); deltal = diff(integrandol)./hl; dl = pchipslopes(hl,deltal); Dinf = sum((hl.^2).*(dl(2:end)-dl(1:end-1))/12); momyinfH=momyinf-Dinf; momyHceldacen=momysupH-momyinfH; momyHtotality=momyHexte-momyHceldaizq-momyHceldacen; Sy(j)=momyHtotality; % ponemos como resultado final el de integracion con polinomio Hermite. xg(j)=Sy(j)/areatot(j); % Sx: % CELDA IZQ: % utilizando solo la regla del trapecio: integrandou1=celdaizqsup(1,end)*(linspace(0,celdaizqsup(2,end),30)); % esto es la funcion y*xmax integrandou2=(celdaizqsup(2,:)).*celdaizqsup(1,:); integrandol1=celdaizqinf(1,end)*(linspace(0,celdaizqinf(2,end),30)); % esto es la funcion y*xmax integrandol2=(celdaizqinf(2,:)).*celdaizqinf(1,:); momxsup=sum(diff(linspace(0,celdaizqsup(2,end),30)).*(integrandou1(1:e nd-1)+integrandou1(2:end))/2)- sum(diff(celdaizqsup(2,:)).*(integrandou2(1:end- 1)+integrandou2(2:end))/2); momxinf=sum(diff(linspace(0,celdaizqinf(2,end),30)).*(integrandol1(1:e
  59. 59. nd-1)+integrandol1(2:end))/2)- sum(diff(celdaizqinf(2,:)).*(integrandol2(1:end- 1)+integrandol2(2:end))/2); momxceldaizq=momxsup-momxinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: % superior: hu1 = diff(linspace(0,celdaizqsup(2,end),30)); deltau1 = diff(integrandou1)./hu1; du1 = pchipslopes(hu1,deltau1); Dsup1 = sum((hu1.^2).*(du1(2:end)-du1(1:end-1))/12); hu2 = diff(celdaizqsup(2,:)); deltau2 = diff(integrandou2)./hu2; du2 = pchipslopes(hu2,deltau2); Dsup2 = sum((hu2.^2).*(du2(2:end)-du2(1:end-1))/12); momxsupH=momxsup-Dsup1+Dsup2; % inferior: hl1 = diff(linspace(0,celdaizqinf(2,end),30)); deltal1 = diff(integrandol1)./hl1; dl1 = pchipslopes(hl1,deltal1); Dinf1 = sum((hl1.^2).*(dl1(2:end)-dl1(1:end-1))/12); hl2 = diff(celdaizqinf(2,:)); deltal2 = diff(integrandol2)./hl2; dl2 = pchipslopes(hl2,deltal2); Dinf2 = sum((hl2.^2).*(dl2(2:end)-dl2(1:end-1))/12); momxinfH=momxinf-Dinf1+Dinf2; momxHceldaizq=momxsupH-momxinfH; % CELDA CENTRAL: % utilizando solo la regla del trapecio: [maxim,in]=max(celdacensup(2,:)); integrandou1=(celdacensup(2,end:- 1:in)).*celdacensup(1,end:-1:in); integrandou2=celdacensup(1,end)*(linspace(0,celdacensup(2,end),30)); % esto es la funcion y*xmax integrandou3=(celdacensup(2,1:in)).*celdacensup(1,1:in); integrandou4=celdacensup(1,1)*(linspace(0,celdacensup(2,1),30)); % esto es la funcion y*xmin integrandol1=(celdaceninf(2,end:- 1:1)).*celdaceninf(1,end:-1:1);% hay q invertir el sentido integrandol2=celdaceninf(1,end)*(linspace(0,celdaceninf(2,end),30)); % esto es la funcion y*xmax integrandol3=celdaceninf(1,1)*(linspace(0,celdaceninf(2,1),30)); % esto es la funcion y*xmin
  60. 60. momxsup=sum(diff(celdacensup(2,end:- 1:in)).*(integrandou1(1:end-1)+integrandou1(2:end))/2)+... sum(diff(linspace(0,celdacensup(2,end),30)).*(integrandou2(1:end- 1)+integrandou2(2:end))/2)-... sum(diff(celdacensup(2,1:in)).*(integrandou3(1:end- 1)+integrandou3(2:end))/2)-... sum(diff(linspace(0,celdacensup(2,1),30)).*(integrandou4(1:end- 1)+integrandou4(2:end))/2); momxinf=sum(diff(celdaceninf(2,end:- 1:1)).*(integrandol1(1:end-1)+integrandol1(2:end))/2)+... sum(diff(linspace(0,celdaceninf(2,end),30)).*(integrandol2(1:end- 1)+integrandol2(2:end))/2)-... sum(diff(linspace(0,celdaceninf(2,1),30)).*(integrandol3(1:end- 1)+integrandol3(2:end))/2); momxceldacen=momxsup-momxinf; % si añadimos el termino que se obtiene de integrar el polinomio de % Hermite: % superior: hu1 = diff(celdacensup(2,end:-1:in)); deltau1 = diff(integrandou1)./hu1; du1 = pchipslopes(hu1,deltau1); Dsup1 = sum((hu1.^2).*(du1(2:end)-du1(1:end-1))/12); hu2 = diff(linspace(0,celdacensup(2,end),30)); deltau2 = diff(integrandou2)./hu2; du2 = pchipslopes(hu2,deltau2); Dsup2 = sum((hu2.^2).*(du2(2:end)-du2(1:end-1))/12); hu3 = diff(celdacensup(2,1:in)); deltau3 = diff(integrandou3)./hu3; du3 = pchipslopes(hu3,deltau3); Dsup3 = sum((hu3.^2).*(du3(2:end)-du3(1:end-1))/12); hu4 = diff(linspace(0,celdacensup(2,1),30)); deltau4 = diff(integrandou4)./hu4; du4 = pchipslopes(hu4,deltau4); Dsup4 = sum((hu4.^2).*(du4(2:end)-du4(1:end-1))/12); momxsupH=momxsup-Dsup1-Dsup2+Dsup3+Dsup4; % Inferior: hl1 = diff(celdaceninf(2,end:-1:1)); % invertimos el sentido como en el integrando deltal1 = diff(integrandol1)./hl1; dl1 = pchipslopes(hl1,deltal1); Dinf1 = sum((hl1.^2).*(dl1(2:end)-dl1(1:end-1))/12); hl2 = diff(linspace(0,celdaceninf(2,end),30)); deltal2 = diff(integrandol2)./hl2; dl2 = pchipslopes(hl2,deltal2); Dinf2 = sum((hl2.^2).*(dl2(2:end)-dl2(1:end-1))/12); hl3 = diff(linspace(0,celdaceninf(2,1),30)); deltal3 = diff(integrandol3)./hl3; dl3 = pchipslopes(hl3,deltal3);

×