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 P=10, o usuário também deve informar o número de casas decimais corretas que deseja. Observação: se n é o número de casas corretas, então o erro absoluto é menor que 10^-n, pois é uma aproximação para n 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 Pk+1 ;=; Pk + APk2, :
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 l|Pk+1 - Pkr| < 10^-n . Como a gente não sabe resu 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 .

Exercícios relacionados