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 P=10, 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:
  1. um número entre 0 e 10 000,
  2. a quantidade de casas decimais que ele quer acertar, digamos .
    Queremos aproximar usando 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 x = x - P, P = -P10 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:
  1. Testa se . Se for, significa que precisamos aumentar , então fazemos .
  2. 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 de para 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.”

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 .

Exercícios relacionados