Resolver equação pelo método da bissecção.

1. Resolver equação pelo método da bissecção.

dyvison pimentel
dyvisonlux

(usa Outra)

Enviado em 26/11/2012 - 19:37h

Estou com um problema pra resolver a equação abaixo. O problema é que eu quero resolver F vs kd e não F vs X. Eu até consegui resolver com o cos(kd) mas entrando com valores um por por para cos(kd) que se torna cansativo. Gostaria se é possível usar um (Do end do) em kd para resolver de forma mais rápida.

* Programa para resolver equacoes de uma variavel pelo metodo da BISSECAO
PROGRAM Biseccion
IMPLICIT NONE
REAL F,
REAL tol
REAL a,b,z
INTEGER nummax,cont

WRITE(*,*)"Introduza o numero maximo de interaçoes:"
READ(*,*) nummax
WRITE(*,*)"Introduza a tolerancia:"
READ(*,*) tol
WRITE(*,*)"Introduza o intervalo:"
WRITE(*,*)"INICIO:"
READ(*,*) a
WRITE(*,*)"FIN"
READ(*,*) b
IF ((a.GT.b).OR.(F(a).EQ.0).OR.(F(b).EQ.0)) THEN
STOP 'Intervalo Incorreto o eh uma raiz de da funcao'
ENDIF
* COMPROVAMOS QUE EXISTE Ao MENOS UM ZERO NESTE INTERVALO
IF ((F(a)*F(b)).LE.0) THEN
WRITE(*,*)"Comprovacao correta"
ELSE
STOP 'Comprovacao incorreta.NO EXISTEM ZEROS NO INTERVALO'
ENDIF
cont=0
DO WHILE(cont.NE.nummax)
cont=cont+1
z=(a+b)/2

IF (F(a)*F(z).LT.0) THEN
b=z
ELSE
a=z
ENDIF
IF ((b-a).LT.tol) THEN
WRITE(*,*)"O RESULTADO APROXIMADADO EH:",z
STOP
ENDIF
WRITE(*,*)"O RESULTADO EH:",z
ENDDO
WRITE(*,*)"O RESULTADO FINAL EH X :",z

STOP

END




FUNCTION F(X)


F = cos(kd)*X**2 - 3

END


  


2. Re: Resolver equação pelo método da bissecção.

Edson Fernando Fumachi
eff666

(usa Debian)

Enviado em 26/11/2012 - 22:57h

Prezado,

trabalho com FORTRAN77 e escrevi a versao do metodo da biseccao (abaixo).
lembro que em FORTRAN77 temos o seguinte:
a primeira linha contém C23456789, onde C (comentário), está na primeira coluna, o 2 representa a 2a. coluna, o 3 a 3a. coluna e assim sucessivamente até a coluna 73 (final do arquivo de edicao em FORTRAN77.
A primeira coluna está reservada para os caracteres "*", ou "c" que representam comentário;
da segunda à quinta coluna são as colunas para você numerar de acordo com o seu código;
a sexta coluna serve para você colocar o caracter "&" para continuar a linha anterior do código;
A sétima coluna serve para você digitar os comandos.

Estou dizendo isso pois a forma como o meu código aparecerá no post, ficará formatado errado e vc, deve arrumar aí, no seu micro.


******************************************************************************
C23456789
PROGRAM bisection
*Definicao das variaveis, x inicial, final, raiz e function of x (fofx)
DOUBLE PRECISION x_initial, x_final, root, fofx
*Chama a fofx
external fofx
x_initial = 0.d0
x_final = 2.d0
*Chama a subrotina biseccao
CALL bisect(x_initial, x_final, root, fofx)
*fim do PROGRAM
end

*Inicio da fofx
DOUBLE PRECISION FUNCTION fofx(x)
DOUBLE PRECISION x
*definir a sua funcao
fofx = cos(x)-x
*fim da funcao fofx
end

*inicio da subrotina bisect
SUBROUTINE bisect(left,right,middle,f)
*definicao dos limites a,b e z como vc chamou na sua funcao
DOUBLE PRECISION left,right,middle
*definicao de f(a),f(b) e f(z)
DOUBLE PRECISION fleft,fright,fmiddle,f
*definir a tolerancia e o erro
DOUBLE PRECISION tol,error
*definir o valor da tol (fixo)
PARAMETER(tol = 1.d-06)
Fleft=f(left)
Fright=f(right)
*aqui esta o lance para fazer sozinho ate chegar na raiz com a tol desejada
10 middle=(left+right)/2
Fmiddle=f(middle)

IF(fleft*fmiddle .LE. 0) THEN
right=middle
fright=fmiddle
ELSE
left=middle
fleft=fmiddle
ENDIF
error=ABS((right-left)/middle)
IF(error .GT. tol) GOTO 10
WRITE(*,*)'Root found at ', middle
END
*******************************************************************************

espero que tenha ajudado!
qualquer problema, não hesite em perguntar!

Abraco






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts