Advertisement
Guest User

lab5

a guest
Nov 25th, 2014
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.78 KB | None | 0 0
  1. clc;
  2. close all;
  3. format long e;
  4.  
  5. %Question 1
  6. %a)
  7.  
  8. % y'(t) = 1 + y(t) / t
  9. % y'(t) - y(t) / t = 1
  10. %
  11. % Facteur intégrant : u(t) = exp(integral(-dt / t))
  12. % = exp(-ln(t))
  13. % = t ^ -1 = 1 / t
  14. % y(t) = t * (integral(u(t) * dt) + c)
  15. % = t (ln(t) + c)
  16. % = t * ln(t) + t*c
  17. % y(1) = 1 * ln(1) + 1 * c
  18. % 1 = 1 * c
  19. % 1 = c
  20. %
  21. % Réponse : y(t) = t * ln(t) + t
  22. % = t (ln(t) + 1)
  23.  
  24. %b)
  25. t0 = 1;
  26. y0 = 1;
  27. h = 0.1;
  28. nbPas = 50;
  29.  
  30. [t,yQ1] = ptmilieu('prob1', t0, y0, h, nbPas);
  31.  
  32. yt = t .* (log(t) +1);
  33.  
  34. figure(1);
  35. plot(t, yQ1, 'b--+', t, yt, 'm-o');
  36. title('Méthode de point milieu vs solution analytique');
  37. xlabel('t');
  38. ylabel('y(t)');
  39. legend('Point Milieu', 'Solution analytique');
  40.  
  41. %c)
  42. yPtMil = [1:51];
  43. for i = 1:51
  44. yPtMil(i) = yQ1(i);
  45. end
  46.  
  47. %Erreur relative max:
  48. errRelMax = max(abs(yPtMil-yt)./yt);
  49. fprintf('Erreur relarive max: %.10e \n',errRelMax)
  50.  
  51.  
  52. eh = 1:1:5;
  53.  
  54. fprintf('\n\n----------------------------------------------------------\n')
  55. fprintf('h \t\t\t\t e(h) \t\t\t\t\t e(h)/e(h/2)\n')
  56. fprintf('----------------------------------------------------------\n')
  57. for i = 1:5
  58.  
  59. h2 = 1/2^(i+1);
  60. nbPas2 = 5 ./h2;
  61. [t,yQ1c] = ptmilieu('prob1', t0, y0, h2, nbPas2);
  62.  
  63. %figure(i+1);
  64. %plot(t, yQ1c, 'b--+');
  65. %title('Méthode de point milieu vs solution analytique');
  66. %xlabel('t');
  67. %ylabel('y(t)');
  68. %legend('Point Milieu');
  69. %fprintf('estimé : %f \n',yQ1c(nbPas2+1))
  70. eh(i) = yQ1c(nbPas2+1)-yt(nbPas+1);
  71.  
  72. if(i > 1)
  73. fprintf('%f \t\t %.10e \t\t %.10e\n',h2,eh(i),eh(i-1)/eh(i))
  74. else
  75. fprintf('%f \t\t %.10e \t\t ----\n',h2,eh(i))
  76. end
  77.  
  78. end
  79. fprintf('----------------------------------------------------------\n')
  80.  
  81. %L'ordre de convergence est donc de 2 puisqu'on a :
  82. % 2^ordre = e(h)/e(h/2) approximativement = 4
  83.  
  84. %Question 2
  85. %a)
  86.  
  87. %y(t) = 5 e^(-7 t)
  88.  
  89.  
  90. %b)
  91. erreurAbs1 = zeros((2/0.5)+1);
  92. erreurAbs2 = zeros((2/0.25)+1);
  93. erreurAbs3 = zeros((2/0.125)+1);
  94.  
  95.  
  96.  
  97. for i = 1:3
  98.  
  99. h3 = 1/(2^i);
  100. nbPas3 = 2 / h3;
  101. [t3, yEuler] = euler('prob2', 0, 5, h3, nbPas3);
  102.  
  103. yAnal = 5 * exp(-7 * t3);
  104.  
  105. yEuler2 = [1:nbPas3+1];
  106. for j = 1:nbPas3+1
  107. yEuler2(j) = yEuler(j);
  108. end
  109.  
  110. switch i
  111. case 1
  112. erreurAbs1 = abs(yAnal-yEuler2);
  113. case 2
  114. erreurAbs2 = abs(yAnal-yEuler2);
  115. case 3
  116. erreurAbs3 = abs(yAnal-yEuler2);
  117. end
  118.  
  119.  
  120.  
  121. figure(i + 1);
  122. plot(t3, yEuler, 'b--+', t3, yAnal, 'm-o');
  123. title(sprintf('Méthode euler h=%f vs solution analytique', h3));
  124. xlabel('t');
  125. ylabel('y(t)');
  126. legend('Euler', 'Solution analytique');
  127.  
  128. end
  129.  
  130. t1b = 0:0.5:2;
  131. t2b = 0:0.25:2;
  132. t3b = 0:0.125:2;
  133.  
  134. figure(5);
  135. plot(t1b, erreurAbs1, 'b--+', t2b, erreurAbs2, 'm--*', t3b, erreurAbs3, 'k--x');
  136. title('Erreurs absolues dans le calcul par Euler selon le pas h');
  137. xlabel('t');
  138. ylabel('Erreur absolue');
  139. legend('h=0.5', 'h=0.25', 'h=0.125');
  140.  
  141. %c)
  142.  
  143. %Il faut que le pas soit le plus près possible de 0 tout en restant loin de
  144. %l'erreur machine.
  145.  
  146. a = 1;
  147. h_exp = 0.25; %on sait de par le point b) qu'avec 0.125 la solution d'euler tend vers 0
  148. %on sait également qu'avec 0.25 euler ne tend plus vers 0 (de facon stritement décroissante)
  149. fprintf('\n----------------------------------------------------------\n')
  150. fprintf('Vérification de la décroissance selon les h\n');
  151. fprintf('----------------------------------------------------------\n')
  152. for h = 0.125:0.01:0.25
  153. nbpas = 2/h;
  154. [t, y] = euler('prob2', t0, y0, h, nbpas);
  155. yAnal = 5 * exp(-7 * t);
  156.  
  157. %on vérifie si trois points consécutifs décroissent
  158. decroissant = 1;
  159. if(y(1) - y(2) < 0)
  160. decroissant = 0;
  161. end
  162.  
  163. if(y(2) - y(3) < 0)
  164. decroissant = 0;
  165. end
  166.  
  167. %On peut également vérifier si euler converge vers la solution analytique
  168. %en regardant si l'erreur relative rétressie
  169.  
  170. retressie = 1;
  171. for j = 1:nbpas
  172.  
  173. errRel = (y(j) - yAnal(j))/yAnal(j);
  174. errRelNext = (y(j+1) - yAnal(j+1))/yAnal(j+1);
  175.  
  176. if(errRel < errRelNext)
  177. retressie = 0;
  178. end
  179.  
  180. end
  181.  
  182. if(retressie == 1)
  183. fprintf('h = %f\tconverge\n',h);
  184. else
  185. fprintf('h = %f\tne converge pas\n',h);
  186. end
  187.  
  188. if(decroissant == 1)
  189. fprintf('\t\t\t\tstritement décroissant\n\n',h);
  190. else
  191. fprintf('\t\t\t\toscille\n\n',h);
  192. end
  193. end
  194.  
  195. %d(
  196. %On semble avoir euler explicite alors on doit référer à la page 46 (49)
  197. %des notes de cours comlémentaires
  198.  
  199. %Par la méthode donnée à cette page, nous avons pu démontrer que la
  200. %méthode d'Euler est stable pour un h se situant entre 0 et 2/7
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement