Escrever em Scilab uma função que resolve uma equação
pelo método da bisseção, conforme visto em sala.
i) Você vai precisar escolher as funções
, visto que uma função não pode ser dada de argumento de entrada. Escolha duas funções
e
para encontrar suas raizes.
ii) Ao escrever sua função, quando você tiver que avaliar a função, no passo onde você pergunta se
, no lugar de
você irá avaliar as funções escolhidas
e
.
iii) Faça um if no começo do algoritmo indicando se a função escolhida será a função
ou a
, assim você pode trocar a fórmula da avaliação de
ou
conforme o caso do if em que você estiver.
iv) Seu algoritmo precisará de um critério de parada: você pode fazer as iterações dentro de um laço while e terminar o laço quando por exemplo o valor de
for menor que uma tolerância pequena à sua escolha.
i) Você vai precisar escolher as funções
ii) Ao escrever sua função, quando você tiver que avaliar a função, no passo onde você pergunta se
iii) Faça um if no começo do algoritmo indicando se a função escolhida será a função
iv) Seu algoritmo precisará de um critério de parada: você pode fazer as iterações dentro de um laço while e terminar o laço quando por exemplo o valor de
Passo 1
Beleza, vamos recapitular o que a questão pede. Você precisa criar uma função em Scilab que ache a raiz de uma função qualquer
usando o método da bisseção. Como não dá pra passar função como argumento, a gente vai definir dentro da própria função duas opções:
No começo você usa um (ou a largura do intervalo) ficar menor que uma tolerância que você definir.
if
pra escolher qual delas vai usar, e depois implementa o laço while
que encerra quando o valor de
Conteúdo: programação em Scilab + método numérico de bisseção. Vamos precisar entender como funciona esse método e como traduzir isso em Scilab.
Passo 2
Teoria do método da bisseção (passo a passo mesmo):
- Começamos com um intervalo
tal que . Isso garante que há uma raiz entre e . - Calculamos o ponto médio
e avaliamos . - Se
, a raiz está em , então atualizamos . Senão, está em , então atualizamos . - Repetimos até que o intervalo seja suficientemente pequeno ou
.
Essa é a lógica que vamos codificar.
Passo 3
Escolha das funções e parâmetros:
-
, raiz exata em . -
, raiz perto de (ou seja, ). - Intervalos iniciais, por exemplo: para
use ; para use também (pois e ). - Tolerância
(você pode mudar, mas é um valor razoável).
Passo 4
Estrutura da função em Scilab:
function raiz = bissecao(flag, a, b, tol)
// flag = 1 para f1, = 2 para f2
if flag == 1 then
f = x -> x^2 - 2;
else
f = x -> sin(x) - 0.5;
end
// Verifica condição inicial
if f(a)*f(b) > 0 then
error("Intervalo inválido: f(a)*f(b) deve ser < 0");
end
Aqui a gente já escolheu qual função usar e garante que
.
Passo 5
Implementando o laço de bisseção:
while abs(b - a) > tol // ou abs(f((a+b)/2)) > tol
m = (a + b)/2;
if f(a)*f(m) < 0 then
b = m;
else
a = m;
end
end
raiz = (a + b)/2;
endfunction
Explicando cada linha:
while abs(b - a) > tol
: repete enquanto o tamanho do intervalo for maior que a tolerância.m = (a + b)/2
: calcula o meio.if f(a)*f(m)<0
: decide em qual metade está a raiz.- Atualiza
a
oub
e volta prowhile
. - No fim,
raiz = (a+b)/2
dá o valor aproximado da raiz.
Resposta
Função completa em Scilab:
function raiz = bissecao(flag, a, b, tol)
// flag=1 para f1(x)=x^2-2, flag=2 para f2(x)=sin(x)-0.5
if flag == 1 then
f = x -> x^2 - 2;
else
f = x -> sin(x) - 0.5;
end
if f(a)*f(b) > 0 then
error("Intervalo inválido: f(a)*f(b) deve ser < 0");
end
while abs(b - a) > tol
m = (a + b)/2;
if f(a)*f(m) < 0 then
b = m;
else
a = m;
end
end
raiz = (a + b)/2;
endfunction
Exemplo de chamada:
r1 = bissecao(1, 0, 2, 1e-6) // raiz de x^2-2
r2 = bissecao(2, 0, 2, 1e-6) // raiz de sin(x)-0.5