Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
LABORATÓRIO – AULA 02
1. INTRODUÇÃO
Nesta aula prática estudaremos alguns problemas que são expressos, matematicamente, como
equações não lineares, ou seja, iremos determinar a raiz dessas equações, em computador. A
ferramenta computacional que empregaremos é o Scilab, com o qual nos familiarizamos na
Aula 01 de Laboratório.
Na resolução das equações não lineares, empregaremos os métodos que aprendemos nas
aulas teórica: bissecção, falsa posição, ponto fixo, newton-raphson e secante. Cada um desses
métodos foi implementado como uma função do Scilab, armazenada em arquivos de extensão
.sci. A esta altura, você já deve ter copiado os arquivos ‘bisecção.sci’, ‘falsaposicao.sci’,
‘pontofixo.sci’, ‘newtonraphson.sci’ e ‘secante.sci’ para alguma pasta em seu computador.
Essa pasta será o diretório de trabalho para tudo o que for realizado nesta aula.
2.1. FUNÇÕES
ATIVIDADE PRÁTICA
Comentários
Toda definição de função começa com a palavra function e termina com
endfunction. Entre elas fica o corpo da função. A linha que começa com function é
chamada cabeçalho.
Agora a função está pronta para ser usada, isto é, podemos executar uma
chamada de função. Execute o comando:
27.
quadrado =
9.
ATIVIDADE PRÁTICA
-->deff('[x2, x3]=potencias(x)',['x2=x^2';'x3=x^3;'])
-->[x2, x3]=potencias(3)
x3 =
27.
x2 =
9.
O terceiro modo de definir uma função é armazenar o código da função em um
arquivo. Desta maneira, o código não se perde quando a sessão de trabalho é
encerrada.
As funções escritas pelo usuário, por uma convenção da comunidade Scilab, ficam
armazenadas em arquivos de extensão .sci. Como são arquivos de texto, qualquer
editor de texto pode ser utilizado para escrever uma função e gravar o arquivo .sci
correspondente. No entanto, o Scilab oferece um editor de texto próprio chamado
SciNotes que pode ser acessado através do menu da Janela Principal do Scilab pela
sequência Aplicativos -> SciNotes. É recomendável utilizar sempre o SciNotes,
porque esse editor apresenta uma série de realces que facilitam muito a escrita e a
leitura de um arquivo .sci (o mesmo vale para os arquivos de script que serão
vistos no próximo item).
A questão, agora, é: como uma função que está armazenada em um arquivo pode
ser chamada durante uma sessão de trabalho? O Scilab fornece um procedimento
em duas etapas. Na primeira etapa, a função passa a integrar o ambiente de
trabalho, ou seja, fica disponível para ser executada. Isto é feito através do
comando exec:
--> exec(“nome_da_funcao.sci”);
Observe que, com o comando exec a função não é executada, de fato; ela, apenas
fica disponível para uso. Vamos repetir a ATIVIDADE PRÁTICA anterior só que,
desta vez, utilizando arquivos.
ATIVIDADE PRÁTICA
-->exec("potencias.sci");
-->[quadrado, cubo]=potencias(4)
cubo =
64.
quadrado =
16.
Observe que, a partir do próprio SciNotes é possível carregar o arquivo .sci para
uso futuro. Para isso, no Menu Principal do SciNotes, selecione a opção Executar e,
a seguir, uma das opções exibidas. Experimente com elas e veja o resultado na
Console.
2.2. SCRIPTS
Um script também pode ser criado com o editor SciNotes, mas uma diferença
entre funções e scripts é que, enquanto funções são armazenadas em arquivos
com extensão .sci, por convenção, scripts são armazenados em arquivos com
extensão .sce.
--> exec(“estudoconvergencia.sce”);
x0 Estimativa inicial
f Função cuja raiz será determinada
fp Derivada da função f
tol Tolerância pré-especificada
imax Número Máximo de Iterações
Os parâmetros x0, tol e imax são números que podem ser fornecidos diretamente
na chamada da função newtonraphson. Os parâmetros f e fp são nomes de
funções que avaliam, respectivamente, o valor da função matemática, f, e da
derivada de f, fp, em um determinado ponto. Devem ser definidas separadamente,
de acordo com o que foi estudado no item 2.
Os parâmetros de saída, por sua vez, são os mesmos para todos os métodos e é
importante que seja assim porque permite compará-los entre si.
Como vimos nas aulas teóricas, uma maneira de determinar a estimativa inicial (ou
duas estimativas no caso de alguns dos métodos) é fazer o gráfico da função e
identificar, aproximadamente, em que ponto o gráfico cruza o eixo das abscissas.
Vamos fazer o gráfico da função y=e-x-x, no intervalo [0,5]; esse intervalo pode ser
ajustado se for necessário para identificar melhor onde o gráfico cruza o eixo x. No
nosso caso, será suficiente e escolhemos 51 pontos igualmente espaçados para
avaliar a função. Também exibimos uma grade porque isso facilita a identificação
da estimativa inicial.
ATIVIDADE PRÁTICA: GRÁFICO DA FUNÇÃO
-->x=linspace(0,5,51);
-->y=exp(-x)-x;
-->plot(x,y);
-->xgrid
O resultado final é:
Na próxima atividade prática, você terá que digitar, na Console do Scilab, uma
longa sequência de comandos cujo resultado final é a determinação da raiz da
função de teste, através de cada um dos métodos numéricos estudados do ponto
de vista teórico em sala de aula.
ATIVIDADE PRÁTICA
// VÁ PARA A PASTA DE TRABALHO (ONDE ESTÃO AS FUNÇÕES QUE
IMPLEMENTAM OS MÉTODOS
// NO MENU PRINCIPAL, SELECIONE A SEQUÊNCIA "ARQUIVO -> ALTERAR
DIRETÓRIO ATUAL..."
xl = 0.5;
xu = 0.7;
x0 = xl;
tol = 0.0001;
//=========================================================
// BISSECÇÃO
//=========================================================
exec("bisseccao.sci");
//=========================================================
// FALSA POSICAO
//=========================================================
exec("falsaposicao.sci");
//=========================================================
// PONTO FIXO
//=========================================================
function [y]=expx_fp(x)
y=exp(-x);
endfunction
exec("pontofixo.sci");
exec("newtonraphson.sci");
//=========================================================
// SECANTE
//=========================================================
exec("secante.sci");
[nr nc]=size(ea_falsap);
niter=linspace(1,nr,nr);
plot(niter,ea_falsap,'gx-');
[nr nc]=size(ea_pfixo);
niter=linspace(1,nr,nr);
plot(niter,ea_pfixo,'bs-');
[nr nc]=size(ea_newton);
niter=linspace(1,nr,nr);
plot(niter,ea_newton,'cd-');
[nr nc]=size(ea_secante);
niter=linspace(1,nr,nr);
plot(niter,ea_secante,'vm-');
xlabel("Número de Iterações","fontsize",4,"color","red");
ylabel("Erro Relativo Aproximado","fontsize",4,"color","red");
title("Gráfico de Convergência","color","red","fontsize",4);
//xtitle("Gráfico de Convergência f(x)=exp(-x)-x", "Número de Iterações", "Erro
Relativo Aproximado");
legend("Bissecção", "Falsa Posição", "Ponto Fixo", "Newton-Raphson",
"Secante");
O gráfico de convergência obtido deve ser o da figura abaixo:
ATIVIDADE PRÁTICA
Com base no que foi aprendido nas aulas teóricas, interprete o gráfico de
convergência.
Verifique quantas iterações foram necessárias para cada método convergir
construindo uma tabela simples com o comando:
itermatriz=[..
"Bissecção ", msprintf('%d',iter_bisec);
"Falsa Posicao ", msprintf('%d',iter_falsap);
"Ponto Fixo ", msprintf('%d',iter_pfixo);
"Newton-Raphson", msprintf('%d',iter_newton);
"Secante ", msprintf('%d',iter_secante)]
set(gca(),"data_bounds",matrix([0,8,0,3],2,-1));
(por ora, não discutiremos esse commando, use-o como uma “caixa preta”).
O resultado é:
Suponha que você deseje realizar vários estudos variando, por exemplo, os
parâmetros do problema como as estimativas iniciais, a tolerância, etc. Seria um
grande desperdício de tempo e energia digitar todos os comandos novamente.
Esta é uma típica situação em que scripts devem ser usados. Todos os comandos
digitados anteriormente podem ser coletados e armazenados em um arquivo de
script que, como vimos, possui extensão .sce. Para agilizar as atividades práticas,
isso já foi feito previamente e está no arquivo ConvergenciaMetodos.sce.
ATIVIDADE PRÁTICA
exec(“ConvergenciaMetodos.sce”);
ATIVIDADE PRÁTICA