Vibrações - Runge Kutta

7
Universidade Federal Fluminense – PUVR EEIMVR - Escola de Engenharia Industrial Metalúrgica de Volta Redonda Vibrações Método de Runge-Kutta Data: 12/12/2010 Professor: Alberto Paiva

Transcript of Vibrações - Runge Kutta

Page 1: 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

Page 2: Vibrações - Runge Kutta

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

Page 3: Vibrações - Runge Kutta

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)

Page 4: Vibrações - Runge Kutta

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

Page 5: Vibrações - Runge Kutta

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”

Page 6: Vibrações - Runge Kutta