Sunteți pe pagina 1din 4

Universidad de Concepción

Facultad de Ciencias Físicas y Matemáticas


Departamento de Ingeniería Matemática
521230 Cálculo Numérico
EJEMPLO DESARROLLADO DEL MÉTODO DE SHOOTING

LEONARDO FIGUEROA

1. Problema de valores de contorno


Consideremos el problema de valores de contorno (PVC)
  
 y 00 (x) = −4 cos(2x) − 1 (y 0 (x))2 + 50 − 1 y(x), x ∈ (5, 27),

x x2

(1)
 1
y(5) = , y(27) = 2.


20
El método de shooting consiste en sustituir la condición de contorno derecha del
PVC (1) con una condición artificial sobre la derivada de la función incógnita en el
extremo izquierdo del intervalo de interés.
  
00 1 0 2 50
 y (x) = −4 cos(2x) − (y (x)) + − 1 y(x), x ∈ (5, 27),


x x2
(2)
 y(5) = 1 , y 0 (5) = z.


20
Notemos que (2) resulta ser un problema de valores iniciales (PVI) de orden 2. Como
no sabemos cuánto vale la derivada de nuestra función incógnita en x = 5, en este
PVI hemos puesto un valor z que deberá ser determinado. El PVI (2) tiene una
solución que es en principio distinta para cada z; enfatizamos aquella dependencia
denotando por yz la solución de (2).
Para recuperar una solución de (1), buscaremos un z tal que el yz que resulte de
(2) satisfaga la condición de contorno que falta; esto es, yz (27) = 2. Equivalente-
mente,
E(z) := yz (27) − 2 = 0. (3)
Para aproximar una solución de la ecuación nolineal (3) podemos aplicar los méto-
dos vistos en clase de bisección o de la secante1 o bien la rutina fzero de Octave.
Sin embargo, todos aquellos métodos requieren evaluar la función cuya raíz se desea
aproximar. Para cada z en el que sea necesario evaluar E(z), se requerirá evaluar
yz (27), lo que a su vez requiere resolver (en forma aproximada) el PVI (2).

2. Resolución del PVI


Para aproximar el PVI escalar (2) mediante las rutinas disponibles en Octave,
debemos transformarlo en un PVI vectorial de primer orden. Definimos entonces
la función a valores vectoriales w (preferimos no usar z para no confundirlo con el
parámetro z) por  
y(x)
w(x) := 0 . (4)
y (x)

Fecha: 4 de junio de 2019.


1El método de Newton–Raphson es también aplicable si somos capaces de evaluar la derivada
de E. Hay formas de aproximarla, pero no lo haremos aquí.
1
2 LEONARDO FIGUEROA

Derivando w,

y 0 (x)
 0   
0 y (x) (2)
w (x) = 00 = 1 0 50

y (x) −4 cos(2x) − x y (x) + x2 − 1 y(x)
 
(4) w2 (x)
= =: f (x, w(x)). (5)
−4 cos(2x) − x1 w2 (x)2 + 50

x2 − 1 w1 (x)
Evaluando w en x = 5.
 1
