barre_approx_cours.m 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. clc;clear all;close all;
  2. % comparaison des solutions numeriques et analytique de l'exercice de cours
  3. % Vibration d'une barre encastree - libre
  4. % H.Oudin
  5. %----------------------------------------------------------
  6. % donnees du probleme
  7. ES= 1 ; roS=1; L= 1;
  8. %----------------------------------------------------------
  9. %----- Methodes d'approximation sur la formulation forte
  10. %----- avec la fonction de forme x(2x-L)
  11. disp('---------------------------------------');
  12. disp('Vibration d''une barre encastree - libre');
  13. disp('---------------------------------------');
  14. disp('Methodes d''approximation avec la fonction de forme x(2x-L)');
  15. disp('Utilise la formulation forte du probleme');
  16. omeg1=pi*sqrt(ES/roS/L/L)/2; % solution analytique
  17. taille = get(0,'ScreenSize');
  18. figure('Name','comparaison de la fonction de forme et du premier mode',...
  19. 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
  20. fplot(@(x)[sin(pi*x/2/L) , x.*(2*L-x)],[0 L]);
  21. %Collocation
  22. f=@(x) x.*(2*L-x); % D2f=@(x) -2*x./x;
  23. disp('---------------------------------------');
  24. disp('Methode de Collocation');
  25. xp=0.5;
  26. while xp > 0
  27. k = 2*ES ; m = roS*f(xp) ; sol = sqrt(k/m);
  28. disp('---------------------------------------');
  29. fprintf('Pour un point de collocation situe en %3.1f L \n',xp);
  30. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  31. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  32. disp('---------------------------------------');
  33. disp('pour quitter la methode de Collocation ne pas donner de nouvelle valeur');
  34. xp = input('donner une nouvelle position du point de collocation sur [0,1]: ');
  35. if isempty(xp) xp=0; end
  36. end
  37. disp('---------------------------------------');
  38. disp('Methode de la valeur moyenne');
  39. k = 2*ES*L; m = roS*quad(f,0,L); sol = sqrt(k/m);
  40. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  41. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  42. disp('---------------------------------------');
  43. disp('Methode de galerkin');
  44. f2 = @(x) (x.*(2*L-x)).^2;
  45. k = 2*ES*quad(f,0,L); m = roS*quad(f2,0,L); sol = sqrt(k/m);
  46. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  47. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  48. close all;
  49. %----------------------------------------------------------
  50. %----- Méthode de Galerkin sur la formulation faible pour un polynome de degre n
  51. disp('---------------------------------------------------------------------------');
  52. disp('---------------------------------------------------------------------------');
  53. n=2;
  54. fprintf('Methode de Galerkin sur la formulation faible pour un polynome de degre %3i\n',n);
  55. while n > 1
  56. K=zeros(n); M=zeros(n);
  57. for i=1:n
  58. for j=1:n
  59. F1 = @(x) i*j*x.^(i+j-2); K(i,j)= ES*quad(F1,0,L);
  60. F2 = @(x) x.^(i+j); M(i,j)= roS*quad(F2,0,L);
  61. end
  62. end
  63. %disp('systeme matriciel');K M
  64. if n >= 4 nmod=3; else nmod =n; end
  65. [modes,omega] = eigs(K,M,n,'sm');
  66. omeg = diag(sqrt(omega));
  67. %modes
  68. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',omeg(1),omeg1);
  69. fprintf('Soit une erreur de %2.1f %%\n',100*abs(omeg(1)-omeg1)/omeg1);
  70. figure('Name','comparaison Galerkin - analytique',...
  71. 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
  72. for imod = 1:nmod
  73. U= modes(:,imod) ; %
  74. %if U(1)<0 U = -U ;end
  75. y =0; x=0:L/100:L;
  76. for i=1:n y=y+U(i)*x.^i; end
  77. maxi = max(abs(y)); y=y/maxi;
  78. subplot(nmod,1,imod),hold on, plot(x,y,'b'),plot(x,-y,'b')
  79. sol = omeg(imod); anal=(2*imod-1)*pi*sqrt(ES/roS/L/L)/2;
  80. err = 100*abs(sol-anal)/anal;
  81. subplot(nmod,1,imod), fplot(@(x) -sin((2*imod-1)*pi*x/L/2),[0 L],'r'),
  82. subplot(nmod,1,imod), fplot(@(x) sin((2*imod-1)*pi*x/L/2),[0 L],'r'),...
  83. title([num2str(imod),'ieme mode : pulsation approchee ',num2str(sol),...
  84. ' / analytique ',num2str(anal),' soit une erreur de ',num2str(err),...
  85. ' % ' ]), legend('sol. analytique en rouge','Sol. approchee en bleu'), grid
  86. end
  87. disp('---------------------------------------');
  88. disp('pour quitter l''application ne pas donner de nouvelle valeur');
  89. n = input('donner le degre n de l''approximation ? [2]: ');
  90. if isempty(n) n=0; end
  91. end
  92. close all;