Vibrações - Runge Kutta
Transcript of Vibrações - Runge Kutta
Universidade Federal Fluminense – PUVREEIMVR - Escola de Engenharia Industrial Metalúrgica de Volta Redonda
VibraçõesMétodo de Runge-Kutta
Data: 12/12/2010Professor: Alberto PaivaAlunos: Marcelo Araújo de Carvalho Rafael Nobrega Ramalho
1. Objetivo:
Neste trabalho apresentaremos a implementação computacional do método de Runge-Kutta de 4ª ordem para a resolução numérica de um sistema de EDO’s referente ao sistema massa-mola-amortecedor de um problema de vibrações. Para tal utilizamos como linguagem de programação o Fortran 90.
Equações de movimento
Bloco 1m1 x1 + (c1+c2)x1 - c2 x2 + (k1+k2)x1 - k2x2 = Fcos(Ωt)x1= dx1= v1
v�1= ( Fcos(Ωt) - ( c1+c2)v1 + c2 v2 – (k1+k2)x1 + k2x2 )/m1
Bloco 2m2 x2 + c2 x2 + k2x2 - c2x1 - k2x1 = 0 x2= dx2= v2
v�2= ( - c2 v2 - k2x2 + c2 v1+ k2x1 )/m2
Program RK4Implicit noneReal,Dimension(4,4)::kReal,Dimension(:,:),Allocatable::Xreal::pi,m1,m2,k1,k2,c1,c2,for,freq_for,h,t0,tf,nReal,x1,x2,dx1,dx2,d2x1,d2x2,FInteger::n,ik,jk,ix,jx
OPEN(FILE='saida.dat',UNIT=10,STATUS='UNKNOWN'); OPEN(FILE='saida.txt',UNIT=20,STATUS='UNKNOWN') !Condições iniciais (C.I)!pi=3.14159265h=1 !Tamanho do passot0=0 !Tempo inicialtf=1 !Tempo final (Valor de "t" em que desejamos encontrar X(t))m1=1;m2=1 !Massa do bloco 1 e 2k1=1;k2=1 !Constante Elástica da Mola 1 e 2c1=1;c2=1 !Coeficiente de amortecimento 1 e 2freq_for=pi !Frequencia do forçamentofor=1 !Amplitude maxima do forçamentox1=1;x2=1 !Condição inicial de x1 e x2dx1=1;dx2=1 !Condição inicial das primeiras derivada de x1 e x2 Call Verificacao(h,t0,tf) !Verificaçao se as C.I são coerentes
!!!!!!!!!!!!!!!!!___________Programa_____________!!!!!!!!!!!!!!!!!!!______________________________nReal=(tf-t0)/hn=nRealWrite(*,*) 'numero de subintervalos =', nAllocate(X(0:4,0:n))X(0,0)=t0; X(1,0)=x1; X(2,0)=x2; X(3,0)=dx1; X(4,0)=dx2
Do jx=1,nDo jk=1,4
Do ik=1,4if(jk==1)thenk(ik,jk)= F(ik,m1,m2,k1,k2,c1,c2,for,freq_for ,X(0,jx-1),X(1,jx-1),X(2,jx-1),X(3,jx-1),X(4,jx-1))
else if(jk==2.or.jk==3)thenk(ik,jk)= F(ik,m1,m2,k1,k2,c1,c2,for,freq_for ,X(0,jx-1)+(h/2) ,X(1,jx-1)+((h*k(1,jk-1))/2) ,X(2,jx-1)+((h*k(2,jk-1))/2), X(3,jx-1)+((h*k(3,jk-1))/2) ,X(4,jx-1)+((h*k(4,jk-1))/2) )
else if(jk==4) thenk(ik,jk)= F(ik,m1,m2,k1,k2,c1,c2,for,freq_for ,X(0,jx-1)+h ,X(1,jx-1)+(h*k(1,jk-1)) ,X(2,jx-1)+(h*k(2,jk-1)), X(3,jx-1)+(h*k(3,jk-1)) ,X(4,jx-1)+(h*k(4,jk-1)) )end if
End doEnd do
Do ix=1,4X(ix,jx)=X(ix,jx-1) + ( (h/6) * ( (k(ix,1)) + (2*k(ix,2)) + (2*k(ix,3)) + (k(ix,4)) ) )
End doX(0,jx)=X(0,jx-1)+h
End do10 Format(i5,7x,F8.2,6x,F9.4,6x,F9.4,6x,F9.4,6x,F9.4)Write(10,*)' Passos Tempo X1 X2 dX1 dX2' ;Write(10,*)Write(20,*)' Passos Tempo X1 X2 dX1 dX2' ;Write(20,*)Do jx=0,n
Write(10,10) jx,X(0,jx), X(1,jx) ,X(2,jx), X(3,jx),X(4,jx) Write(20,10) jx,X(0,jx), X(1,jx) ,X(2,jx), X(3,jx),X(4,jx)
End doEnd program
Obs.: Para simplificar, supus que o programa encontre valores de x1 e x2, dx1, dx2 em um determinado tempo (tf), sendo que este deve ser maior que o tempo da condição inicial (t0), ou seja:
tf>t0 e h>0 (h=tamanho do passo)
Subroutine Verificacao(h,t0,tf)
Implicit noneReal::h,t0,tf,nReal,testeInteger::n
if(tf<=t0)thenWrite(*,*) 'ERRO!!!'Write(*,*) 'O valor do tempo final(tf) deve ser maior que o tempo inicial(t0)'Stopend if
If(h<=0)thenWrite(*,*) 'ERRO!!!'Write(*,*) 'O valor do passo (h) deve ser maior que zero'stopend if
nReal=(tf-t0)/h
if (nReal<1)thenWrite(*,*) 'ERRO!!!'Write(*,*) 'O valor do passo (h) deve ser menor ou igual ao intervalo (tf-t0)'stopend if
n=nrealteste=nReal-n
if(teste/=0)thenWrite(*,*) 'ERRO!!!'Write(*,*) 'O valor do passo (h) deve ser multiplo inteiro de (tf-t0)'stopend if
Write(*,*) 'Condicoes iniciais OK!'
end subroutine_______________________________________________________________________________________________
Function F(ik,m1,m2,k1,k2,c1,c2,for,freq_for,t,x1,x2,dx1,dx2)
Implicit Nonereal::t,m1,m2,k1,k2,c1,c2,for,freq_for,x1,x2,dx1,dx2,FInteger::ik
if(ik==1)thenF=dx1
else if(ik==2) thenF=dx2
else if(ik==3) thenF=( (for*cos(freq_for*t)) - ((c1+c2)*dx1) + (c2*dx2) - ((k1+k2)*x1) + (k2*x2) )/m1
else if(ik==4) thenF=( (c2*dx1) - (c2*dx2) + (k2*x1) - (k2*x2) )/m2
end ifend function
Saída de dados Para as condições iniciais escrita no programa:
Passos Tempo X1 X2 dX1 dX2
0 0,00 1,00000 1,00000 1,00000 1,000001 1,00 1,45830 1,79170 -0,25000 0,50000
Para as mesmas ‘C.I.’, porem com:
h=0.1 (tamanho do passo)tf=50 (tempo em que se deseja achar os valores de x1, x2, dx1, dx2)
0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
X1
X2
Tempo
Deslocamento
Abrir o arquivo “Saida.txt”