FV_5.m 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. clc;clear all;close all;
  2. % comparaison des solutions numeriques et analytique de l'exercice FV5
  3. % Mur climatise
  4. % H.Oudin
  5. %----------------------------------------------------------
  6. % donnees du probleme
  7. T0= 50 ; phie= 10; ro=-10*pi; lamda=1; e=1;
  8. %----- solution analytique
  9. %ue = dsolve('D2u = -ro*sin(pi*t)/lamda','u(0)=T0','Du(e)=-phie/lamda');
  10. %ue = simple(ue)
  11. fa=@(x) T0+x*(-phie+ro/pi)+ro*sin(pi*x)/pi/pi ;
  12. %----------------------------------------------------------
  13. %----- Methode de Galerkin
  14. disp('---------------------------------------');
  15. disp('Methode de Galerkin');
  16. n = input('donner le degre n de l''approximation ? [2]: ');
  17. if isempty(n) n=2; end
  18. disp('---------------------------------------');
  19. taille = get(0,'ScreenSize');
  20. figure('Name','comparaison Galerkin - analytique',...
  21. 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
  22. hold on,
  23. fplot(fa,[0 e],'r');
  24. K=[];F=[];
  25. for i=1:n
  26. for j=1:n
  27. F1 = @(x) i*j*x.^(i+j-2);
  28. K(i,j)= quad(F1,0,e);
  29. end
  30. F2 = @(x) sin(x*pi/e).*x.^i;
  31. F(i)= ro*quad(F2,0,e)-phie*e^i;
  32. end
  33. disp('---------------------------------------');
  34. fprintf('Methode de galerkin pour un polynome de degre %3i\n',n);
  35. disp('systeme matriciel');
  36. disp(K); disp(F);
  37. U = K\F' ;
  38. y =T0;
  39. x=0:e/100:e;
  40. for i=1:n y=y+U(i)*x.^i; end
  41. plot(x,y,'b');
  42. legend('sol. analytique en rouge','approx par Galerkin en bleu',2);
  43. grid
  44. %----------------------------------------------------------
  45. %------ Methode des elements finis
  46. disp('---------------------------------------');
  47. disp('Methode des elements finis');
  48. ne = input('donner le nombre d''elements ne ? [2]: ');
  49. if isempty(ne) ne=2; end
  50. figure('Name','comparaison EF - analytique',...
  51. 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
  52. hold on, fplot(fa,[0 e],'r');
  53. Le=e/ne;
  54. K=[];F=[];
  55. for i=1:ne-1
  56. K(i,i)=2*lamda/Le;
  57. K(i,i+1)=-lamda/Le;
  58. K(i+1,i)=-lamda/Le;
  59. F1 = @(x) (sin(pi*(i/ne+x/e)) - 2*sin(pi/(2*ne))*...
  60. cos(pi*((i-0.5)/ne+x/e)).*x./Le);
  61. F(i)= ro*quad(F1,0,Le);
  62. end
  63. F(1)=F(1)+T0*lamda/Le;
  64. K(ne,ne)=lamda/Le;
  65. F2 = @(x) sin(pi*((ne-1)/ne+x/e)).*x./Le;
  66. F(ne)= ro*quad(F2,0,Le)-phie;
  67. disp('---------------------------------------');
  68. fprintf('systeme matriciel pour %2d elements finis\n',ne);
  69. disp(K); disp(F);
  70. U = K\F' ;
  71. x1=0;x2=Le;
  72. x=x1:Le/10:x2; y=T0+(U(1)-T0)*(x-x1)/Le; plot(x,y,'b');
  73. for i=2:ne
  74. x1=(i-1)*Le; x2=i*Le;
  75. x=x1:Le/10:x2; y=U(i-1)+(U(i)-U(i-1))*(x-x1)/Le; plot(x,y,'b');
  76. end
  77. legend('sol. analytique en rouge','Sol. EF en bleu',2);
  78. grid
  79. %----------------------------------------------------------
  80. %----- Methode de Collocation
  81. disp('---------------------------------------');
  82. disp('Methode de Collocation');
  83. n = input('donner le degre n de l''approximation ? [2]: ');
  84. if isempty(n) n=2; end
  85. figure('Name','comparaison Collocation - analytique',...
  86. 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
  87. hold on,
  88. fplot(fa,[0 e],'r');
  89. K=[];F=[];
  90. F(1)=-phie ;
  91. for j=1:n K(1,j)= j ; end
  92. for i=2:n
  93. xi=e*(i-1)/n;
  94. for j=1:n K(i,j)= j*(j-1)*xi^(j-2); end
  95. F(i)= -ro*sin(pi*xi/e)/lamda;
  96. end
  97. disp('---------------------------------------');
  98. fprintf('Methode de collocation pour un polynome de degre %3i\n',n);
  99. disp('systeme matriciel');
  100. disp(K); disp(F);
  101. U = K\F' ;
  102. y =T0;
  103. x=0:e/100:e;
  104. for i=1:n
  105. y=y+U(i)*x.^i;
  106. end
  107. plot(x,y,'b');
  108. legend('sol. analytique en rouge','approx par Collocation en bleu',2);
  109. grid
  110. %----------------------------------------------------------
  111. %----- Methode de la valeur moyenne par sous domaine
  112. disp('---------------------------------------');
  113. disp('Methode de la valeur moyenne');
  114. n = input('donner le degre n de l''approximation ? [2]: ');
  115. if isempty(n) n=2; end
  116. figure('Name','comparaison Valeur moyenne - analytique',...
  117. 'Position',[taille(3)/2.01 taille(4)/2.6 taille(3)/2 taille(4)/2])
  118. hold on,
  119. fplot(fa,[0 e],'r');
  120. nsd=n-1; Ld=e/nsd;
  121. K=[];F=[];
  122. F(1)=-phie ;
  123. for j=1:n K(1,j)= j; end
  124. for i=2:n
  125. e1=(i-2)*Ld; e2=e1+Ld;
  126. for j=1:n K(i,j)= j*(e2^(j-1)-e1^(j-1)); end
  127. F2 = @(x) sin(x*pi/e);
  128. F(i)= -ro*quad(F2,e1,e2)/lamda;
  129. end
  130. disp('---------------------------------------');
  131. fprintf('Methode de la valeur moyenne pour un polynome de degre %3i\n',n);
  132. disp('systeme matriciel');
  133. disp(K); disp(F);
  134. U = K\F' ;
  135. y =T0;
  136. x=0:e/100:e;
  137. for i=1:n
  138. y=y+U(i)*x.^i;
  139. end
  140. plot(x,y,'b');
  141. legend('sol. analytique en rouge','approx par valeurs moyennes en bleu',2);
  142. grid