Você está na página 1de 2

Program ex1MS

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!DEFINIO DE VARIVEIS!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Implicit None
Real :: Tol
Real :: x,y
Integer :: N,i,j
e iteraes para converger
Real :: P0,P1
Real, dimension(:), allocatable
o e Y(Pn)
logical :: Q

!Tolerncia
!Variveis da funo y(x) em avaliao
!Nmero mximo de Iteraes permitido e numero d
!Aproximaes iniciais do P
:: P,e,Px
!Vetor P(n), e(n) ou err

Q=.true.
i=3
write (*,*) 'MTODO DA SECANTE'
write (*,*) 'Aplicao deste mtodo para calcular a raiz da funo: y(x) = e^x + 2
^(-x) + 2cos(x) - 6'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!DADOS DE ENTRADA!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
write (*,*) 'Insira o valor da tolerncia (Tol) mxima permitida:'
read (*,*) Tol
write (*,*) 'Insira o nmero mximo de iteraes (N) permitido:'
read (*,*) N
allocate (Px(N))
allocate (e(N))
allocate (p(N))
write (*,*) 'Insira um valor aproximado da soluo P0:'
read (*,*) p(1)
call sub1(p(1),Px(1))
print*, 'y(p0)=',Px(1)
write (*,*) 'Insira outro valor aproximado da soluo P1:'
read (*,*) p(2)
call sub1(p(2),Px(2))
print*, 'y(p1)=',Px(2)
e(i-1)=abs((Px(2)-Px(1))/Px(2))
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!APLICAO DO ALGORITMO DA SECANTE!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
do while (i<=N .and. Q)
call sub2 (p(i-1),p(i-2),Px(i-1),Px(i-2),P(i))
call sub1 (p(i),Px(i))
e(i) = abs((P(i)-P(i-1))/(P(i)))
!print*, e(i),i,Px(i),Px(i-1)
if (e(i)<Tol) then

Q=.false.
print*, 'O erro menor que a tolerncia para',i,'iteraes'
end if
i=i+1
end do
if (i==N+1) then
print*, 'O erro no foi menor tolerncia determinada'
print*, 'Inicializar novamente o programa com maior nmero de iteraes ou
com valores iniciais de aproximao diferentes'
else
write (*,*) 'Valor de p para o qual f(p) aproximadamente zero:',p(i1)
write (*,*) 'Valor de f(p)', Px(i-1)
write (*,*) 'Erro relativo:',e(i-1)
end if
open(unit=1, file='erroMS.dat')
do j = 0,i-1
write(1,*) j, e(j)
end do
close(unit=1)
end Program ex1MS
!!!!!!!!!!!!!!!!!!!!!!
!!!!!SUBROUTINAS!!!!!!
!!!!!!!!!!!!!!!!!!!!!!
Subroutine sub1(x,y)
real :: x,y
y = exp(x)+2**(-x)+2*cos(x)-6
return
end Subroutine sub1

!Funo de avaliao

Subroutine sub2(a,b,ya,yb,pn)
real :: a,b,ya,yb,pn
pn = a - ((ya*(a-b))/(ya-yb))
return
end Subroutine sub2

!Algoritmo do mtodo da secante

Você também pode gostar