1.3.3 Funções como Métodos Gerais
Introduzimos funções compostas na seção 1.1.4 como um mecanismo para abstrair padrões de operações numéricas de modo a torná-los independentes dos números particulares envolvidos. Com funções de ordem superior, como a função integral da seção 1.3.1, começamos a ver um tipo mais poderoso de abstração: funções usadas para expressar métodos gerais de computação, independentemente das funções particulares envolvidas. Nesta seção discutimos dois exemplos mais elaborados — métodos gerais para encontrar zeros e pontos fixos de funções — e mostramos como esses métodos podem ser expressos diretamente como funções.
Encontrando raízes de equações pelo método da metade do intervalo
O método da metade do intervalo é uma técnica simples mas poderosa para encontrar raízes de uma equação , onde é uma função contínua. A ideia é que, se nos forem dados pontos e tais que , então deve ter pelo menos um zero entre e . Para localizar um zero, seja a média de e e calcule . Se , então deve ter um zero entre e . Se , então deve ter um zero entre e . Continuando dessa maneira, podemos identificar intervalos cada vez menores nos quais deve ter um zero. Quando chegamos a um ponto onde o intervalo é pequeno o suficiente, o processo para. Como o intervalo de incerteza é reduzido pela metade em cada passo do processo, o número máximo de passos necessários cresce como , onde é o comprimento do intervalo original e é a tolerância de erro (isto é, o tamanho do intervalo que consideraremos "pequeno o suficiente").
Aqui está uma função que implementa esta estratégia:
Carregando playground de código...
Assumimos que inicialmente recebemos a função juntamente com pontos nos quais seus valores são negativos e positivos. Primeiro calculamos o ponto médio dos dois pontos dados. Em seguida, verificamos se o intervalo dado é pequeno o suficiente e, se for, simplesmente retornamos o ponto médio como nossa resposta. Caso contrário, calculamos como um valor de teste o valor de no ponto médio. Se o valor de teste for positivo, continuamos o processo com um novo intervalo indo do ponto negativo original até o ponto médio. Se o valor de teste for negativo, continuamos com o intervalo do ponto médio ao ponto positivo. Finalmente, há a possibilidade de que o valor de teste seja 0, caso em que o ponto médio é em si a raiz que estamos procurando.
Para testar se os pontos finais estão "próximos o suficiente", podemos usar uma função similar à usada na seção 1.1.7 para calcular raízes quadradas:1
Carregando playground de código...
A função search é complicada para usar diretamente, porque podemos acidentalmente fornecer pontos nos quais os valores de não têm o sinal necessário, caso em que obteríamos uma resposta errada. Em vez disso, usaremos search por meio da seguinte função, que verifica quais dos pontos finais tem um valor de função negativo e qual tem um valor positivo, e chama a função search de acordo. Se a função tiver o mesmo sinal nos dois pontos dados, o método da metade do intervalo não pode ser usado, caso em que a função sinaliza um erro.2
Carregando playground de código...
O exemplo a seguir usa o método da metade do intervalo para aproximar como a raiz entre 2 e 4 de :
Carregando playground de código...
Aqui está outro exemplo, usando o método da metade do intervalo para procurar uma raiz da equação