barre_approx_exo3.m 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. clc;clear all;close all;
  2. %----- Methodes d'approximation sur la formulation forte
  3. % comparaison des solutions numeriques et analytique de l'exercice de cours 03
  4. % Vibration d'une barre encastree - ressort
  5. % H.Oudin
  6. %----------------------------------------------------------
  7. % donnees du probleme
  8. ES= 1 ; roS=1; L= 1;
  9. alpa = input('donner la valeur du rapport ES/kl ? [10]: ');
  10. if isempty(alpa) alpa=10; end
  11. a= pi/2+0.01; % solution analytique
  12. b=3*pi/2-0.01;
  13. lx = fzero(@(x) tan(x)+alpa*x,[a b]);
  14. omeg1=lx*sqrt(ES/roS)/L
  15. %----------------------------------------------------------
  16. disp('Methodes d''approximation sur la formulation forte');
  17. disp('avec une fonction de comparaison polynomiale de degre 2');
  18. disp('---------------------------------------');
  19. beta = (alpa+1)/(2*alpa+1)
  20. f=@(x) x.*(1-beta*x/L);
  21. disp('Methode de Collocation');
  22. xp=0.5;
  23. while xp > 0
  24. k = 2*beta*ES/L ; m = roS*f(xp*L) ; sol = sqrt(k/m);
  25. disp('---------------------------------------');
  26. fprintf('Pour un point de collocation situe en %3.1f L \n',xp);
  27. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  28. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  29. disp('pour quitter la methode de Collocation ne pas donner de nouvelle valeur');
  30. xp = input('donner une nouvelle position du point de collocation sur [0,1]: ');
  31. if isempty(xp) xp=0; end
  32. end
  33. disp('---------------------------------------');
  34. disp('Methode de la valeur moyenne');
  35. k = 2*beta*ES ; m = roS*quad(f,0,L); sol = sqrt(k/m);
  36. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  37. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  38. disp('---------------------------------------');
  39. disp('Methode de galerkin');
  40. f2 = @(x) (x.*(1-beta*x/L)).^2;
  41. k = 2*beta*ES*quad(f,0,L)/L ; m = roS*quad(f2,0,L); sol = sqrt(k/m);
  42. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  43. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  44. %----------------------------------------------------------
  45. disp('------------------------------------------');
  46. disp('amelioration de la fonction de comparaison de forme sinusoidale ');
  47. disp('------------------------------------------');
  48. beta=-(1+alpa*pi/2)
  49. f=@(x) 1 - cos(pi*x/2/L)+beta*sin(pi*x/2/L);
  50. D2f=@(x) (pi/2/L)^2*(cos(pi*x/2/L)-beta*sin(pi*x/2/L));
  51. disp('Methode de Collocation');
  52. xp=0.5;
  53. while xp > 0
  54. k = -ES*D2f(xp*L) ; m = roS*f(xp*L) ; sol = sqrt(k/m);
  55. disp('---------------------------------------');
  56. fprintf('Pour un point de collocation situe en %3.1f L \n',xp);
  57. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  58. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  59. disp('pour quitter la methode de Collocation ne pas donner de nouvelle valeur');
  60. xp = input('donner une nouvelle position du point de collocation sur [0,1]: ');
  61. if isempty(xp) xp=0; end
  62. end
  63. disp('---------------------------------------');
  64. disp('Methode de la valeur moyenne');
  65. k = -ES*quad(D2f,0,L) ; m = roS*quad(f,0,L); sol = sqrt(k/m);
  66. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  67. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);
  68. disp('---------------------------------------');
  69. disp('Methode de galerkin');
  70. f1 = @(x) (1 - cos(pi*x/2/L)+beta*sin(pi*x/2/L)).*(pi/2/L)^2*(cos(pi*x/2/L)-beta*sin(pi*x/2/L));
  71. f2 = @(x) (1 - cos(pi*x/2/L)+beta*sin(pi*x/2/L)).*(1 - cos(pi*x/2/L)+beta*sin(pi*x/2/L));
  72. k = -ES*quad(f1,0,L) ; m = roS*quad(f2,0,L); sol = sqrt(k/m);
  73. fprintf('L''approximation de la premiere pulsation propre est %6.3f / analytique %6.3f\n',sol,omeg1);
  74. fprintf('Soit une erreur de %2.1f %%\n',100*abs(sol-omeg1)/omeg1);