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 do zigue-zague, o passo inicial deve ser
, o usuário também deve informar o número de casas decimais corretas que deseja.
Passo 1
Beleza, então o que a gente tem que fazer é escrever um script no FreeMat que peça ao usuário:
- um número
entre 0 e 10 000, - a quantidade de casas decimais que ele quer acertar, digamos
.
Queremos aproximarusando o chamado “método do zigue-zague”, começando com um passo inicial .
Conteúdo da matéria: métodos numéricos simples para encontrar raízes (aqui a raiz quadrada), laços de repetição, condições e controle de erro pela precisão decimal.
Passo 2
Primeiro, vamos entender a ideia do método do zigue-zague. A gente mantém dois valores:
- um palpite
para a raiz, que começa em 0, - e um “passo”
que começa em 10.
Enquanto o palpite não estiver bom o suficiente, a gente:
- Testa se
. Se for, significa que precisamos aumentar , então fazemos . - Se por acaso
passar de , ou seja, , a gente acabou de ultrapassar o valor alvo.
Nesse caso, a gente “volta” um passo (porque passou do ponto) e troca o sinal depara negativo e ainda reduz seu tamanho por 10, ou seja, faz
Isso faz com que o valor de
oscile (zigue-zague) e vá refinando a aproximação cada vez mais fino.
Passo 3
Agora, precisamos de um critério de parada baseado em casas decimais. Se o usuário quer
casas decimais, a gente quer que o tamanho do nosso passo chegue a
. Quando o passo ficar menor que isso, não faz sentido continuar porque já estamos refinando abaixo da casa decimal desejada.
Resumo do critério:
“Continue enquanto . Quando
, pare: o
atual tem
casas corretas.”
“Continue enquanto
Passo 4
Juntando tudo, vamos ao algoritmo em FreeMat. Ele tem essa estrutura:
// Pergunta ao usuário
n = input('Entre com o número n (0 a 10000): ');
d = input('Quantas casas decimais você quer? ');
// Inicialização
x = 0;
P = 10;
limite = 10^(-d);
// Loop zigue-zague
while abs(P) >= limite
if x^2 < n
// ainda podemos subir
x = x + P;
else
// passou do alvo, volta e refina
x = x - P;
P = -P/10;
end
end
// Exibe o resultado formatado
resultado = round(x, d);
disp(['Aproximação de sqrt(n) com ', num2str(d), ' casas é: ', num2str(resultado)]);
Resposta
O algoritmo acima, quando executado no FreeMat, pergunta o valor
e o número de casas
, e devolve uma aproximação de
com exatamente
casas decimais usando o método de zigue-zague com passo inicial
.