Beruflich Dokumente
Kultur Dokumente
Pérez López, C. Capítulo 7. Actualizado por: Ing. Juvenal Rivas Leguía, 2017.
En la sintaxis anterior solver puede ser cualquiera de los comandos ode45, ode23,
ode113, ode15s, ode23s, ode23t u ode23tb.
Figura 7-1
function dy=sistema1(t,y)
dy=zeros(3,1); %vector columna
dy(1)=y(2)*y(3);
dy(2)=-y(1)*y(3);
dy(3)=-0.51*y(1)*y(2);
end
A continuación, resolvemos el sistema tecleando en la ventana comandos lo
siguiente:
>> [T,Y]=ode45(@sistema1,[0 12],[0 1 1])
T =
0
0.0001
0.0001
0.0002
0.0002
0.0005
.
.
11.7424
11.8712
12.0000
Y =
0 1.0000 1.0000
0.0001 1.0000 1.0000
0.0001 1.0000 1.0000
0.0002 1.0000 1.0000
0.0002 1.0000 1.0000
0.0005 1.0000 1.0000
.
.
-0.5169 -0.8539 0.9279
-0.6135 -0.7874 0.8974
-0.6987 -0.7128 0.8650
Para interpretar mejor los resultados, la solución numérica anterior puede graficarse (Figura 7-
2) mediante la siguiente sintaxis:
>> plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.')
Figura 7-2
donde el vector p está formado por parámetros que han de ser determinados
simultáneamente con la solución a través de las condiciones de valores en la frontera.
En la sintaxis anterior odefun es una función que evalúa las ecuaciones diferenciales
f(x,y) y que puede tener la forma siguiente:
dydx=odefun(x,y)
dydx=odefun(x,y,pl,p2,...)
dydx=odefun(x,y,parametros)
dydx=odefun(x,y,parametros,pl,p2,...)
function dydx=twoode(x,y)
dydx=[y(2);-abs(y(1))];
function res=twobc(ya,yb)
res=[ya(1);yb(1)+2];
Figura 7-5
function [c,f,s]=pdex1pde(x,t,u,DuDx)
c=pi^2;
f=DuDx;
s=0;
function u0=pdex1ic(x)
u0=sin(pi*x);
Figura 7-8
function [p1,q1,pr,qr]=pdex1bc(x1,u1,xr,ur,t)
p1=u1;
q1=u1;
pr=pi*exp(-t);
qr=1;
Una vez definidas las funciones de apoyo, se define la función que resuelve el
problema mediante el M-fichero de la Figura 7-9.
Figura 7-9
function pdex1
m=0;
x=linspace(0,1,20);
t=linspace(0,2,5);
sol=pdepe(m,@pdex1pde,@pdex1ic,@pdex1bc,x,t);
% Extrae la primera componente solución como u.
u=sol(:,:,1);
% Se representa la solución mediante un gráfico de superficie.
figure(1)
surf(x,t,u)
title('Solución numérica con 20 puntos de malla.')
xlabel('Distancia x')
ylabel('Tiempo t')
% Perfil de la solución
figure(2)
plot(x,u(end,:))
title('Solución en t=2')
xlabel('Distancia x')
ylabel('u(x,2)')
function [c,f,s]=pdex4pde(x,t,u,DuDx)
c=[1;1];
f=[0.024;0.17].*DuDx;
y=u(1)-u(2);
F=exp(5.73*y)-exp(-11.47*y);
s=[-F;F];
function [p1,q1,pr,qr]=pdex4bc(x1,u1,xr,ur,t)
p1=[0;u1(2)];
q1=[1;0];
pr=[ur(1)-1;0];
qr=[0;1];
Una vez definidas las funciones de apoyo, se define la función que resuelve el problema
mediante el M-fichero de la Figura 7-15.
Figura 7-15
function pdex4
m=0;
x=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
sol=pdepe(m,@pdex4pde,@pdex4ic,@pdex4bc,x,t);
u1=sol(:,:,1);
u2=sol(:,:,2);
figure
surf(x,t,u1)
title('u1(x,t)')
xlabel('Distance x')
ylabel('Time t')
figure
surf(x,t,u2)
title('u2(x,t)')
xlabel('Distancia x')
ylabel('Tiempo t')
Para ejecutar la solución (Figuras 7-16 y 7-17), en la ventana de comandos de MATLAB se utiliza
la sintaxis:
>> pdex4
Ejercicio 7-1. Resolver el sistema de ecuaciones diferenciales de Van der Pol siguiente:
𝑦1 = 𝑦2 𝑦1 (0) = 0
𝑦2 = 1000(1 − 𝑦12 )𝑦2 − 𝑦1 𝑦2 (0) = 1
Figura 7-18
function dy=vdp1000(t,y)
dy=zeros(2,1); % vector columna
dy(1)=y(2);
dy(2)=1000*(1-y(1)^2*y(2)-y(1));
A continuación resolvemos el sistema y graficamos la solución y1 =y1(t) relativa a la primera
columna (Figura 7-19) de la salida tecleando lo siguiente en la ventana de comandos:
>>[T,Y] = ode15s(@vdp1000, [0 3000] ,[2 0]);
>> plot(T,Y(:,1),'-')
Figura 7-23
function dydx=mat4ode(x,y,lambda)
q=5;
dydx=[y(2)
-(lambda-2*q*cos(2*x))*y(1)];
function res=mat4bc(ya,yb,lambda)
res=[ya(2)
yb(2)
ya(1)-1];
function yinit=mat4init(x)
yinit=[cos(4*x)
-4*sin(4*x)]
La solución inicial para λ =15 y 10 puntos igualmente espaciados en [0, π] se calcula mediante la
sintaxis MATLAB siguiente:
>> lambda = 15;
>> solinit = bvpinit(linspace(0,pi,10),@mat4init,lambda);
La solución numérica del sistema se calcula mediante la sintaxis siguiente:
>> sol = bvp4c(@mat4ode,@mat4bc,solinit);
>> fprintf ('El cuarto valor propio es aproximadamente% 7.3f.\n',
...
sol.parameters)
Para graficar su primera componente en 100 puntos igualmente espaciados en el intervalo [0,π
] se utiliza la siguiente sintaxis:
>> xint = linspace(0,pi);
Sxint = deval(sol,xint); % deval en vez de bvpval.
plot(xint,Sxint(1,:))
axis([0 pi -1 1.1])
title ('Eigenfunción de la ecuación de Mathieu')
xlabel ('x')
ylabel ('solución y')
Figura 7-24
Figura 7-25
function dydt=vdp1(t,y)
dydt=[y(2);(1-y(1)^2)*y(2)-y(1)];
t =
0
0.0000
0.0001
0.0001
0.0001
0.0002
.
.
19.9780
20.0000
y =
2.0000 0
2.0000 -0.0001
2.0000 -0.0001
2.0000 -0.0002
.
.
2.0158 0.0892
2.0172 0.0404
Podemos graficar las soluciones (Figura 7-26) mediante la sintaxis.
>> plot(t,y(:,1),'-',t,y(:,2),'--')
xlabel('tiempo t')
ylabel('solución y')
legend('y_1','y_2')
Figura 7-26
Para resolver el sistema general con el parámetro p se define el sistema mediante el M-fichero
de la Figura 7-27.
Figura 7-27
function dydt=vdp2(t,y,nu)
dydt=[y(2);nu*(1-y(1)^2)*y(2)-y(1)];
Si queremos graficar la primera solución para otro valor del parámetro, por ejemplo 𝜇 =100, en
el intervalo [0,1500] para y1=2 e y2=0 (Figura 7-29), utilizaremos la sintaxis: