You are on page 1of 8

runge kutta

Program RUNGEK4
External fnz
Real::d,f,L,zm,H
Real::C1,C2,OZ,OOZ,t
Integer::i,ipr
Real::kv1,kz1,kv2,kz2,kv3,kz3,kz4,kv4
Real::y,z
Real,parameter::eps=0.001,g=9.806
open(unit=5,file='ploteo,dat')
!Asignacionde datos
d=0.50;f=0.03;L=1000.0;zm=6.0
H=0.5
ipr=1
!Calculosde los coeficientes de la EDO de movimiento
C1=-0.5*f*H/d
C2=-2*g*H/L
!Condiciones iniciales
y=0.0;z=6.0;OZ=6.0
i=0
Print 10
10 format(1x,"T-seg",3x,"Z-m",3x,"V-m/s")
!Proceso iterativo
5000 i=i+1
OOZ=OZ
OZ=z
kv1=fnz(z,y,C1,C2)
kz1=H*y
kv2=fnz(z+0.5*kz1,y+0.5*kv1,C1,C2)
kz2=H*(y+0.5*kv1)
kv3=fnz(z+0.5*kz2,y+0.5*kv2,C1,C2)
kz3=H*(y+0.5*kv2)
kv4=fnz(z+kz3,y+kv3,C1,C2)
kz4=H*(y+kv3)
Y=Y+(H/6)*(kv1+2*kv2+2*kv3+kv4)
z=z+(H/6)*(kz1+2*kz2+2*kz3+kz4)
t=t+H
if((OZ<OOZ-eps) .AND. (OZ<z-eps)) then
print 11,OZ,t-h
end if
if(mod(i,ipr)==0) print 12,t,z,y
if (mod(i,ipr)==0) write(5,12) t,z,y
if ((OZ>OOZ+eps).AND.(OZ>z+eps)) then
print 13,OZ,t-h
STOP
else
goto 5000
end if
11 format(1x,"ZMIN= ",F8.3,3X,"HORAS= ",F8.2)
12 format(1x,f8.3,3x,f8.3,3x,f8.3)
13 format(1x,"ZM= ",F8.3,3X,"HORAS= ",F8.2)
End Program RUNGEK4
Function fnz(zz,yy,C1,C2)
real::zz,yy,C1,C2
I. PROBLEMA DE OSCILACION EN DEPOSITOS (GRAFICO)
CODIGO EN MATLAB PARA OBTENER POSICION Y VELOCIDAD DEL
DEPOSITO 2
clear all
clc
dt=1;
d1=5;
d2=6;
L=600;
k=3.85;
f=0.024;
h=0.1;
z1=12;
%condiciones iniciales del tiempo y velocidad
t(1)=0;
v(1)=0;
%calculo de la longitud equivalente
Le=L+(k*dt)/f;
g=9.81;
%calculo de c3 y c4
c3=(g/L)*(pi*d1^2/4)*(1/(pi*d1^2/4)+1/(pi*d2^2/4));
c4=(0.5*Le*f)/(dt*L);
%calculo de f
z(1)=z1*(d1^2/dt^2);
%condicionando un valor tipo contador
n=1;
zd1(1)=12;
vd1(1)=0;
zd2(1)=-8.3;
vd2(1)=0;
fprintf('tiempo(s) z2(m) v2(m/s)\n')
while t(n)<=500
kz1=h*v(n);
kv1=h*(-c3*z(n)-c4*v(n)*abs(v(n)));
kz2=h*(v(n)+kv1/2);
kv2=h*(-c3*(z(n)+kz1/2)-c4*(v(n)+kv1/2)*abs(v(n)+kv1/2));
kz3=h*(v(n)+kv2/2);
kv3=h*(-c3*(z(n)+kz2/2)-c4*(v(n)+kv2/2)*abs(v(n)+kv2/2));
kz4=h*(v(n)+kv3/2);
kv4=h*(-c3*(z(n)+kz3)-c4*(v(n)+kv3/2)*abs(v(n)+kv3/2));
t(n+1)=t(n)+h;
z(n+1)=z(n)+(kz1+2*kz2+2*kz3+kz4)/6.0;
v(n+1)=v(n)+(kv1+2*kv2+2*kv3+kv4)/6.0;
%deposito de altura y velocidad del deposito2
z2=z(n)*(dt^2/d2^2);
v2=v(n)*(dt^2/d2^2);
zd2(n+1)=-z2;
vd2(n+1)=-v2;
fprintf(' %.1f %.3f %.3f\n',t(n),zd2(n), vd2(n))
n=n+1;
L(n)=n*n;
end
%grafico de la altura en el de deposito 2

subplot (1,2,1);
plot(t,zd2)
grid on
title('altura del deposito 2')
xlabel('tiempo(s)')
ylabel('posicion(m)')
subplot (1,2,2);
plot(t,vd2)
grid on
title('velocidad del deposito 2')
xlabel('tiempo(s)')
ylabel('velocidad(m/s)')

clear all
x=-1; %valor de la raiz inicial
E=0.0001; %error aceptable

for i=1:100
f=(1+0.06*x)*exp(-0.06*x)-0.9488;
d=0.06*exp(-0.06*x)+(1+0.06*x)*(-0.06)*exp(-0.06*x);
%d=0.06/(exp(0.06*x)) - (0.06*(0.06*x + 1))/(exp(0.06*x));
x1=x-f/d;
fprintf('Las raices intermedias: %8.5f\n',x1)
f=(1+0.06*x1)*exp(-0.06*x1)-0.9488;
if abs(f)<=E
disp('La raiz obtenida')
fprintf(' %8.5f\n',x1)
break
end
x=x1; %para seguir con el proceso iterativo
end
program rk4
real,dimension(100)::v,z
real::nt,w,L,f,D
real:: kz1,kv1,kz2,kv2,kz3,kv3,kz4,kv4
real,parameter::g=9.81
real,parameter::tf=9,dt=0.1
open(unit=16, file='resultados.dat',status='unknown')
L=1.14854
f=0.0217165
D=0.00465
w=sqrt(2.*(g/L))
nt=tf/dt+1.
v(1)=0.
z(1)=0.18
do j=2,nt
kz1=dt*(v(j-1))
kv1=-dt*(f/(2.*D)*v(j-1)*abs(v(j-1))+(w**2)*z(j-1))
kz2=dt*(v(j-1)+kv1/2.)
kv2=-dt*(f/(2.*D)*(v(j-1)+kv1/2.)*abs(v(j-1)+kv1/2.)+(w**2)*(z(j-1)+kz1/2.))
kz3=dt*(v(j-1)+kv2/2.)
kv3=-dt*(f/(2.*D)*(v(j-1)+kv2/2.)*abs(v(j-1)+kv2/2.)+(w**2)*(z(j-1)+kz2/2.))
kz4=dt*(v(j-1)+kv3)
kv4=-dt*(f/(2.*D)*(v(j-1)+kv3)*abs(v(j-1)+kv3)+(w**2)*(z(j-1)+kz3))
v(j)=v(j-1)+(kv1+2*kv2+2*kv3+kv4)/6.
z(j)=z(j-1)+(kz1+2*kz2+2*kz3+kz4)/6.
enddo
print*," Tiempo-s Z-m V-m/s"
write(16,99)
99 format(" Tiempo-s Z-m V-m/s")
do j=1,nt
print 100,(j-1)*dt,z(j),v(j)
write(16,100) (j-1)*dt,z(j),v(j)
enddo
100 format(F12.3,F8.3,F8.3)
end program rk4
runge kitta para oscilaciones
clear all
clc
dt=1;
d1=5;
d2=6;
L=600;
k=4.75;%perdidas
f=0.024;
h=0.1;%h variacion del tiempo
z1=12;
t(1)=0;%t vector inicial 0
V(1)=0;%vector velocidad 0
g=9.81;
pi=3.1416;
Le=L+(k*dt)/f;
%Le : longitud equivalente =Lf+L
%calculando C3 y C4
C3=g*(pi*dt^2/(L*4))*(4/(pi*d1^2)+4/(pi*d2^2));
C4=(Le*f)/(L*2*dt);
Z(1)=z1*(d1^2/dt^2);
%Sea n una variable contador
n=1;
while(t(n)<=1000)
kz1=h*V(n);
kv1=h*(-C3*Z(n)-C4*V(n)*abs(V(n)));
kz2=h*(V(n)+kv1/2);
kv2=h*(-C3*(Z(n)+kz1/2)-C4*(V(n)+kv1/2)*abs(V(n)+kv1/2));
kz3=h*(V(n)+kv2/2);
kv3=h*(-C3*(Z(n)+kz2/2)-C4*(V(n)+kv2/2)*abs(V(n)+kv2/2));
kz4=h*(V(n)+kv3);
kv4=h*(-C3*(Z(n)+kz3)-C4*(V(n)+kv3*abs(V(n)+kv3)));
t(n+1)=t(n)+h;
Z(n+1)=Z(n)+(1/6)*(kz1+2*kz2+2*kz3+kz4);
V(n+1)=V(n)+(1/6)*(kv1+2*kv2+2*kv3+kv4);
%la altura y velocidad en el deposito 1
z1=Z(n)*(dt^2/d1^2);
v1=V(n)*(dt^2/d1^2);
zD1(n+1)=z1;
vD1(n+1)=v1;
plot(t,Z)
plot(t,zD1)
%determinado la altura y velocidad en el deposito 2;
z2=Z(n)*(dt^2/d2^2);
v2=V(n)*(dt^2/d2^2);
zD2(n+1)=z2;
vD2(n+1)=v2;
n=n+1;
end
%grafico de Z y V tuberia
figure(1)
plot(t,Z)
title('altura en la tuberia')
grid on
figure(2)
plot(t,V)
title('velocidad en la tuberia')
grid on
%***
figure(3)
plot(t,zD1)
title('altura en el deposito 1')
grid on
figure(4)
plot(t,vD1)
title('velocidad en el deposito 1')
grid on

You might also like