Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Solución de ecuaciones
diferenciales con condiciones en los
extremos
En las páginas anteriores, hemos resuelto ecuaciones diferenciales en el intervalo [a,b]
2
d y dy
= f (x, y, ), a ≤ x ≤ b
2
dx dx
dy ∣
y(a), ∣
dx ∣
x=a
dy
= f (x, y)
dx
en el intervalo [a,b], bajo las condiciones de contorno especificadas por una función
g(y(a),y(b))=0. ya e yb son vectores de dos componentes ya(1), ya(2); yb(1), yb(2)
y(a) y(b)
ya = [ dy ], yb = [ dy ]
∣ ∣
dx ∣ dx ∣
x=a x=b
ya(1) − α
[ ]
ya(2) − β
para una función y(x) definida en el intervalo [a,b] cuyos extremos tienen valores fijos α y β.
Pero también podrían estar fijados los valores de las pendientes de la función en dichos puntos
dy
∣
⎡ ya(2) − ∣ ⎤
dx
x=a
⎢ ⎥
dy
∣
⎣ yb(2) − ⎦
dx ∣
x=b
ya(1) − α
[ dy ]
∣
yb(2) −
dx ∣
x=b
...
xIni=linspace(a,b,5);
solinit = bvpinit(xIni, @guess);
function g = guess(x)
g = [sin(x), cos(x)];
end
Se utiliza la función deval y el valor sol devuelto del procedimiento bvp4c para evaluar y
representar la solución para valores x del intervalo [a,b]
Ejemplos
Ejemplo 1
Vamos a integrar la ecuación diferencial con las condiciones en los extremos a=0, b=4
2
d y y(0) = 0
+ |y| = 0, {
2
dx y(4) = −2
function dx = odefun(~,x)
dx = [x(2), -abs(x(1))];
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 2/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
end
Con el valor devuelto sol, y utilizando la función deval, representamos la solución y(x) en el
intervalo [a,b]
...
x=linspace(0,4); %100 puntos, por defecto
y = deval(sol,x);
plot(x,y(1,:));
...
Reunimos las porciones de código, para crear la función ecuacion_diferencial_1 que contiene
todo el código, incluidas las subfunciones
function ecuacion_diferencial_1
solinit = bvpinit(linspace(0,4,5), [1,0]); %primera aproximación
sol1 = bvp4c(@odefun, @bcfun, solinit);
solinit = bvpinit(linspace(0,4,5), [-1,0]); %segunda aproximación
sol2 = bvp4c(@odefun, @bcfun, solinit);
x=linspace(0,4);
y = deval(sol1,x);
hold on
plot(x,y(1,:));
y = deval(sol2,x);
plot(x,y(1,:));
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
%ecuación diferencial
function dx = odefun(~,x)
dx = [x(2), -abs(x(1))];
end
%condiciones en los extremos
function res = bcfun(xa,xb)
res = [xa(1), xb(1)+2];
end
end
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 3/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
Ejemplo 2
Sea la ecuación diferencial, con las condiciones en los extremos a=1, b=2.5
2 y(1) = 1
d y dy
x + + 2x = 0, { dy
2 ∣
dx dx = −1
dx ∣
x=2.5
function ecuacion_diferencial_8
solinit = bvpinit(linspace(1,2.5,5), [0.1,0]);
sol = bvp4c(@f, @extremos, solinit);
t=linspace(1,2.5);
x = deval(sol,t);
plot(t,x(1,:));
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
disp(x(2,end)) %pendiente en x=2.5
%ecuación diferencial
function dx = f(t,x)
dx = [x(2), -x(2)/t-2];
end
%condiciones en los extremos
function res = extremos(xa,xb)
res = [xa(1)-1, xb(2)+1];
end
end
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 4/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
>> ecuacion_diferencial_8
-1
Aproximaciones sucesivas
Un problema típico de cinemática es el de apuntar un cañón para que el proyectil disparado
impacte en el blanco. Tenemos dos posiciones la de disparo y la del blanco. Elegimos un
ángulo de tiro, si el alcance es mayor o menor que la distancia desde la posición de disparo al
blanco, cambiamos el ángulo de tiro y así, mediante aproximaciones sucesivas obtenemos el
ángulo de disparo que hace que el proyectil impacte en el blanco.
y(a) = α, y(b) = β
dy
∣
es similar, se trata de elegir el valor adecuado ∣
= s , de la derivada primera en x=a
dx
x=a
(tangente del ángulo de tiro), para que al resolver la ecuación diferencial en el intervalo [a,b],
obtengamos y(b)=β (acertar en el blanco).
Ecuaciones lineales
Supongamos que la ecuación diferencial con las condiciones en los extremos
2
d y dy
2
+ p(x) + q(x)y + r(x) = 0
dx dx
y(a) = α, y(b) = β
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 5/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
dy ∣
y(a) = α, ∣ = s1
dx ∣
x=a
dy ∣
y(a) = α, ∣ = s2
dx ∣
x=a
c1 y1 (x) + c2 y2 (x)
y(x) =
c1 + c2
2 2
d y1 dy1 d y2 dy2
c1 ( + p(x) + q(x)y1 + r(x)) + c2 ( + p(x) + q(x)y2 + r(x)) = 0
2 dx 2 dx
dx dx
En x=b se cumple
c1 y1 (b)+c2 y2 (b)
y(b) =
c1 +c2
c1 β1 +c2 β2
β =
c1 +c2
En x=a se cumple
c1 y'1 (a)+c2 y'2 (a) dy
y'(a) = , y'(x) =
c1 +c2 dx
c1 s2 +c2 s2
s =
c1 +c2
β(s2 − s1 ) + s1 β2 − s2 β1
s =
β2 − β1
Ejemplo
Resolvamos la ecuación diferencial, con las condiciones en los extremos que se especifican
2
d y x
2
− (1 − )y − x = 0
dx 5
y(1) = 2, y(3) = −1
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 6/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
dy
∣
para s1 =
∣
= −1.5 , obtenemos, β1=4.7876
dx
x=a
dy
para s2 =
∣
∣
= −3 , obtenemos, β2=0.4360
dx x=a
s=(beta*(s1-s2)-s1*beta_2+s2*beta_1)/(beta_1-beta_2);
[t,x]=ode45(f,[1,3],[alfa,s]);
plot(t, x(:,1))
hold off
legend('-1.5','-3.0','s','location','northwest')
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 7/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
function ecuacion_diferencial_3
solinit = bvpinit(linspace(1,3,5), [0,-1]);
sol = bvp4c(@f, @extremos, solinit);
t=linspace(1,3);
x = deval(sol,t);
plot(t,x(1,:));
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
%ecuación diferencial
function dx = f(t,x)
dx = [x(2), (1-t/5)*x(1)+t];
end
%condiciones en los extremos
function res = extremos(xa,xb)
res = [xa(1)-2, xb(1)+1];
end
end
y(0) = 4, y(1) = 1
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 8/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
Vemos que la función F(s) se anula para dos valores de s, el primero próximo a s=-35.8 y el
segundo próximo a s=-8.1
Aplicamos el procedimiento del punto medio para obtener la primera raíz, que se encuentra en
el intervalo (-40,-20)
-35.8496
La segunda raíz se encuentra en el intervalo (-15,-5), cambiamos los valores de las variables a
y b, obteniendo
-8.0005
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 10/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
function ecuacion_diferencial_4
solinit = bvpinit(linspace(0,1,5), [-10,1]);
sol1 = bvp4c(@f, @extremos, solinit);
solinit = bvpinit(linspace(0,1,5), [4,1]);
sol2 = bvp4c(@f, @extremos, solinit);
t=linspace(0,1);
x = deval(sol1,t);
hold on
plot(t,x(1,:));
x = deval(sol2,t);
plot(t,x(1,:));
hold off
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
%ecuación diferencial
function dx = f(~,x)
dx = [x(2), 3*x(1)^2/2];
end
%condiciones en los extremos
function res = extremos(xa,xb)
res = [xa(1)-4, xb(1)-1];
end
end
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 11/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
Reemplazamos las derivadas por diferencias finitas utilizando el desarrollo en serie de Taylor
de una función alrededor de xi
2 2
dy ∣ (x − xi ) d y ∣
y(x) = y(xi ) + (x − xi ) ∣ + ∣ + ....
2
dx ∣ 2! dx ∣
xi xi
Si x=xi+1=xi+h
2 2 3 3
dy ∣ h d y ∣ h d y ∣
y(xi+1 ) = y(xi ) + h ∣ + ∣ + ∣ + ...
2 3
dx ∣ 2 dx ∣ 6 dx ∣
xi xi xi
Si x=xi-1=xi-h
2 2 3 3
dy ∣ h d y ∣ h d y ∣
y(xi−1 ) = y(xi ) − h ∣ + ∣ − ∣ + ...
2 2 3
dx ∣ dx ∣ 6 dx ∣
xi xi xi
dy y(xi+1 )−y(xi−1 )
∣
≈
dx ∣ 2h
xi
2
d y ∣ y(xi+1 )+y(xi−1 )−2y(xi )
≈
dx 2 ∣ h2
xi
y(a) = α, y(b) = β
y0 = α
yN = β
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 12/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
h h
2 2
(1 + pi ) yi+1 + (qi h − 2) yi + (1 − pi ) yi−1 + h ri = 0, i = 1,2...N − 1
2 2
En forma matricial
2 h
2 h
q1 h − 2 1 + p1 0 0 0 0 ... 0 0 0 −h r1 − (1 − p1 ) α
⎛ 2 ⎞ y1 2
⎛ ⎞
2
⎟⎛ ⎞
h h
2
⎜ 1 − p2 q2 h − 2 1 + p2 0 0 0 ... 0 0 0 −h r2
2 2 y2 ⎜ ⎟
⎜ ⎟
⎜ ⎟⎜ ⎟ ⎜ ⎟
h 2 h ⎜ ⎟ ⎜ 2 ⎟
⎜ 0 1 − p3 q3 h − 2 1 + p3 0 0 ... 0 0 0 ⎟⎜ y2 ⎟ −h r2
⎜
2 2
⎟⎜ ⎜ ⎟
⎟ =
⎜ ⎟⎜ ⎟ ⎜ ⎟
⎜ ... ... ... ... ... ... ... ... ... ... ⎟ ⎜ .... ⎟ ⎜ ... ⎟
⎜ ⎟⎜ ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ⎟
⎜ h 2 h ⎟⎜ ⎟ 2
0 0 0 0 0 0 ... 1 − pN −2 qN −2 h − 2 1 + pN −2 yN −2 ⎜ −h rN −2 ⎟
⎜ 2 2 ⎟
⎝ ⎠ ⎝ ⎠
⎝ h 2 ⎠ yN −1 2 h
0 0 0 0 0 0 ... 0 1 − pN −1 qN −1 h − 2 −h rN −1 − (1 + pN −1 ) β
2 2
Ejemplo 1
y(−1) = 0, y(1) = 0
Lo sustituimos por un sistema de N-1 ecuaciones con N-1 incógnitas, del siguiente modo
⎧ p = 0
⎪ i
2
xi = −1 + ih⎨ qi = 1 + x
i
⎩
⎪
ri = 1
α = 0, β = 0
⎝ 2 ⎠⎝ ⎠ ⎝ 2 ⎠
0 0 0 0 0 0 ... 0 1 qN −1 h − 2 yN −1 −h
MATLAB facilita el trabajo con matrices: crear matrices, acceder a sus elementos, etc. Una vez
que hemos definido el vector A de los coeficientes y el vector B de los términos
independientes, despejamos el vector Y de las incógnitas, A·Y=B, utilizando el operador
división por la izquierda '\'
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 13/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
function ecuacion_diferencial_5
solinit = bvpinit(linspace(-1,1,5), [0,0]);
sol = bvp4c(@f, @extremos, solinit);
t=linspace(-1,1);
x = deval(sol,t);
plot(t,x(1,:));
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
%ecuación diferencial
function dx = f(t,x)
dx = [x(2), -1-(1+t^2)*x(1)];
end
%condiciones en los extremos
function res = extremos(xa,xb)
res = [xa(1), xb(1)];
end
end
Ejemplo 2
y(0) = 0, y(2) = −4
>> syms x;
>> y=dsolve('D2y-2*Dy+y-x*exp(x)+x',x);
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 14/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
>> simplify(y)
ans =(x^3*exp(x))/6 - x + C5*exp(x) + C6*x*exp(x) - 2
1
3 x x x
y = x e − x + Ae + Bxe − 2
6
Determinamos los coeficientes A y B a partir de las condiciones en los extremos: A=2, B=-5/3
1 5
3 x
y = ( x − x + 2) e − x − 2
6 3
Lo sustituimos por un sistema de N-1 ecuaciones con N-1 incógnitas, del siguiente modo
⎧ p = −2
⎪ i
xi = ih⎨ qi = 1
⎩
⎪ xi
ri = −xi e + xi
α = 0, β = −4
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 15/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
function ecuacion_diferencial_6
solinit = bvpinit(linspace(0,2,5), [0,0]);
sol = bvp4c(@f, @extremos, solinit);
t=linspace(0,2);
x = deval(sol,t);
plot(t,x(1,:));
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
%ecuación diferencial
function dx = f(t,x)
dx = [x(2), 2*x(2)-x(1)+t*exp(t)-t];
end
%condiciones en los extremos
function res = extremos(xa,xb)
res = [xa(1), xb(1)+4];
end
end
y(a) = α, y(b) = β
Sustituimos por un sistema de N-1 ecuaciones con N-1 incógnitas, del siguiente modo
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 16/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
y0 = α
yN = β
de forma explícita
y2 −α
2
⎧ y2 − 2y1 + α − h f (x1 , y1, ) = 0
⎪
⎪
2h
⎪
⎪
⎪
⎪
⎪ y3 −y1
⎪ 2
⎪ y3 − 2y2 + y1 − h f (x2 , y2, ) = 0
⎪
⎪ 2h
⎪
⎪
⎨ ...
⎪
⎪ yN −1 −yN −3
⎪ 2
⎪ yN −1 − 2yN −2 + yN −3 − h f (xN −2 , yN −2, ) = 0
⎪
⎪ 2h
⎪
⎪
⎪
⎪
⎪
⎪ 2
β−yN −2
⎩ β − 2y
⎪
N −1 + yN −2 − h f (xN −1 , yN −1, ) = 0
2h
Ejemplo
1 1
y(1) = , y(2) =
2 3
La solución analítica es
>> dsolve('D2y-y^3+y*Dy',x)
ans = -1/(C23 - x)
-1/(C20 + x/2)
−1
y =
A − x
1
y =
1 + x
>> syms x;
>> y=1/(1+x);
>> diff(y,x,2)-y^3+y*diff(y,x)
ans =0
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 17/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
1
1 2 3 y2 −
y2 − 2y1 + − h (y − y1 2 ) = 0
⎧ 2 1 2h
⎪
⎪
⎪
⎪
⎪
⎪
3 yi+1 −yi−1
2
yi+1 − 2yi + yi−1 − h (y − yi ) = 0, i = 2,3,...N − 2
⎨ i 2h
⎪
⎪
⎪
⎪ 1
1
−yN −2
⎪
⎩
⎪ 2 3
− 2yN −1 + yN −2 − h (y − yN −1 3 ) = 0
3 N −1 2h
⎧ g1 (y1 , y2 ,...,yN −1 ) = 0
⎪
⎪
⎪
⎪
g2 (y1 , y2 ,...,yN −1 ) = 0
⎨
⎪ ....
⎪
⎪
⎩
⎪
gN −1 (y1 , y2 ,...,yN −1 ) = 0
El procedimiento se escribe
−1
∂g1 ∂g1 ∂g1
′ ⎛ ... ⎞
y y1 ∂y1 ∂y2 ∂yN −1 g1 (y1 , y2 ...yN −1 )
⎛ 1 ⎞ ⎛ ⎞ ⎛ ⎞
⎜ ∂g2 ∂g2 ∂g2 ⎟
′
⎜ y ⎟ y2 ⎜ ... ⎟ g2 (y1 , y2 ...yN −1 )
2 ⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ ⎟ = ⎜ ⎟ − ⎜ ∂y1 ∂y2 ∂yN −1 ⎜ ⎟
⎜ ⎟ ⎜ ⎟ ⎟ ⎜ ⎟
⎜ ... ⎟ ⎜ ... ⎟ ⎜ ⎟ ⎜ ... ⎟
⎜ ... ... ... ... ⎟
⎝ ⎠ ⎜ ⎟ ⎝ ⎠
⎝ y′ ⎠ yN −1 gN −1 (y1 , y2 ...yN −1 )
∂gN −1 ∂gN −1 ∂gN −1
N −1
⎝ ... ⎠
∂y1 ∂y2 ∂yN −1
y2 y3 −y1 y2
2 2
⎛ 1 − h −2 − h (3y2 − ) 1 + h 0 0 ... 0 0 0 0 ⎞
2 2h 2
⎜ y3 y3 −y1 y3
⎟
⎜ 2 2 ⎟
⎜ 0 1 − h −2 − h (3y2 − ) 1 + h 0 ... 0 0 0 0 ⎟
⎜ 2 2h 2 ⎟
⎜ ⎟
⎜ ⎟
⎜ ... ... .... ... ... ... ... ... ... ... ⎟
⎜ ⎟
⎜ ⎟
⎜ ... ... ... ... ... ... ... ... ... ... ⎟
⎜ ⎟
⎜ ⎟
⎜ 0 0 0 0 0 ... 0 0 0 0 ⎟
⎜ ⎟
⎜ ⎟
⎜ 0 0 0 0 0 ... 0 0 0 0 ⎟
⎜ ⎟
⎜ ⎟
⎜ 0 0 0 0 0 ... 0 0 0 0 ⎟
⎜ ⎟
⎜ yN −2 yN −1 −yN −3 yN −2
⎟
⎜ 2 2 ⎟
⎜ 0 0 0 0 0 ... 0 1 − h −2 − h (3y − ) 1 + h ⎟
⎜ 2 N −2 2h 2 ⎟
⎜ ⎟
⎜ yN −1
1 ⎟
2 −yN −2
2
⎝ 0 0 0 0 0 ... 0 0 1 − h −2 − h (3y − 3 )⎠
2 N −1 2h
Nota: Esta expresión se muestra muy pequeña para que quepa en la página, pero se puede
aumentar, utilizando el botón derecho del ratón y seleccionando en el menú flotante, Math
Settings/Scale all Math...
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 18/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
J(1,1)=-2-h^2*(3*y(1)^2-(y(2)-alfa)/(2*h));
J(N-1,N-1)=-2-h^2*(3*y(N-1)^2-(beta-y(N-2))/(2*h));
for i=2:N-2
J(i,i)=-2-h^2*(3*y(i)^2-(y(i+1)-y(i-1))/(2*h));
end
for i=2:N-1
J(i, i-1)=1-y(i)*h/2;
end
for i=1:N-2
J(i, i+1)=1+y(i)*h/2;
end
dy=-J\G;
if sqrt(norm(dy)/norm(y+dy))<0.0001
disp('Solución')
disp(y+dy)
break;
end
y=y+dy;
end
if k==100
disp('Se ha soprepasado el número de iteracciones');
end
hold on
plot(1+(0:N)*h, [alfa y',beta],'-ro','markersize',3,'markeredgecolor',
'r','markerfacecolor','r')
ye=@(x) 1./(x+1); %exacta
fplot(ye,[1,2])
hold off
xlabel('x')
ylabel('y')
grid on
title('Diferencias finitas')
Solución
0.4762
0.4546
0.4348
0.4167
0.4000
0.3846
0.3704
0.3571
0.3448
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 19/20
17/12/2020 Solución de ecuaciones diferenciales con condiciones en los extremos
function ecuacion_diferencial_7
solinit = bvpinit(linspace(1,2,5), [0,-1]);
sol = bvp4c(@f, @extremos, solinit);
t=linspace(1,2);
x = deval(sol,t);
plot(t,x(1,:));
grid on
xlabel('x')
ylabel('y')
title('Condiciones en los extremos')
%ecuación diferencial
function dx = f(~,x)
dx = [x(2), x(1)^3-x(1)*x(2)];
end
%condiciones en los extremos
function res = extremos(xa,xb)
res = [xa(1)-1/2, xb(1)-1/3];
end
end
Referencias
James V. Lambers, Amber C. Sumner. Explorations in Numerical Analysis. December 20, 2016.
pp. 343-352
www.sc.ehu.es/sbweb/fisica3/numerico/bvp/bvp.html 20/20