%% Prog008FEMTuboFuenteAbiertoConMontaje clearvars; close all; clc; %este es un programa de elementos finitos que representa un tubo abierto en un extremo %con fuete y cerrado en el otro extremo %en ambos extremos calcularemos las frecuencias naturales (valores propios) %y la distribucion de la presion sonora (MNV) dentro del tubo a dichas %frecuencias (vectores propios) %para despues determinar la respuesta forzada %% datos inciales Ne = 100; %numero de elementos NnD = 1; %numero de DOF s con condiciones drichelet N = Ne+1; %numero de DOFs - funciones de interpolacion Nt = Ne+1-NnD; %numero de DOFs - funciones de interpolacion con drichelet Nnod = 2; %numero de nodos elemento Ncord = 2; %numero de coordenadas por elemento Ndof = 1; %numero de dof por nodo L = 1.0; %longitud tubo m ax = L/(2*Ne); %logitud de 1/2 elemento a = 0.01; %lado/radio del tubo A = pi*a^2; %area de la seccion transversal del tubo A c = 344; %velocidad del sonido ro = 1.18; %densidad del aire B = c^2*ro; %rigidez de compresibilidad adiabática de volumen P0 = 2e-5; %recordemos que este es un modelo de ondas planas %esto se cumple cuando la longitud de onda es mucho mayor que las %dimensiones que forman el area de la seccion transversal %se utilizara matrices elementales %% matriz de cordenadas %inicio Xcord = zeros(N,3); %coordenadas deltax = L/Ne; xcorde = transpose( (0:N-1)*deltax - (L/2) ); Xcord(:,1) = xcorde; %% matriz de conectividad %inicio Xconec = zeros(Ne,Ncord); for n = 1:N-1 Xconec(n,1) = n; Xconec(n,2) = n+1; end %% matriz de ID %inicio XID = zeros(N,Ndof); %nodos con condicion de drichelet (el último nodo esta abierto) nodDr = ones(N,Ndof); nodDr(N,Ndof) = 0; cont = 1; %contador for n = 1:N if nodDr(n) == 0 XID(n,1) = 0; else XID(n,1) = cont; cont = cont + 1; end end %% matriz de masa - rigidez elemental y global %inicializacion matriz de masa global M = zeros(Nt,Nt); %matriz de masa elemental Me = [2 1;1 2]; Me = (A*ax)/(3*c^2)*Me; %inicializacion matriz de rigidez global K = zeros(Nt,Nt); %matriz de rigidez elemental Ke = [1 -1;-1 1]; Ke = A/(2*ax)*Ke; %loop principal montaje for nel = 1:Ne for noi = 1:Nnod for ngi = 1:Ndof for noj = 1:Nnod for ngj = 1:Ndof NN = XID( Xconec(nel,noi) , ngi ); MM = XID( Xconec(nel,noj) , ngj ); if (NN ~= 0) && (MM ~= 0) fila = Ndof*(Nnod-1)*(noi - 1) + ngi; colu = Ndof*(Nnod-1)*(noj - 1) + ngj; M(NN,MM) = M(NN,MM) + Me( fila, colu ); K(NN,MM) = K(NN,MM) + Ke( fila, colu ); end end end end end end %% correccion de fuente M2 = M(2:Nt,2:Nt); K2 = K(2:Nt,2:Nt); %% valores y vectores propios %la función eig() determina los valores y vectores propios de la matriz [PHI2,LAM2] = eig(K2,M2); %incorporamos la condicion de contorno de tubo abierto con la fuente %apagada para ello incorporamos una fila llena de ceros PHI21 = [zeros(1,Nt-1);PHI2;zeros(1,Nt-1)]; %frecuencias naturales elementos finitos FEM f_FEM2 = diag( real(sqrt(LAM2)))/(2*pi); nn = 1:length(f_FEM2); %frecuencias naturales teóricas TEO f_TEO2 = zeros(Nt-1,1); for n = 1:Nt-1 f_TEO2(n) = n*c/(2*L); end; %error err2 = 100*abs(f_FEM2 - f_TEO2)./f_TEO2; %tabla f_FEM2_f_TEO2_err2 = [f_FEM2, f_TEO2, err2]; %% figuras frecuencias valores propios figure(1) plot(f_TEO2,f_FEM2,'b -o'); title('frecuencias f_{TEO} vs f_{FEM}'); xlabel('f_TEO (Hz)'); ylabel('f_TEO (Hz)'); axis([min(f_TEO2),max(f_TEO2),min(f_FEM2),max(f_FEM2)]); grid on; box on; figure(2) plot(nn,err2,'b -o'); title('porcentaje de error frecuencias f_{TEO} vs f_{FEM}'); xlabel('n'); ylabel('error (%)'); grid on; box on; %% figuras distribución de presion sonora modal %coordenadas nodales x = zeros(N,1); for n = 1:N x(n) = -(L/2) + (n-1)*L/Ne; end figure(3) subplot(2,2,1) plot(x, PHI21(:,1)/max( abs(PHI21(:,1) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(1))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; subplot(2,2,2) plot(x, PHI21(:,2)/max( abs(PHI21(:,2) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(2))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; subplot(2,2,3) plot(x, PHI21(:,3)/max( abs(PHI21(:,3) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(3))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; subplot(2,2,4) plot(x, PHI21(:,4)/max( abs(PHI21(:,4) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(4))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; figure(4) subplot(2,2,1) plot(x, PHI21(:,5)/max( abs(PHI21(:,5) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(5))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; subplot(2,2,2) plot(x, PHI21(:,6)/max( abs(PHI21(:,6) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(6))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; subplot(2,2,3) plot(x, PHI21(:,7)/max( abs(PHI21(:,7) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(7))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; subplot(2,2,4) plot(x, PHI21(:,8)/max( abs(PHI21(:,8) ) ) ,'b') ; title(['distribucion de presion sonora normalizada para f_{FEM} = ',num2str(f_FEM2(8))] ); xlabel('x (m)'); ylabel('p (Pa)'); axis([-L/2,L/2,-1.5,1.5]); grid on; box on; %% solucion forzada dominio de la frecuencia metodo directo %resolveremos el sistema de ecuaciones [-w^2*M1 + K1]*P1(w) = F1(w) %donde w = 2*pi*f y f = 1,2,3,...,1000 (Hz) %la pesion sonora en x = -L/2 es PL = exp(-j*w*t) con PL = 1 (Pa) %componentes del vector de fuerzas PL = 1e-3; %amplitud de presion sonora Pm = M(2:Nt,1); %primera columna de la matriz de masa Pk = K(2:Nt,1); %primera columna de la matriz de rigidez %frecuencias fmin = 1; fmax = 1000; finc = 1; f = fmin:finc:fmax; %vector de frecuencias w = 2*pi*f; %vector de frecuencias angulares NF = length(f); %prelocalizamos la solucion como matriz %la primera columna tiene la solución para f = 1 (Hz) %la segunda columna tiene la solución para f = 2 (Hz) %................................................... %la ultima columna tiene la solución para f = 1000 (Hz) P2 = zeros(Nt-1,NF); %matriz identidad I2 = eye(Nt-1); %solucion for n = 1:NF %vector de fuerza dependiente de la frecuencia F2 = w(n)^2*PL*Pm - PL*Pk; %usamos A\b que es mejor que inv(A)*b P2(:,n) = (-w(n)^2*M2 + K2)\F2; %nversion modal de (-w(n)^2*M2 + K2) %P2(:,n) = PHI2*inv(-w(n)^2*I2 + LAM2)*transpose(PHI2)*F2; end %incorporamos la solucion PL para x = -L/2 P2 = [PL*ones(1,NF);P2;zeros(1,NF)]; %% comparación resultados teóricos y elementos finitos k = 2*pi*f(500)/c; p = PL*sin(k*(L/2 - x))/sin(k*L); %grafico espacio - frecuencia - presion sonora %distribucion del valor absoluto de la presion sonora ontenida usando FEM %en funcion de la posicion "x" y de la frecuencia "f" [Fmesh,Xmesh] = meshgrid(f,x); figure(5) surf(Fmesh,Xmesh,abs(P2),'FaceColor','interp',... 'EdgeColor','none',... 'FaceLighting','phong') title('Modulo Presion Sonora - Tubo Abierto - FEM'); xlabel('f (Hz)'); ylabel('x (m)'); zlabel('|P| (Pa)') axis([0,f(NF),-L/2,L/2]); grid on; box on; colormap jet colorbar; figure(6) surf(Fmesh,Xmesh,20*log10((abs(P2) + P0)/sqrt(2)/2e-5),'FaceColor','interp',... 'EdgeColor','none',... 'FaceLighting','phong') title('Nivel de Presion Sonora - Tubo Abierto - FEM'); xlabel('f (Hz)'); ylabel('x (m)'); zlabel('|P| (Pa)') axis([0,f(NF),-L/2,L/2]); grid on; box on; colormap jet colorbar; %compararemos con la solucion exacta para la frecuencia de f = 1000 (Hz) %p(x,t) = PL*sin[k*(x-L/2)]/sin(k*L) figure(7) plot(x,p,'b',x,P2(:,500),'r -o'); title(['comparacion solución TEO vs FEM frecuancia f = ',num2str(f(500))] ); xlabel('x (m)'); ylabel('p (Pa)'); legend('p_{TEO}(x,f)','p_{FEM_DIR}(x,f)'); axis([-L/2,L/2,-1.5*max(p),1.5*max(p)]); grid on; box on; figure(8) plot(f,20*log10(P2(1,:)/sqrt(2)/P0),'b',f,20*log10(P2(Nt-1,:)/sqrt(2)/P0),'r'); title('niveles de presion sonora al incio y al final del tubo'); xlabel('f (Hz)'); ylabel('L_p (dB)'); legend('L_{p1}(f)','L_{p2}(f)'); grid on; box on; figure(9) plot(f,20*log10( P2(1,:)./P2(Nt-1,:)),'b'); title('reduccion de ruido NR'); xlabel('f (Hz)'); ylabel('NR(f) (dB)'); legend('NR(f)'); grid on; box on; figure(10) plot(f,20*log10( P2(Nt-1,:)./P2(1,:)),'b'); title('respuesta de frecuencia'); xlabel('f (Hz)'); ylabel('H(f) (dB)'); legend('H (f)'); grid on; box on;