y(5) (2) 20
(4)
w(5) = 0 = =: w0 . (6)
y (5) z
En resumen, w satisface el PVI vectorial de primer orden
( 0
w (x) = f (x, w(x)), x ∈ (5, 27),
(7)
w(5) = w0 ,

al cual podemos aplicar cualquiera de los métodos de resolución de PVI vistos en


clase o, sencillamente, introducir a las rutinas disponibles en Octave. Notar que la
solución del PVI (7) depende del parámetro z que aparece en su condición inicial
(cf. (6)), por lo que la denotaremos por wz .
Nosotros resolveremos el PVI (7) con dos propósitos: Para graficar soluciones y
para evaluar E(z). Entonces implementamos una función que recibe un z, aproxima
la solución del PVI usando la rutina ode45 de Octave2 y devuelve las salidas de
ode45; a saber, un vector con puntos donde Octave decidió conviene aproximar la
solución —que siempre incluye los extremos del intervalo de interés— y una matriz
con las aproximaciones de wz,1 (primera componente de wz ) en su primera columna
y las aproximaciones de wz,2 (segunda componente de wz ) en su segunda columna.
Esto está implementado en la función resuelve_PVI.m, que está reproducida en el
apéndice A.

3. Resolución de la ecuación nolineal


Ahora que somos capaces de obtener soluciones aproximadas del PVI (7) —
equivalentemente, del PVI (2)—, podemos evaluar E de (3) en un z mediante el
siguiente procedimiento:
1. Resolvemos (7) con ese z usando resuelve_PVI.
2. Recogemos el último elemento de la primera columna de su segunda salida,
que corresponde a wz,1 (27) = yz (27).
3. A ese número le restamos 2.
Esto está implementado en la función E.m, que está reproducida en el apéndice A.
Para resolver la ecuación (3) lo más fácil es usar la rutina fzero de Octave. Sin
embargo, para efectos de ilustración, usaremos el método de la secante inicializado
con z0 = −0.3 y z1 = 1.0, obteniendo sucesivas aproximaciones zk y deteniéndonos
cuando |E(zk )| < 10−5 . Esto está implementado en el rutero shooting.m, que
también está reproducido en el apéndice A.
La solución obtenida aparece en la figura 1.

2Versiones antiguas de Octave podrían no tener ode45. Los códigos de este documento fueron
corridos en la versión 4.2.2.
EJEMPLO DE SHOOTING 3

y (x)
-0.3
y (x)
1
y (x)
-0.0047805
2
0.05

5 27
x
Figura 1. Soluciones del PVI (2) con distintos z. Con el z que sat-
isface (3) se obtiene una aproximación del PVC (1) (línea continua
negra).

Apéndice A. Códigos fuente


resuelve_PVI.m
1 function [x,w] = resuelve_PVI(z)
2

3 f = @(x,w) [w(2); -4*cos(2*x) - 1/x*w(2)^2 + (50/x^2-1)*w(1)];


4 w0 = [1/20; z];
5 % Requerimos mayor precisión
6 options = odeset(’AbsTol’,1e-12,’RelTol’,1e-9);
7 [x,w] = ode45(f, [5 27], w0, options);

E.m
1 function out = E(z)
2
3 [x,w] = resuelve_PVI(z);
4 out = w(end,1) - 2;

shooting.m
1 z0 = -0.3;
2 z1 = 1.0;
3 max_iter = 20;
4 tol = 1e-5;
4 LEONARDO FIGUEROA

6 residual = inf;
7 iter = 0;
8 z_old = z0;
9 z_new = z1;
10 E_old = E(z_old);
11 E_new = E(z_new);
12 while residual >= tol && iter < max_iter
13 finite_difference = (E_new-E_old)/(z_new-z_old);
14 z_old = z_new; % El que antes era nuevo ahora es viejo
15 E_old = E_new;
16 z_new = z_old - E_old/finite_difference; % Nuevo nuevo
17 E_new = E(z_new);
18 residual = abs(E_new);
19 iter = iter+1;
20 end
21
22 % Resoluciones adicionales del PVI vectorial para graficación
23 [x0,w0] = resuelve_PVI(z0);
24 [x1,w1] = resuelve_PVI(z1);
25 [xn,wn] = resuelve_PVI(z_new);
26
27 % Graficación
28 f = figure;
29 plot(...
30 x0,w0(:,1),’b--’,’LineWidth’,2,...
31 x1,w1(:,1),’r--’,’LineWidth’,2,...
32 xn,wn(:,1),’k-’,’LineWidth’,2);
33 set(gca,’xlim’,[3 28],’xtick’,[5 27],’ytick’,[1/20
,→ 2],’FontSize’,18,’gridcolor’,[.5 .5 .5],’gridlinestyle’,’:’)
34 xlabel(’x’);
35 grid on
36 legend({[’y_{’ num2str(z0) ’}(x)’],[’y_{’ num2str(z1)
,→ ’}(x)’],[’y_{’ num2str(z_new) ’}(x)’]},’location’,’northwest’)
37 print(f,’shooting.eps’,’-color’)

S-ar putea să vă placă și