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:

  1. Dado o intervalo [xmin, xmax] .
  2. Neste intervalo, existe apenas no máximo um zero.
  3. A função é contínua neste intervalo.

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:

  1. Modifique o programa de tal forma que os dados XMIM e XMAX sejam lidos por um arquivo de dados, por exemplo, INTVAL.DAT.
  2. Procure o raíz da função, f(x)=xex-1 no intervalo, [0,1].
  3. 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