Advertisement
Guest User

Untitled

a guest
Oct 24th, 2014
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.12 KB | None | 0 0
  1. % -------------------------------------------------------------------------
  2. %
  3. % MATLAB for DUMMIES 13-14
  4. % Exercice 2
  5. %
  6. % Solution detaillee
  7. %  Vincent Legat, Leopold Cambier, Victor Colognesi, Corentin Damman,
  8. %  Francois Heremans, Benoit Legat, Gauthier Limpens, Lucas Nyssens,
  9. %  Ignace Ransquin, Gaetan Ransonnet, Alexandre Sanchez Falcon,
  10. %  Adrien Scheuer, Harold Taeter, Joachim Van Verdeghem, Paul-Emile Bernard
  11. %
  12. % -------------------------------------------------------------------------
  13. %
  14. function soluce2()
  15.  
  16. %
  17. % -1- Test propose dans l'enonce !
  18. %     Attention, le test n'etait qu'un cas particulier des specifications
  19. %     de la fonction demandee :-)
  20. %
  21. %     En particulier, rien dans l'enonce prevoyait que T = 1:n+1 !
  22. %     Il fallait donc que votre fonction soit capable de traiter un
  23. %     vecteur T tout-a-fait general : c'est loin d'etre toujours le cas.
  24. %
  25. %     La fonction de test ne permettait pas non plus de verifier que la
  26. %     longueur du vecteur de sortie etait egale au vecteur d'entree "t"
  27. %     Pas mal de programmes echouent sur ce test aussi.
  28. %
  29. %
  30.  
  31. close all; clear all; figure;
  32. axis([0 10 0 10]); axis off; hold on;
  33. X = []; Y = [];  n = 0;
  34. disp('Left mouse button picks points.')
  35. disp('Right mouse button picks last point.')
  36. button = 1;
  37. while button == 1
  38.     n = n + 1;
  39.     [X(n),Y(n),button] = ginput(1);
  40.     plot(X(n),Y(n),'r.','Markersize',25);
  41. end
  42.  
  43. X = [X X(1)];
  44. Y = [Y Y(1)];
  45. dX = [X(2)-X(n) X(3:n+1)-X(1:n-1) X(2)-X(n)]/2;
  46. dY = [Y(2)-Y(n) Y(3:n+1)-Y(1:n-1) Y(2)-Y(n)]/2;
  47.  
  48.  
  49. T = 1:n+1;
  50. t = 1:0.001:n+1;
  51. plot(hermite(t,T,X,dX),hermite(t,T,Y,dY),'b-','LineWidth',2);  
  52.  
  53. %
  54. % -2- Le test qu'on a realise pour corriger votre programme
  55. %     Eh oui, souvent cela ne fonctionne pas pour pas mal d'etudiants.
  56. %     Nous, on pensait naivement que le devoir etait facile : beh non :-)
  57. %
  58.  
  59. n = 10; m = 1000;
  60. T = [0:3*pi/(2*(n+1)):3*pi/2 2*pi];
  61. t = linspace(T(1),T(end), m);
  62. X  =  cos(T); Y  =  sin(T);
  63. dX = -sin(T); dY =  cos(T);
  64. figure;
  65. plot(X,Y,'r.','Markersize',25); hold on;
  66. plot(hermite(t,T,X,dX),hermite(t,T,Y,dY),'b-','LineWidth',2);
  67. axis([-1.5 1.5 -1.5 1.5 ]); axis equal;
  68.  
  69.  
  70. end
  71.  
  72. %
  73. %  Il est utile d'observer qu'il existe une difference de rapidite
  74. %  non negligeable entre "s.*(s+1)" et "s.^2+s" !
  75. %  L'implementation efficace evite donc de faire appel a des puissances.
  76. %  Voila, voila : pourquoi il faut factoriser l'expression :-)
  77. %
  78. %  Pour etre plus ou moins rapide, il faut essayer d'eviter des
  79. %  boucles sur la longueur du vecteur "x"...
  80. %  Eviter toute boucle n'est pas possible a mon avis en raison de la
  81. %  detection de l'intervalle adequat :-)
  82. %
  83.  
  84. function [uh] = hermite(x,X,U,dU)
  85. %
  86. % -1- Calcul des coefficients de m-1 polynomes sur chaque intervalle
  87. %
  88. m = length(X);
  89. h = diff(X);
  90. DU = diff(U)./h;
  91. A  = (  3*DU - 2*dU(1:m-1) - dU(2:m))./h;
  92. B  = (- 2*DU + dU(1:m-1)   + dU(2:m))./(h.*h);
  93. %
  94. % -2- Detection du polynome a choisir pour chaque
  95. %     valeur x : i tel que  X(i) <= x < X(i+1)
  96. %
  97. i = ones(size(x));
  98. for j = 2:m-1
  99.    i(X(j) <= x) = j;
  100. end
  101. %
  102. %  -3- Calcul de l'interpolant
  103. %
  104. s = x - X(i);
  105. uh = U(i) + s.*(dU(i) + s.*(A(i) + s.*B(i)));
  106. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement