Escrever em Scilab uma função que resolve uma equação f(x)=0 pelo método da bisseção, conforme visto em sala.
i) Você vai precisar escolher as funções f(x), visto que uma função não pode ser dada de argumento de entrada. Escolha duas funções f1(x) e f2(x) para encontrar suas raizes.
ii) Ao escrever sua função, quando você tiver que avaliar a função, no passo onde você pergunta se f(a) f(b)<0, no lugar de f(a) você irá avaliar as funções escolhidas f1 e f2.
iii) Faça um if no começo do algoritmo indicando se a função escolhida será a função f1 ou a f2, assim você pode trocar a fórmula da avaliação de f1 ou f2 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 f(a) for menor que uma tolerância pequena à sua escolha.

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 f(x)=0 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:
  • f1(x)=x^2-2
  • f2(x)=sin(x)-0.5
No começo você usa um if pra escolher qual delas vai usar, e depois implementa o laço while que encerra quando o valor de |f(a)| (ou a largura do intervalo) ficar menor que uma tolerância que você definir.
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):
  1. Começamos com um intervalo [a,b] tal que f(a),f(b)<0. Isso garante que há uma raiz entre a e b.
  2. Calculamos o ponto médio m=(a+b)/2 e avaliamos f(m).
  3. Se f(a),f(m)<0, a raiz está em [a,m], então atualizamos b=m. Senão, está em [m,b], então atualizamos a=m.
  4. Repetimos até que o intervalo seja suficientemente pequeno ou |f(m)|.
Essa é a lógica que vamos codificar.

Passo 3

Escolha das funções e parâmetros:
  • f1(x)=x^2-2, raiz exata em raiz2approx1.4142.
  • f2(x)=sin(x)-0.5, raiz perto de xapprox0.5236 (ou seja, pi/6).
  • Intervalos iniciais, por exemplo: para f1 use [a,b]=[0,2]; para f2 use [a,b]=[0,2] também (pois sin(0)-0.5=-0.5 e sin(2)-0.5>0).
  • Tolerância tol=10^-6 (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 f(a)f(b)<0.

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 ou b e volta pro while.
  • 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

Exercícios relacionados