Calcular
o Zero de uma Função Um dos problemas que ocorre mais frequentemente é obter um dos raízes de equação de seguinte forma:
f(x)=0
Gostariamos então, construir um subroutina que faz este
servico. Entretanto, se a função f(x) for completamente geral, este
não é uma tarefa trivial. Do ponto de vista de cálculo númerico, a função
f(x) seria apenas um subprograma que, quando um valor é atribuido
para a variável x na hora de chamada, devolve o valor da f
na hora de retorno. Em outras palavras, a função f(x) é dada a
ponto a ponto, sem referir nenhuma propriedade analítica da função.
Neste sentido, o processo de procurar numericamente o zero de uma função
é bem análogo ao que ocorre quando uma pessoa cega procurar um buraco no
chão utlizando somente sua bengala alongo ao seu caminho. Mas, ficaria
quase impossível deste cego encontrar os buracos se sua a área de procura
for muito grande.. Analogamente, mesmo para um computador, não é possiível
procurar todos os possíveis zeros no intervalo, - < x <+ qundo
não tem nenhuma informação adicional a função f(x). Dependendo da
informação, o metódo de procurar pode variar. Por exemplo, se soubesse
que a função f(x) é um polinômio de ordem n, existe um metódo
apropriado para buscar n zeros desta função(REF). Aqui, vamos considerar
que a função é geral, mas com seguintes condições:
Com estas condições, podemos construir o algoritmo para
procular o zero, x0. Para isto, vamos lembrar que para
um intervalo [x1,x2]
f(x1)f(x2)<0, se x0[x1,x2]
f(x1)f(x2)>0, se x0[x1,x2]
Podemos aplicar o método de bisection. A idéia é que dividir
o intervalo em meio, e julgar em que lado o raíz está contido usando o
critério acima. Uma vez verificado o semi-intervalo que contém o raíz,
divide de novo este intervalo em metade e repete o procecco. Abaixo, segue
o programa em FORTRAN, que busca o zero de uma função qualquer preparado
na forma de subprograma FUNCTION. Neste exemplo, o programa busca raízes
de funções SIN(x) e COS(x) no intervalo de [-/4,3/4].
c Programa principal para chamar o subroutina de calcular zero de uma funcao.
EXTERNAL FUNC1, FUNC2
DATA Pi/3.1415927/
XMIN=-0.25*Pi
XMAX=0.75*Pi
CALL Zero_of_F(FUNC1,XMIN, XMAX,ZERO)
WRITE(*,*) 'O zero de Sin(x)', ZERO
CALL Zero_of_F(FUNC2,XMIN, XMAX,ZERO)
WRITE(*,*) 'O zero de Cos(x)', ZERO
STOP
END
FUNCTION FUNC1(X)
FUNC=SIN(X)
RETURN
END
FUNCTION FUNC1(X)
FUNC=COS(X)
RETURN
END
SUBROUTINE Zero_of_F (F,XMIN, XMAX,ZERO)
DATA EPS/0.1E-08/
ZERO=XMIN
F1=F(XMIN)
IF(F1 .EQ.0.) RETURN
ZERO=XMAX
F2=F(XMAX)
IF(F2.EQ.0.) RETURN
IF(F1*F2.GT.0.) THEN
WRITE(*,*) 'NO ZERO IN THIS INTERVAL'
RETURN
ENDIF
D=XMAX-XMIN
1 D=0.5*D
IF(ABS(D) .LT.EPS*ABS(ZERO) RETURN
ZERO=ZERO-D
FM=F(ZERO)
IF(FM.EQ.0.) RETURN
IF(F2*FM.LT.0.) THEN
F1=FM
ZERO=ZERO+D
GO TO 1
ELSE
F2=FM
GO TO 1
END IF
RETURN
END
Em geral, em FORTRAN, os nomes de variáveis, funções e
subroutinas são limitados no máximo 6 (ou 7) letras. Mas o uso de _ (underline)
pode mendar os nomes de tal forma que os nomes ficam autoexplicativo no
programa. A primeira linha é avisar para o compilador que os nomes FUNC1
e FUNC2 que aparecem como argumento de subroutina não são variáveis mas
os nomes de subprogramas. Desta forma, podemos usar este programa para
qualquer função que queremos encontrar o raíz. Para isto, basta construir
o subprograma que calcula a função com o argumento x, com o nome
arbitrário e incluir este nome no comando EXTERNAL. Por exemplo, se quer
calcular o zero da função, x3+x+1, construimos o subprograma,
FUNCTION CUBO(X)
CUBO=X**3+X+1
RETURN
e alteramos a linha EXTERNAL no programa principal,
EXTERNAL CUBO
e chamar o subroutina Zero_of_F com este nome,
CALL Zero_of_F(CUBO,XMIN, XMAX,ZERO)
Exercícios:
Construa o programa de obter todos os raízes, com uma
resolução de DX, de uma função dentro de um intervalo especificado.
Prof. Takeshi Kodama
Ultima Alteração: 04 de novembro de 1996