Faça um algoritmo no Freemat para determinar uma aproximação para a raiz quadrada de um número entre 0 e 10000, informado pelo usuário, utilizando o método da bissecção com apenas um critério de parada, amplitude do intervalo, que contém a solução, ficar menor que a precisão informada, o intervalo inicial deve ser
.
Passo 1
Beleza, o exercício pede pra gente criar um algoritmo no FreeMat que aproxime a raiz quadrada de um número
usando o método da bissecção. O intervalo inicial é
(porque
) e a gente para quando a largura do intervalo ficar menor que a precisão
que o usuário informar. O conteúdo aqui é Métodos Numéricos – especificamente, o método da bissecção – e vamos precisar entender como dividir o intervalo ao meio e testar qual metade contém a raiz.
Passo 2
Primeiro, a gente lê do usuário o número
e a precisão
, e define os extremos do nosso intervalo:
a = 0;
b = 100;
A ideia é que, a cada iteração, a gente calcule o ponto médio
a = 0;
b = 100;
A ideia é que, a cada iteração, a gente calcule o ponto médio
e veja se
é maior ou menor que
. Isso é o core do método da bissecção.
Passo 3
Na teoria da bissecção, em cada passo a gente testa:
– se , significa que
está entre
e
, então faz
;
– senão, está entre e
, então faz
.
Isso garante que a cada iteração o intervalo que contém a raiz fica pela metade.
– se
– senão, está entre
Isso garante que a cada iteração o intervalo que contém a raiz fica pela metade.
Passo 4
O critério de parada é simplesmente quando a largura do intervalo
for menor que
. Ou seja, a gente repete:
while
…dividir ao meio e ajustar ou
…
end
Quando sair do loop, o intervalo está tão pequenininho que qualquer ponto dentro dele é uma boa aproximação.
while
…dividir ao meio e ajustar
end
Quando sair do loop, o intervalo
Passo 5
Por fim, a gente pode tomar como valor aproximado da raiz do
o ponto médio final
Isso faz sentido porque é o “meio” do menor intervalo que ainda contém a solução.
Resposta
% Leitura dos dados
x = input('Digite um número entre 0 e 10000: ');
while x < 0 | x > 10000
x = input('Valor inválido! Entre 0 e 10000: ');
end
eps = input('Digite a precisão desejada: ');
% Intervalo inicial
a = 0;
b = 100;
% Método da bissecção
while (b - a) > eps
m = (a + b) / 2; % ponto médio
if m^2 > x
b = m; % raiz está em [a, m]
else
a = m; % raiz está em [m, b]
end
end
% Aproximação final
raiz = (a + b) / 2;
disp(['Aproximação de sqrt(', num2str(x), ') = ', num2str(raiz)]);