FV_4.m 4.0 KB

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