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 extrapolação, o passo inicial deve ser , o usuário também deve informar o número de casas decimais corretas que deseja. Observação: se é o número de casas corretas, então o erro absoluto é menor que , pois é uma aproximação para casas decimais via truncamento.
Passo 1
Beleza, então o que o exercício pede é: “Criar um código em FreeMat que calcule a raiz quadrada de um número (entre 0 e 10000) que o usuário digita, usando o chamado método da extrapolação (que na prática é o método de Newton para raízes). Começamos sempre com um chute inicial . Além disso, o usuário informa quantas casas decimais ele quer de certeza: se ele disser , a gente garante que o erro absoluto é menor que (via truncamento).”
Conteúdo envolvido:
Método iterativo de Newton (também chamado de método das tangentes ou extrapolação) para aproximar raízes.
Critério de parada baseado em erro absoluto e truncamento de casas decimais.
Comandos básicos de FreeMat: input, while, arredondamento/truncamento, impressão de resultados.
Passo 2
Primeiro, a teoria do método de Newton para achar :
Seja a nossa aproximação no passo . A fórmula para melhorar essa aproximação é
Isso vem de ajustar a reta tangente à função . Cada iteração “puxa” a gente para mais perto da raiz real.
Passo 3
Decidir como parar as iterações:
O enunciado quer erro absoluto . Como a gente não sabe exato, usa-se o truque de comparar duas aproximações seguidas:
Quando isso acontecer, paramos. Em seguida truncamos o resultado para casas: se é a aproximação final, fazemos
Passo 4
Agora o esqueleto do algoritmo em FreeMat (sintaxe parecida com MATLAB):
// Entrada de dados
A = input('Digite um número entre 0 e 10000: ');
n = input('Quantas casas decimais de precisão você quer? ');
// Preparação
P = 10; // chute inicial
epsilon = 10^(-n); // erro máximo permitido
diff = Inf; // para forçar a entrada no laço
// Laço de iteração de Newton
while diff > epsilon
P_old = P;
P = (P_old + A/P_old)/2; // fórmula de Newton para sqrt
diff = abs(P - P_old); // quanto nos aproximamos a cada passo
end
// Truncamento para n casas decimais
resultado = floor(P * 10^n) / 10^n;
// Saída
disp(['A raiz aproximada de ', num2str(A), ' é ', num2str(resultado)]);
Resposta
O algoritmo acima garante que a diferença entre duas aproximações seguidas seja menor que e depois faz o truncamento em casas decimais, entregando a raiz quadrada aproximada de .