Exercícios Resolvidos de Analisando seu programa

Ver Teoria

Enunciado

A função abaixo serve para avaliar o polinômio quadrático g x = a 2 x 2 + a 1 x + a 0 :

Onde a a é um vetor com os coeficientes do polinômio g ( x ) a a = a 2 , a 1 , a 0 e x x é o valor de x para o qual queremos avaliar g ( x ) .

Usando o programa teste abaixo, a função apresentou erros.

Usando o debugger do MATLAB e o programa teste, identifique e corrija os erros da função a v a l i a r _ p o l i .

Passo 1

Neste exercício, vamos procurar erros na função a v a l i a r _ p o l i rodando um programa teste.

Passo 2

O primeiro passo é passar a limpo os códigos do enunciado. Em um novo script, copie a função a v a l i a r _ p o l i :

A função a v a l i a r _ p o l i tem duas entradas e uma saída. A entrada a a deve ser um vetor com os coeficientes do polinômio g x = a 2 x 2 + a 1 x + a 0 e a entrada x x , o valor de x com o qual calcularemos g ( x ) .

A saída g g é g ( x ) calculado para o valor x x .

Na linha 2, deseja-se criar um vetor de zeros por meio da função z e r o s , de mesmo comprimento de x x . Este vetor se chama g g e armazenará os valores de g ( x ) para x x .

Na linha 3, deseja-se atualizar os valores de g g , calculando g ( x ) para x x .

Em outro script em branco, copie o programa teste e salve-o na mesma pasta onde você salvou a função a v a l i a r _ p o l i :

Assim como fizemos para a v a l i a r _ p o l i , vamos ver o que cada linha faz no programa teste. Na primeira linha, o comando c l e a r   a l l limpa o Workspace do MATLAB cada vez que o programa é rodado. Como procuramos erros na função a v a l i a r _ p o l i e teremos que chamá-la várias vezes para ver se corrigimos alguma coisa e encontrar mais erros, é importante limpar o Workspace a cada tentativa.

Na segunda linha, o comando c l c limpa o Command Window do MATLAB cada vez que o programa é executado. Novamente, como vamos rodar o código diversas vezes, é importante limpar o Command Window a cada tentativa, para ficar mais fácil de ver qual erro foi corrigido e qual é o erro a ser corrigido na sequência, caso exista.

No programa teste, testamos a v a l i a r _ p o l i em três casos diferentes, mas todos com o mesmo vetor de coeficientes de g ( x ) . Na linha 4, criamos o vetor c o e f contendo os coeficientes de g ( x ) .

Na linha 5, testamos g ( x ) para x = 0 , chamando a v a l i a r _ p o l i tendo como entrada c o e f e 0 . Logo abaixo, imprimos o resultado de g ( x ) para x = 0 no Command Window por meio do comando d i s p .

Na linha 7, testamos g ( x ) para x = 5 , chamando a v a l i a r _ p o l i tendo como entrada c o e f e 5 . Novamente, na linha 8, imprimos o resultado de g ( x ) para x = 5 no Command Window usando d i s p .

Na linha 9, cria-se um vetor x que vai de - 5 a 5 , com um passo de 0,1 . Na linha 10, chamamos a função a v a l i a r _ p o l i tendo como entrada c o e f e esse vetor x .

Passo 3

Vamos executar o programa e ver qual o primeiro erro que o MATLAB encontra:

Ele nos diz que há um erro na linha 5 do programa teste, onde a função a v a l i a r _ p o l i é chamada pela primeira vez. Este erro está em a v a l i a r _ p o l i , na linha 3, e este erro é que a variável a 2 é desconhecida.

Se revermos o código de a v a l i a r _ p o l i , vemos que as variáveis da linha 3, a 2 , a 1   e a 0 , não foram definidas na função. Elas devem ser definidas a partir do vetor a a , que contém os coeficientes do polinômio. E repare: em nenhum momento em a v a l i a r _ p o l i o vetor a a foi utilizado.

Para corrigir isto, inclua no começo da função os comandos:

Pois a a = a 2 , a 1 , a 0 , como dito no enunciado. Desta forma, a função ficou com essa cara:

Passo 4

Execute o programa teste de novo para ver se corrigimos o erro:

O erro anterior sumiu, mas o MATLAB achou outro. Novamente, há um erro na linha 5 do programa teste, onde a função a v a l i a r _ p o l i é chamada pela primeira vez. Este erro está em a v a l i a r _ p o l i , na linha 7, e este erro é que g g é um vetor, e vetores não pode ter índices iguais a 0 . Isto acontece pois na linha 7 temos g g ( x x ) e x x = 0 , logo, o MATLAB vai considerar g g ( 0 ) e considerará um erro.

Para corrigir isso, simplesmente apague o ( x x ) do lado de g g na linha 7:

Passo 5

Rode o programa teste de novo para ver se finalmente conseguimos avançar além da linha 5 dele:

Opa, apareceram um 2 e um 7 ali, isso indica que o programa rodou direitinho até a linha 8 do programa do teste. O 2 e o 7 vieram do comando d i s p ( g ) das linhas 6 e 8, pois a linha 6 mostra o resultado de g 0 = 1 ∙ 0 2 - 4 ∙ 0 + 2 = 2 e a linha 8, de g 5 = 1 ∙ 5 2 - 4 ∙ 5 + 2 = 7 .

Após imprimir o 7 , o MATLAB nos diz que há um erro na linha 10 do programa teste, quando a função a v a l i a r _ p o l i é chamada pela terceira vez, tendo como entrada c o e f e o vetor x . Como x é um vetor, o MATLAB não consegue criar o vetor de zeros na linha 6 de a v a l i a r _ p o l i , pois a função z e r o s só aceita números escalares como entrada.

Podemos corrigir esse erro pensando no que a linha 10 do programa faz. Na linha 10 do programa teste, queremos aplicar a função a v a l i a r _ p o l i em um vetor x , de forma a avaliar g ( x ) para vários valores de uma tacada só. Do jeito que a v a l i a r _ p o l i está, ela só calcular g ( x ) se a entrada x x for um número, não um vetor.

Para isto, em a v a l i a r _ p o l i , apague a linha que contém g g = z e r o s ( 1 , x x ) :

Passo 6

Após apagar o comando g g = z e r o s ( 1 , x x ) , na atual linha 6 de a v a l i a r _ p o l i , onde g ( x ) é calculado, adicione um ponto à direita de x x em a 2 * x x ^ 2 , de forma que a nova sintxe fica assim:

Isso faz com que, quando x x é um vetor, cada elemento dele seja elevado ao quadrado, de forma que a saída de g g também será um vetor. Essa operação não trará problemas quando x x for simplesmente um número, como podemos ver ao executar o programa após essa alteração:

O programa roda normalmente, sem mensagens de erro. Se quiser, você pode ver o resultado da terceira aplicação de a v a l i a r _ p o l i na linha 10 do programa teste, imprimindo g no Command Window.

Pronto! Função a v a l i a r _ p o l i corrigida! E gora ela funciona tanto para a entrada x x sendo um número escalar ou um vetor ;)

Resposta

Ei, a resposta está no passo a passo :)