Sunteți pe pagina 1din 20

MDULO 6 ECUACIONES DIFERENCIALES ORDINARIAS

OBJETIVOS

Desarrollar mtodos para la resolucin de problemas relacionados con las
ecuaciones diferenciales ordinarias, mediante el uso de la herramienta informtica
SCILAB.

Aprender la aplicacin correcta de los mtodos numricos propuestos para resolver
este tipo de problemas, como el mtodo de euler, Runge-Kutta y diferencias
divididas.

Resaltar la importancia de desarrollar estrategias para resolver este tipo de
problemas con una herramienta informtica que facilite y organice largas
operaciones de clculo, mostrando resultados precisos.


Los Mtodos de Runge-Kutta tienen la exactitud del esquema de la serie de Taylor sin
necesitar del clculo de derivadas superiores. El ms conocido es el mtodo de cuarto
orden cuya forma se describe la siguiente ecuacin:

*(

) (

)+
Dnde:

)

EJERCICIO 1

clc;
disp(" ** Laboratorio Seis ** ")
disp("Codigos: 245176 245049 245335")
ww=getdate();
mprintf( "AA:%d ,MM:%d ,DD:%d siendo las HH:%d ,MM:%d ,SS:%d
",ww(1),ww(2),ww(6),ww(7),ww(8),ww(9));

//Funciones
//Funcin 1
function G=re2(t,u)
G=u
endfunction

//Funcin 2
function F=resorte(t,u)
F=-20*t-200*u
endfunction

//Datos
//Segunda funcin
a=0
b=0.05
//Nmero de pasos
M=5
//Condiciones iniciales
Za1=1
Za2=0

//Procedimiento

//RKS4 Runge-Kutta para el sistema de ODEs Z'=F(x,Z) con Z(a)=Za
//Datos
// - F es la funcin almacenada como una cadena de caracteres 'F'
// - a y b son los extremos derechos e izquierdo del intervalo
// - Z=[x1(a)......xn(a)] es la condicin inicial
// - M es el nmero de pasos
//Resultados
// - T es el vector de los nodos
// - Z=[x1(t)......xn(t)]; donde xk(t) es la aproximacion a la k-esima variable
dependiente

//Primera parte
h=(b-a)/M;
T=zeros(1,M+1);
Z=zeros(M+1,length(Za1));
T=a:h:b;
Z(1,:)=Za1;

for j=1:M
tj=T(j);
Zj=Z(j,:);
k1=h*re2(tj,Zj);
k2=h*re2(tj+h/2,Zj+k1/2);
k3=h*re2(tj+h/2,Zj+k2/2);
k4=h*re2(tj+h,Zj+k3);
Z(j+1,:)=Z(j,:)+(k1+2*k2+2*k3+k4)/6;
T(j+1)=a+h*j;
end

//Segunda parte
h=(b-a)/M;
T=zeros(1,M+1);
W=zeros(M+1,length(Za2));
T=a:h:b;
W(1,:)=Za2;

for j=1:M
tj=T(j);
Wj=W(j,:);
k1=h*resorte(tj,Z(M));
k2=h*resorte(tj+h/2,Z(M)+k1/2);
k3=h*resorte(tj+h/2,Z(M)+k2/2);
k4=h*resorte(tj+h,Z(M)+k3);
W(j+1,:)=W(j,:)+(k1+2*k2+2*k3+k4)/6;
T(j+1)=a+h*j;
end

//Resultados
//Vector de nodos
T
//Iteraciones para la primera ecuacin
Z
//Iteraciones para la segunda ecuacin
W



















EJERCICIO 2

clc;
disp(" ** Laboratorio Seis ** ")
disp("Codigos: 245176 245049 245335")
ww=getdate();
mprintf( "AA:%d ,MM:%d ,DD:%d siendo las HH:%d ,MM:%d ,SS:%d
",ww(1),ww(2),ww(6),ww(7),ww(8),ww(9));

function [T,Z]=rsk4(F,a,b,Za,m)
h=(b-a)/m;
T=zeros(1,m+1);
Z=zeros(m+1,length(Za));
T=a:h:b;
Z(1,:)=Za

for j=1:m
tj=T(j);
Zj=Z(j,:);
k1=h*F(tj,Zj);
k2=h*F(tj+h/2,Zj+k1/2);
k3=h*F(tj+h/2,Zj+k2/2);
k4=h*F(tj+h,Zj+k3);
Z(j+1,:)=Z(j,:)+(k1+2*k2+2*k3+k4)/6;
T(j+1)=a+h*j;
end
endfunction

function L=linshit(F1,F2,a,b,alpha,betha,M)
//Datos
// - F1 y f2 son los sistemas de ecuaciones de primer orden que representan los
problemas de valor incial (26) y (27) dadas en la conferencia, almacenados como
cadenas de caracteres 'F1' y 'F2'
// - a y b son los extremo izquierdo y derecho del intervalo
// - alpha=x(a) y beta=x(b) son las condiciones del contorno
// - M es el nmero de pasos
//Resultados
// - L=[T'X]; siendo T' el vector de dimensin (M+1)x1 de las abscisas y X el vector de
dimensin (M+1)x1 de las ordenadas

//Resolucin del sistema F1
Za=[alpha,0];
[T,Z]=rsk4(F1,a,b,Za,M);
U=Z(:,1);
//Resolucin del sistema F2
Za=[0,1];
[T,Z]=rsk4(F2,a,b,Za,M);
V=Z(:,1);
//Clculo de la solucin del problema de contorno
X=U+(betha-U(M+1))*V/V(M+1);
L=[T'X];
Endfunction









EJERCICIO 3

Programa 1

//Programa 1

clc;
disp(" ** Laboratorio Seis ** ")
disp("Codigos: 245176 245049 245335")
ww=getdate();
mprintf( "AA:%d ,MM:%d ,DD:%d siendo las HH:%d ,MM:%d ,SS:%d
",ww(1),ww(2),ww(6),ww(7),ww(8),ww(9));

//Datos de entrada
//Polinomios p,q y r correspondientes a la ecuacin diferencial
p=poly([2],'t','c');
q=poly([-1],'t','c');
r=poly([-1 0 1],'t','c');

//Valores extremos del intervalo a utilizar
a=0;
b=1;
b1=1;
//Condiciones de contorno
alpha=5;
betha=10;
//Pasos
h1=0.1;
h2=0.01;
//Intervalos
n1=(b-a)/h1;
n2=(b-a)/h2;

function X=trisys(A,D,C,B);
//Datos
// - A es la subdiagonal de la matriz de los coeficientes
// - D es la diagonal principal de la matriz de los coeficientes
// - C es la superdiagonal de la matriz de los coeficientes
// - B es el vector de los trminos independientes del sistema lineal
//Resultados
// - X es el vector solucin

N=length(B);
for k=2:N
mult=A(k-1,k-1)/D(k-1,k-1);
D(k,k)=D(k,k)-mult*C(k-1,k-1);
B(k)=B(k)-mult*B(k-1);
end

X(N)=B(N)/D(N,N);
for k=N-1:-1:1
X(k)=(B(k)-C(k,k)*X(k+1))/D(k,k)
end
endfunction

// Caso A
n=n1;
h=h1;

//Matrices a utilizar
T=zeros(1,n-1);
T=a:h:b;
A=zeros(n-1,n-1);
b=zeros(n-1,1);
for i=1:(n-1)
for j=1:(n-1)
b(i)=-((h)^2)*horner(r,(T(i)));
if i==j then
A(i,j)=2+((h)^2)*horner(q,(T(i)));
end
end
end
b(1)=b(1)+(1+(h/2)*horner(p,(T(1))))*alpha;
b(n-1)=b(n-1)+(1-(h/2)*horner(p,(T(n-1))))*betha;
for i=1:(n-2)
A(i+1,i)=-1-(h/2)*horner(p,(T(i)));
A(i,i+1)=-1+(h/2)*horner(p,(T(i+1)));
end

//Separacin en submatrices a partir de A
SUB=tril(A)-diag(diag(A));
DIAG=diag(diag(A));
SUP=triu(A)-diag(diag(A));
B=b;
X1=trysis(SUB,DIAG,SUP,B);

//Caso B
n=n2;
h=h2;

//Matrices a utilizar
T=zeros(1,n-1);
T=a:h:b1;
A=zeros(n-1,n-1);
b=zeros(n-1,1);
for i=1:(n-1)
for j=1:(n-1)
b(i)=-((h)^2)*horner(r,(T(i)));
if i==j then
A(i,j)=2+((h)^2)*horner(q,(T(i)));
end
end
end
b(1)=b(1)+(1+(h/2)*horner(p,(T(1))))*alpha;
b(n-1)=b(n-1)+(1-(h/2)*horner(p,(T(n-1))))*betha;
for i=1:(n-2)
A(i+1,i)=-1-(h/2)*horner(p,(T(i)));
A(i,i+1)=-1+(h/2)*horner(p,(T(i+1)));
end

//Separacin en submatrices a partir de A
SUB=tril(A)-diag(diag(A));
DIAG=diag(diag(A));
SUP=triu(A)-diag(diag(A));
B=b;
X2=trysis(SUB,DIAG,SUP,B);

//Resultados
//Paso h=0,1
X1
//Paso h=0,01
X2


























Programa 2

//Programa 2

clc;
disp(" ** Laboratorio Seis ** ")
disp("Codigos: 245176 245049 245335")
ww=getdate();
mprintf( "AA:%d ,MM:%d ,DD:%d siendo las HH:%d ,MM:%d ,SS:%d
",ww(1),ww(2),ww(6),ww(7),ww(8),ww(9));

//Datos de entrada
//Polinomios p,q y r correspondientes a la ecuacin diferencial
p=poly([2],'t','c');
q=poly([-1],'t','c');
r=poly([-1 0 1],'t','c');

//Valores extremos del intervalo a utilizar
a=0;
b=1;
//Condiciones de contorno
alpha=5;
betha=10;
//Pasos
h1=0.1;
h2=0.01;
//Intervalos
n1=(b-a)/h1;
n2=(b-a)/h2;

function F=findiff(p,q,r,a,b,alpha,betha,N)
//Datos
// - p,q,r son las funciones coeficientes de la ecuacin almacenadas como cadenas
de caracteres 'p','q' y 'r'
// - a y b son los extremos del intervalo
// - N es el nmero de pasos
//Resultados
// - F=[T'X] siendo T' el vector de la orden 1xN de los nodos y X' el vector 1xN de los
valores

//Inicializacin de los vectores y de h
T=zeros(1,N+1);
X=zeros(1,N-1);
Va=zeros(1,N-2);
Vb=zeros(1,N-1);
Vc=zeros(1,N-2);
Vd=zeros(1,N-1);
h=(b-a)/N;

//Calculo del vector de los trminos independientes B en AX=B
Vt=a+h:h:a+h*(N-1);
Vb=-h^2*horner(r,Vt);
Vb(1)=Vb(1)+(1+h/2*horner(p,Vt(1)))*alpha;
Vb(N-1)=Vb(N-1)+(1-h/2*horner(p,Vt(N-1)))*betha;

//Calculo de la diagonal principal de A en AX=B
Vd=2+h^2*horner(q,Vt);

//Calculo de la superdiagonal de A en AX=B
Vta=Vt(1,2:N-1);
Va=-1-h/2*horner(p,Vta);

//Calculo de la subdiagonal de A en AX=B
Vtc=Vt(1,1:N-2);
Vc=-1+h/2*horner(p,Vtc);

//Resolucin de AX=B usando trisys
A=Va;
B=Vb;
C=Vc;
D=Vd;

//function X=trisys (A,D,C,B)
//Datos
// - A es la subdiagonal de la matriz de coeficientes
// - D es la diagonal principal de la matriz de coeficientes
// - C es la superdiagonal de la matriz de coeficientes
// - B es el vector constante del sistema lineal
//Resultados
// - X es el vector solucin

N=length(B);
for k=2:N
mult=A(k-1)/D(k-1);
D(k)=D(k)-mult*C(k-1);
B(k)=B(k)-mult*B(k-1);
end
X(N)=B(N)/D(N);
for k=N-1:-1:1
X(k)=(B(k)-C(k)*X(k+1))/D(k);
end

T=[a,Vt,b];
X=[alpha,X,betha];
F=[T' X'];
endfunction

//Operaciones
//Caso A
h=h1;
N=n1;
X1=findiff(p,q,r,a,b,alpha,betha,N);

//Caso B
h=h2;
N=n2;
b1=1;
X2=findiff(p,q,r,a,b1,alpha,betha,N);

//Resultados
//Paso h=0,1
X1
//Paso h=0,01
X2


































CONCLUSIONES

Con la herramienta Scilab podemos desarrollar una forma metdica y fcil para
encontrar las soluciones a Ecuaciones Diferencial Ordinarias de forma iterativa sin
tener que usar mtodos complicados.

El mtodo de Runge-Kutta es quizs la forma ms precisa de hallar dichas
soluciones a travs de las condiciones inciales, creando pendientes con el termino
anterior; otra buena alternativa que se tiene el mtodo de euler, para problemas
que no sean tan complejos.