Advertisement
tomasfdel

Métodos Práctica 3

Sep 8th, 2017
440
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scilab 7.27 KB | None | 0 0
  1. // CONSULTAR EJERCICIOS 6, 7-B, 8
  2. // COMPLETAR EL 7-B
  3. // HACER EL 8
  4. // ¿QUÉ SERÍA "RESOLVER EL SISTEMA" EN EL 10?
  5.  
  6.  
  7. //Ejercicio 1
  8. /// 1.875 ---> f(1.875) = 0.0004306
  9. /// 4.694 ---> f(4.694) = -0.0048884
  10. /// 7.855 ---> f(7.855) = -0.3129768
  11.  
  12.  
  13. //Ejercicio 2
  14. function c = metodoBiseccion(funcion, a, b, tolerancia)
  15.     c = (a+b)/2
  16.     condiciones = [abs(b-c) >= tolerancia, funcion(c) ~= 0]
  17.     while(or(condiciones))
  18.         if(funcion(a) * funcion(c) < 0)
  19.             b = c
  20.         else
  21.             a = c
  22.         end;
  23.         c = (a+b)/2
  24.         condiciones = [abs(b-c) >= tolerancia, funcion(c) ~= 0]
  25.     end;
  26. endfunction
  27.  
  28. //Apartado A, nos fijamos gráficamente las raíces.
  29. //Sabemos que una raíz es 0, no es necesario aproximarla.
  30. metodoBiseccion(funcion1, -1, 0.5, 0.01)
  31.  ans  =
  32.    0.0019531
  33. -1-> metodoBiseccion(funcion1, 0.5, 2, 0.01)
  34.  ans  =
  35.    1.4082031
  36. -1-> funcion1(0.0019531)
  37.  ans  =
  38.   -0.0019512
  39. -1-> funcion1(1.4082031)
  40.  ans  =
  41.    0.0047072
  42.  
  43. //Apartado B
  44.  
  45. -1-> metodoBiseccion(funcion2,-10,10,0.01)
  46.  ans  =
  47.    0.8105469
  48. -1-> funcion2(0.8105469)
  49.  ans  =
  50.   -0.0129839
  51. //Vemos que es muy poca precisión.
  52. -1-> metodoBiseccion(funcion2,-20,-6,0.01)
  53.  ans  =
  54.   -8.6181641
  55. -1-> funcion2(-8.6181641)
  56.  ans  =
  57.   -14.780538
  58. //Now THAT'S better.
  59. -1-> metodoBiseccion(funcion2,-20,-6,0.0001)
  60.  ans  =
  61.   -8.6131973
  62. -1-> funcion2(-8.6131973)
  63.  ans  =
  64.   -0.0820772
  65.  
  66.  
  67. //Apartado C
  68. //Sabemos que 1 es raíz de la función.
  69. --> metodoBiseccion(funcion3, 0.01, 0.5, 0.01)
  70.  ans  =
  71.    0.1401563
  72.  
  73.  
  74. //Ejercicio 3
  75. function c = metodoSecante(funcion, a, b, tolerancia)
  76.     c = b - funcion(b) * (b-a)/(funcion(b)-funcion(a))
  77.     condiciones = [abs(b-c) >= tolerancia, funcion(c) ~= 0]
  78.     while(and(condiciones))
  79.         a = b
  80.         b = c
  81.         c = b - funcion(b) * (b-a)/(funcion(b)-funcion(a))
  82.         condiciones = [abs(b-c) >= tolerancia, funcion(c) ~= 0]
  83.     end;
  84. endfunction
  85.  
  86. --> metodoSecante(funcion4, 2, 5, 0.001)
  87.  ans  =
  88.    1.9337549
  89. --> funcion4(ans)
  90.  ans  =
  91.    0.0000015
  92.  
  93. //Ejercicio 4
  94. // Converge a un valor cercano a 0.7390668, que es la raíz de la ecuación x - cos(x) = 0.
  95. // Estamos aplicando una iteración de punto fijo para resolver eso.
  96. // El número es 4/17 de pi.
  97.  
  98.  
  99. //Ejercicio 5
  100. // Puede verse que la ecuación posee dos raíces: En x = 1 y x = 2.
  101. // Vemos que f(x) = 2^(x-1) es continua con derivada de primer orden continua.
  102. // En el intervalo [0,1], la derivada está por debajo de 1 para todos los valores, entonces hay una única raíz y converge. (Vale por el teorema)
  103. // En el intervalo (-inf, 0), la imagen cae en [0,1] por lo que converge a 1.
  104. // Para el (2,+inf) la función 2^x es mayor a 2x, y crece más rápido. Si convergiera a algo mayor a 2, tendría que haber una tercera raíz, pero las funciones no se vuelven a cruzar en el intervalo.
  105. // Para el (1,2), la iteración es decreciente pues 2^x es menor a 2x. Además, la sucesión está acotada inferiormente por 2^0 = 1, por lo que converge. Luego, como las dos raíces son únicas, y la función no puede converger a 2,k converge a 1.
  106.  
  107.  
  108. // Ejercicio 6
  109. // VER LO QUE ESCRIBISTE CON RABASEDAS
  110. // x^2 - 5 = 0 ==> x  = x + 1(x^2 - 5)
  111. // Con x = -sqrt(5), vemos que x = x + c (x**2 − 5) para cualquier c. Es decir, para garantizar la convergencia, deberíamos tratar de encontrar un c que nos permita garantizas la convergencia a -sqrt(5).
  112. // No sé cómo justificar el tema de a <= x <= b ==> a <= g(x) <= b, pero me fijé que al hacer el estudio de la derivada de la función, para que la derivada esté entre -1 y 1, un c = 1/3 hace que la condición valga para (-3,0). Si agarro -2.9, converge a -sqrt(5).
  113.  
  114.  
  115. // Ejercicio 7
  116. function d2 = ejercicio7(inicio,tolerancia)
  117.     g = 9.8
  118.     h = 4
  119.     T = 5
  120.     w = 2 *%pi / T
  121.     d1 = inicio
  122.     d2 = w**2 /(g*tanh(h*d1))
  123.     while abs(d1 - d2) > tolerancia
  124.         d1 = d2
  125.         d2 = w**2 /(g*tanh(h*d1))
  126.     end
  127. endfunction
  128.  
  129. function z = metodoNewton(funcion, inicio, tolerancia)
  130.     z1 = inicio
  131.     z = z1 - funcion(z1)/numderivative(funcion, z1, [], 4)
  132.     condiciones =[abs(z-z1) > tolerancia, funcion(z)~= 0]
  133.     while and(condiciones)
  134.         z1 = z
  135.         z = z1 - funcion(z1)/numderivative(funcion, z1, [], 4)
  136.         condiciones =[abs(z-z1) > tolerancia, funcion(z)~= 0]
  137.     end
  138. endfunction
  139.  
  140.  
  141.  
  142. // Ejercicio 9
  143. function z = metodoNewtonEspecial(F, vectorInicial)
  144.     z1 = vectorInicial
  145.     z = z1 - numderivative(F,z1)\F(z1)
  146.     for i = 2:5
  147.         z1 = z
  148.         z = z1 - numderivative(F,z1)\F(z1)
  149.     end
  150. endfunction
  151.  
  152. --> deff("z = funcion1(x)","z = 1 + x(1)**2 + x(2)**2 + exp(x(1)) * cos(x(2))")
  153. --> deff("z = funcion2(x,y)","z = 2*x(1)*x(2) + exp(x(1)) * sin(x(2))")
  154. --> deff("z = F(x)", "z = [funcion1(x);funcion2(x)]")
  155. --> metodoNewtonEspecial(F, [-1; 4])
  156.  ans  =
  157.   -1.5317081
  158.   -0.4822167
  159. --> F(ans)
  160.  ans  =
  161.    3.7701792
  162.    1.3769846
  163.  
  164.  
  165.  
  166. // Ejercicio 10
  167. function z = metodoNewtonSistema(F, vectorInicial, tolerancia)
  168.     z1 = vectorInicial
  169.     z = z1 - numderivative(F,z1)\F(z1)
  170.     condiciones =[norm(z-z1, 'inf') > tolerancia, or(F(z)~= 0)]
  171.     while(and(condiciones))
  172.         z1 = z
  173.         z = z1 - numderivative(F,z1)\F(z1)
  174.         condiciones =[norm(z-z1, 'inf') > tolerancia, or(F(z)~= 0)]
  175.     end
  176. endfunction
  177.  
  178.  
  179.  
  180.  
  181.  
  182. // Ejercicio 11
  183. // Calculé las derivadas a mano. Apartado A.
  184. function z = metodoNewtonEj11(F, vectorInicial, tolerancia)
  185.     z1 = vectorInicial
  186.     z = z1 - numderivative(F,z1)\F(z1)
  187.     while(norm(z-z1, 2) > tolerancia)
  188.         z1 = z
  189.         z = z1 - numderivative(F,z1)\F(z1)
  190.     end
  191. endfunction
  192.  
  193. --> deff("z = derivadaX1 (x)", "z = 2 + 4 * x(1) * exp(2 * x(1) **2 + x(2) **2)")
  194. --> deff("z = derivadaX2 (x)", "z = 6 * x(2) + 2 * x(2) * exp(2 * x(1) **2 + x(2) **2)")
  195. --> deff("z = ejercicio11(x)", "z = [derivadaX1(x); derivadaX2(x)]")
  196. --> metodoNewtonEj11(ejercicio11, [1; 1], 10**-12)
  197.  ans  =
  198.   -0.3765446
  199.   -2.009D-27
  200. --> ejercicio11(ans)
  201.  ans  =
  202.    4.441D-16
  203.   -1.739D-26
  204.  
  205. // De nuevo las calculé a mano.
  206. --> deff("z = derivada2X1 (x)", "z = 4 * exp(2 * x(1) **2 + x(2) **2) + 16 * x(1)**2 * exp(2 * x(1) **2 + x(2) **2)")
  207. --> deff("z = derivadaX1X2 (x)", "z = 8 * x(1) * x(2) * exp(2 * x(1) **2 + x(2) **2)")
  208. --> deff("z = derivada2X2 (x)", "z = 6 + 2 * exp(2 * x(1) **2 + x(2) **2) + 4 * x(2)**2 * exp(2 * x(1) **2 + x(2) **2)")
  209. --> deff("z = Hessiana(x)", "z = [derivada2X1(x) derivadaX1X2(x); derivadaX1X2(x) derivada2X2(x)]")
  210. --> metodoNewtonEj11(ejercicio11, [1; 1], 10**-12)
  211.  ans  =
  212.   -0.3765446
  213.   -2.009D-27
  214. --> Hessiana(ans)
  215.  ans  =
  216.    8.3238127   0.      
  217.    0.          8.655728
  218. //Vemos que es definida positiva. Great success.
  219.  
  220.  
  221.  
  222.  
  223. //Ejercicio 12
  224. // Apartado A.
  225. function z = metodoNewtonSistema(F, vectorInicial, tolerancia)
  226.     z1 = vectorInicial
  227.     z = z1 - numderivative(F,z1)\F(z1)
  228.     condiciones =[norm(z-z1, 'inf') > tolerancia, or(F(z)~= 0)]
  229.     while(and(condiciones))
  230.         z1 = z
  231.         z = z1 - numderivative(F,z1)\F(z1)
  232.         condiciones =[norm(z-z1, 'inf') > tolerancia, or(F(z)~= 0)]
  233.     end
  234. endfunction
  235.  
  236. --> deff("z = ecuacion1(x)", "z = x(1) * exp(x(2)) + x(3) - 10")
  237. --> deff("z = ecuacion2(x)", "z = x(1) * exp(2 * x(2)) + 2 * x(3) - 12")
  238. --> deff("z = ecuacion3(x)", "z = x(1) * exp(3 * x(2)) + 3 * x(3) - 15")
  239. --> deff("z = sistema(x)", "z = [ecuacion1(x); ecuacion2(x); ecuacion3(x)]")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement