12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- clc;clear all;close all;
- % comparaison des solutions numeriques et analytique de l'exercice de cours
- % Vibration d'une barre encastree - libre
- % H.Oudin
- %----------------------------------------------------------
- % donnees du probleme
- ES= 1 ; roS=1; L= 1;
- %----------------------------------------------------------
- %----- Methodes d'approximation sur la formulation forte
- %----- avec la fonction de forme x(2x-L)
- disp('---------------------------------------');
- disp('Vibration d''une barre encastree - libre');
- disp('---------------------------------------');
- disp('Methodes d''approximation avec la fonction de forme x(2x-L)');
- disp('Utilise la formulation forte du probleme');
- omeg1=pi*sqrt(ES/roS/L/L)/2; % solution analytique
- taille = get(0,'ScreenSize');
- figure('Name','comparaison de la fonction de forme et du premier mode',...
- 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
- fplot(@(x)[sin(pi*x/2/L) , x.*(2*L-x)],[0 L]);
- %Collocation
- f=@(x) x.*(2*L-x); % D2f=@(x) -2*x./x;
- disp('---------------------------------------');
- disp('Methode de Collocation');
- xp=0.5;
- while xp > 0
- k = 2*ES ; m = roS*f(xp) ; sol = sqrt(k/m);
- disp('---------------------------------------');
- fprintf('Pour un point de collocation situe en %3.1f L \n',xp);
- fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
- fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
- disp('---------------------------------------');
- disp('pour quitter la methode de Collocation ne pas donner de nouvelle valeur');
- xp = input('donner une nouvelle position du point de collocation sur [0,1]: ');
- if isempty(xp) xp=0; end
- end
- disp('---------------------------------------');
- disp('Methode de la valeur moyenne');
- k = 2*ES*L; m = roS*quad(f,0,L); sol = sqrt(k/m);
- fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
- fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
- disp('---------------------------------------');
- disp('Methode de galerkin');
- f2 = @(x) (x.*(2*L-x)).^2;
- k = 2*ES*quad(f,0,L); m = roS*quad(f2,0,L); sol = sqrt(k/m);
- fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
- fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
- close all;
- %----------------------------------------------------------
- %----- Méthode de Galerkin sur la formulation faible pour un polynome de degre n
- disp('---------------------------------------------------------------------------');
- disp('---------------------------------------------------------------------------');
- n=2;
- fprintf('Methode de Galerkin sur la formulation faible pour un polynome de degre %3i\n',n);
- while n > 1
- K=zeros(n); M=zeros(n);
- for i=1:n
- for j=1:n
- F1 = @(x) i*j*x.^(i+j-2); K(i,j)= ES*quad(F1,0,L);
- F2 = @(x) x.^(i+j); M(i,j)= roS*quad(F2,0,L);
- end
- end
- %disp('systeme matriciel');K M
- if n >= 4 nmod=3; else nmod =n; end
- [modes,omega] = eigs(K,M,n,'sm');
- omeg = diag(sqrt(omega));
- %modes
- fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',omeg(1),omeg1);
- fprintf('Soit une erreur de %2.1f %%\n',100*abs(omeg(1)-omeg1)/omeg1);
- figure('Name','comparaison Galerkin - analytique',...
- 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
- for imod = 1:nmod
- U= modes(:,imod) ; %
- %if U(1)<0 U = -U ;end
- y =0; x=0:L/100:L;
- for i=1:n y=y+U(i)*x.^i; end
- maxi = max(abs(y)); y=y/maxi;
- subplot(nmod,1,imod),hold on, plot(x,y,'b'),plot(x,-y,'b')
- sol = omeg(imod); anal=(2*imod-1)*pi*sqrt(ES/roS/L/L)/2;
- err = 100*abs(sol-anal)/anal;
- subplot(nmod,1,imod), fplot(@(x) -sin((2*imod-1)*pi*x/L/2),[0 L],'r'),
- subplot(nmod,1,imod), fplot(@(x) sin((2*imod-1)*pi*x/L/2),[0 L],'r'),...
- title([num2str(imod),'ieme mode : pulsation approchee ',num2str(sol),...
- ' / analytique ',num2str(anal),' soit une erreur de ',num2str(err),...
- ' % ' ]), legend('sol. analytique en rouge','Sol. approchee en bleu'), grid
- end
- disp('---------------------------------------');
- disp('pour quitter l''application ne pas donner de nouvelle valeur');
- n = input('donner le degre n de l''approximation ? [2]: ');
- if isempty(n) n=0; end
- end
- close all;
|