Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 7.16 KB | None | 0 0
  1. function [T,Y]=EM(u0,a,f,k)
  2. % u0 = condicion inicial;
  3. % a = alpha
  4. % f = numero real de la EDO
  5. % k = numero k, con el que se obtiene el paso h( h=2^k)
  6. % L = hasta donde se aproxima la EDO
  7. L=800;
  8. % c = constante de la EDO
  9. c=0.175;
  10. % h = paso de la aproximacion
  11. h=2^k;
  12. % T = vector que contiene los t con que se evalua la
  13. %funcion solucion de la Edo
  14. T=0:h:L;
  15. %Y= vector que contiene los valores aproximados
  16. % de la EDO evaluados en x
  17. Y=zeros(1,length(T));
  18. % Se añade condicion inicial al vector Y
  19. Y(1)=u0;
  20. % Se establece u0 como primer valor de y
  21. y=u0;
  22. % Se itera hasta llegar a L
  23. for n=1:length(T)-1
  24.     % Se calcula el valor del integrando en el punto medio
  25.     % del intervalo [n*h,(n+1)*h]
  26.     Yy=y+(h/2)*(c*(y-a)*(1-y)+f);  
  27.     % Se calcula y(n+1) valor de la aproximacion de la EDO
  28.     % usando Yy
  29.     y=y+h*(c*(Yy-a)*(1-Yy)+f);
  30.     % Se agrega aproximacion n+1-esimo de y al vector Y
  31.     Y(n+1)=y;
  32. end
  33. end
  34.  
  35. ------------------------------------------------------------------------------------------------------------------------------
  36.  
  37. function e=Error(k,Y)
  38. % Se Hace una aproximacion de la EDO con el metodo
  39. % de Euler Modificado y se guarda la aproximacion
  40. % en el vector y
  41. [t,y]=EM(0.2,0.1,0,k);
  42. % Se almacena el maximo error en la variable e
  43. e=0;
  44. % Se busca el maximo |yref(tn)-y(n)|, para tn=hn<=800
  45. for i=1:length(t)-1
  46.     % Se calcula el yref(tn)
  47.     Yref=Y(i*(2^(10+k)));
  48.     % Se guarda el posible nuevo maximo en A
  49.     A=abs(Yref-y(i));
  50.     % Se verifica que A es el nuevo maximo
  51.     if A>e
  52.         % Se reemplaza e por el valor de A
  53.         e=A;
  54.     end
  55. end
  56.  
  57.  
  58. ----------------------------------------------------------------------------------------------------------------
  59.  
  60. % Se ejecuta el algoritmo Euler Modificado para
  61. % un paso h=2^(-10) y se guarda en T e Y la
  62. % aproximacion obtenida
  63. [T,Y]=EM(0.2,0.1,0,-10);
  64. % Crear un vector de errores para los nueve h(pasos)
  65. E=zeros(1,9);
  66. % Crear un vector para los nueve h (pasos)
  67. H=zeros(1,9);
  68. % Se calcula el error para los nueve pasos
  69. for k=-5:3
  70.     % Se guardan los pasos en H
  71.     H(k+6)=2^k;
  72.     % Se guardan los errores en E
  73.     E(k+6)=Error(k,Y);
  74. end
  75. %empezar a graficar
  76. hold on
  77. %graficar
  78. plot(H,E,'redo')
  79. % Título del grafico
  80. title('Gráfico de error e(h) versus paso h');
  81. % Label del eje x
  82. xlabel('Paso del método de Euler Modificado [u]');
  83. % Label del eje y
  84. ylabel('Error del método de Euler Modificado');
  85. % Terminar de graficar
  86. hold off
  87. % Estimacion del orden del metodo en funcion de
  88. % e(h, p guarda la suma para calcular el promedio
  89. % del orden
  90. p=0;
  91. for k=2:9
  92.     %suma a p la i-esima estimacion del orden
  93.     p=p+(log(E(k)/E(k-1)))/(log(2));
  94. end
  95. %calcula el promedio de los ordenes
  96. p=1.0*p/8.0
  97.  
  98.  
  99. -----------------------------------------------------------------------------------------------
  100.  
  101. function f=minf(C,k)
  102. % c = numero al que se quiere que converja la funcion
  103. % k = numero que determina el paso h (h=2^k)
  104. % e = error con el que se evaluara la convergencia
  105. e=0.0001;
  106. % ad = paso con el que se busca f
  107. ad=0.0001;
  108. % Lo siguiente hace una linea en y=1 para
  109. % mostrar que la aproximacion no converge
  110. w=1:800;
  111. z=ones(1,length(w));
  112. plot(w,z,'green-')
  113. % h= paso del metodo de Euler Modificado
  114. h=(2^k);
  115. % Se elige f inicial 0.0175 pues desde ese punto la EDO
  116. % aproximada no se va a -infinito
  117. f=0;
  118. % Elegimos un un valor de f donde se detendra la busqueda
  119. % para que no sea un loop infinito la busqueda en caso que
  120. % no exista f tal que la Edo converge. Elegimos 4 pues si
  121. % no encontramos f antes tampoco lo encontraremos despues
  122. % pues con 4 la EDO converge a más de 3
  123. while f<=4
  124.     hold on
  125.     % Se hace una aproximacion a la EDO para verificar si con f
  126.     % la aproximacion converge a C, guardamos la aproximacion en
  127.     % Y
  128.     [T,Y]=EM(0,0.1,f,k);
  129.     plot(T,Y,'-')
  130.     xlim([0 800]);
  131.     ylim([-2 2]);
  132.     % La revision de "convergencia" parte de n=1
  133.     n=1;
  134.     % Se utilizan n's hasta el que indexa al penultimo elemento de
  135.     % Y
  136.     while h*n<800
  137.         % Se verifica que el n-esimo termino de Y este "cerca" de
  138.         % C y del siguiente termino
  139.         if (C-e)<=Y(n) && Y(n)<=(C+e) && (Y(n)-e)<=Y(n+1)&& Y(n+1)<=(Y(n)+e)
  140.             % Se verifica que cada elemento que sigue del que cumplió
  141.             % la condicion anterior este "cerca" de C
  142.             while (C-e)<=Y(n) && Y(n)<=(C+e)
  143.                 % si hasta el ultimo termino de Y se culple lo anterior
  144.                 % se concluye que la aproximacion converge a C
  145.                 if n*h==800
  146.                     return
  147.                 end
  148.                 % Se aumenta el indice n para iterar
  149.                 n=n+1;
  150.             end
  151.         end
  152.         % Se aumenta el indice n para iterar
  153.         n=n+1;
  154.     end
  155.     % Si la aproximacion no "converge" buscamos un f aumentado
  156.     % en ad y se verifica si converge a C
  157.     f=f+ad
  158. end
  159. end
  160.  
  161. ------------------------------------------------------------------------------------------------------------
  162. function H=maxh
  163. % h = el paso con el cual se hara la aproximacion
  164. % a la EDO. Se iniciará con h=0.00001
  165. h=0.0001;
  166. % e = error con el cual se verificara que la
  167. % aproximacion "converge" a 1 y no diverge. Se determinó
  168. % que tiende a 1 pues al ejecutar EM con diferentes
  169. % pasos la solucion se acerca a 1
  170. e=3.0001;
  171. % C = valor al que se acercará la aproximacion
  172. C=0;
  173. % ad = paso con el que se busca h
  174. ad=0.001;
  175. % a = constante de la EDO
  176. a=0.1;
  177. % u0 = condicion inicial de la EDO
  178. u0=2*a;
  179. % f = constante de la EDO
  180. f=0;
  181. % Se itera infinitamente hasta encontrar el h.
  182. % Se podria poner un limite a la iteracion, pero
  183. % como así arroja un h es innecesario
  184. while true
  185.     % Dado que a la funcion EM se le ingresa una
  186.     % variable para obtener el paso (h=2^k) se
  187.     % debe despejar k
  188.     k=log(h)/log(2);
  189.     % Se hace una aproximacion a la EDO para verificar si con h
  190.     % la aproximacion es estable, guardamos la aproximacion en
  191.     % Y
  192.     [T,Y]=EM(u0,a,f,k);
  193.     %  La revision de "estabilidad" parte de n=1
  194.     n=1;
  195.     % Se itera la revision de "estabilidad" con los indices de de Y
  196.     while n<=length(T)-1
  197.         % Si el ultimo elemento de Y no esta cerca de C entonces
  198.         % H es el maximo paso donde la aproximacion es estable
  199.         if (Y(n)<(C-e) || (C+e)<Y(n)) && n==length(T)-1
  200.             return
  201.         end
  202.         % Se verifica que cada elemento Y(n), con n entre 1 y length(T)-1
  203.         % este "cerca" de C, si es así entonces la aproximacion esta es
  204.         % estable
  205.         while (C-e)<=Y(n) && Y(n)<=(C+e) && n<=length(T)-1
  206.             % Si se pasa la prueba anterior, hasta n=length(T)-1, la
  207.             % aproximacion es "estable" con h y se tiene que h es el
  208.             % nuevo maximo paso tal que la aproximacion es estable
  209.             if n==length(T)-1
  210.                 % Se guarda h como nuevo posible maximo-h-estable
  211.                 H=h
  212.                 break
  213.             end
  214.             % Se aumenta el indice n en 1 para iterar
  215.             n=n+1;
  216.         end
  217.         % Se aumenta el indie n en 1 para iterar
  218.         n=n+1;
  219.     end
  220.     % Si h es estable, h se aumenta en ad para buscar donde
  221.     % h deja de ser estable
  222.     h=ad+h;
  223. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement