Solucionando Equações com o Scilab

Como estou estudando Cálculo Numérico na faculdade, aprendemos a utilizar alguns métodos de resolução para encontra o zero da função de alguma equações que são difíceis de resolver na mão grande. Valores esses que são aproximado e calculado pelo computador.

Primeiramente precisamos descobrir se a função possua raíz ou seja, toca o eixo das abscissas  pra f(X) =0. Conforme figura abaixo:

Se tocar o eixo, devemos estudar o sinal da função, ou seja achar um intervalo que possua o zero da função que pode ser uma, mais de uma ou nenhuma. O algoritmo abaixo define a função a ser estudada, basta descomentar e escolher uma das funções:

function y=f(x)
  //y=x^2-2*x-3; //Segundo grau normal, raízes -1 e 3
   // y=-x^2+2*x+3; //Segundo grau invertida, raízes -1 e 3

   y=(%e^(2*x))-x^2;           // letra a
   //y=5-(x*log(x+3));         // letra b, x apartir de -2
   // y=x^4-3*x+1;             // letra c
   //y=4^(2*x)-x^2;            // letra d
   //y=5*log(x^2-1)+sqrt(x);   // letra e, x partir de 2
   //y=3*sin((4*x)-1)+2*x;     // letra f
endfunction

E abaixo está o algoritmo da função para o estudo da mudança de sinal, ela acha quantas raízes possuírem, dentro de um limite inferior e superior, com uma precisão h.

function mudasinal(inf, sup, h)    // intervalo de varredura e precisao
    c_raiz=0;                       //contador inicial de raises
    xo=inf;
    xf=inf+h;
    while(xo<sup)                      // Testa limite
        if (f(xo)*f(xf)>0) then       //Testa a mudanca de sinal
        xo=xf;                       //varre mais um espaco
        xf=xf+h;
        else                          //Se for raiz, conta e diz o intervalo
        c_raiz=c_raiz+1;              // conta qtd raises

        printf("Muda sinal entre a=%f e b=%f n",xo,xf);
        xf=xf+h;                  //Novo intervalo a paritr da raiz encontrada
        xo=xf-(0.99999999*h);//O novo xo eh um pouco maior que a raiz encontrada
        end;
    end;
    printf("Apresentou %i raíz(es).",c_raiz); //Apresenta qtd de raises
endfunction

Após estudar a mudança de sinal da função devemos utilizar de alguns métodos para encontrar a raíz aproximada, entre eles existem o método da Bisseção, Newton, Secante e entre outros. A aplicação do método depende do tipo de função, na qual apresenta a melhor convergência.

O método que veremos abaixo é o Método da Bisseção, utilizamos do intervalo a e b, estudada na mudança de sinal,   e o erro para o valor estimado.

function bissecao(a, b, erro) //declara a funcao bissecao
    m=(a+b)/2; //ponto medio
    it=1; //conta iteracao

    while((b-a)/2>=erro & f(m)<>0) do //Testa o intervalo for maior que o erro
        if f(a)*f(m)<0 then  //Testa a mudanca de sinal
        b=m;
        else
        a=m;
        end;
    m=(a+b)/2;   //Divide mais um intervalo para teste
    it=it+1;     //conta iteracoes
    end;
printf("A raiz aproximada da função é: %fn",m);
printf("O número de iterações é: %i",it);

endfunction

Lembrando que se não existir uma raíz dentro do limite dado, o método apresenta a resposta bem aproximada a um dos limites, pois isso provém do próprio algoritmo.

As funções foram criada no Scilab 5.3 , os arquivos prontos se encontram a baixo.

Espero ter contribuído com vocês, qualquer dúvida podem ser postado ae.

Valeu, Abraços.

18 Comentários

  1. Henrique

    Opa! Eu estou com dificuldade num problema. Usando o scilab, o exercício pede para que eu encontre as raízes das seguintes funções (usando gráfico):
    a) f(x)=(e^-x)-x
    b) f(x)=sen(10x)-cos(3x)
    c) f(x)=x-cos(x)
    Nem sei por onde começar. O professor explicou coisas básicas apenas.
    Se puder ajudar, agradeço!

    Responder
  2. Guto Melo

    Opa Henrique, tudo bem? é o seguinte conforme o tópico você tem que primeiro fazer um estudo da mudança de sinal da função para saber se ela tem mais de uma raiz. você tem que abrir os arquivos com o Scinote do Scilab 5.3 e clicar em executar, primeiro a função depois os outros, mudasinal e bisseção. Depois é só ir la no console do Scilab e chamar a função executada, tipo Exemplo :primeiro mudasinal(0,4,1), ae ele vai mostrar os intervalos que possuem a raíz, depois pega esse intervalo coloca em bissecao(0.1,0.2,0.001) ae ele vai mostrar a raiz nesse intervalo.

    Valeu.

    Responder
  3. Henrique

    Opa! Eu tentei fazer mas muita coisa que tu falou eu não entendi direito. Se não for pedir demais, tem como você me add no msn? rique_91@hotmail.com
    Vai ser de grande ajuda!

    Responder
  4. Henrique

    Caso não dê para add (o que entendo perfeitamente) se puder me explicar passo a passo como faz, eu agradeço, porque estou bem perdido no scilab, não conheço esse estudo do sinal, bisseção, etc.
    Obrigado mesmo!

    Responder
  5. Guto Melo

    Henrique :
    Caso não dê para add (o que entendo perfeitamente) se puder me explicar passo a passo como faz, eu agradeço, porque estou bem perdido no scilab, não conheço esse estudo do sinal, bisseção, etc.
    Obrigado mesmo!

    A mudança de sinal Henrique é quando a função toca o eixo X conforme a figura(justamente o valor da raiz), o algoritmo mudasinal busca esses intervalo de valores de x(podem ter mais de um) quando o eixo Y é igual a 0.

    A função bisseção busca o valor da raiz nesse intervalo de acordo com um erro exigido.

    Valeu.

    Responder
  6. Henrique

    Ah tah, entendi. Mas então, eu vi que o professor pede pra ver pelo gráfico qual a raíz, mas não sei como faço o gráfico da função. Como pego aquela função e jogo ela como um gráfico para eu analisar?
    (Obrigado mais uma vez)

    Responder
    1. Guto Melo

      Cara se teu professor ta pedindo pra tu fazer gráfico no Scilab ou Matlab, ele pelo menos tem que ensinar como faz né! ou então tem que pesquisar muito, rsrs.

      Responder
  7. Henrique

    Cara! Eu me matei aqui pesquisei e tal, consegui resolver esses exercícios! Aí eu super feliz, fui fazer o resto achando que tava fácil, e PQP tem um exercício louco aqui, que esse sim eu to perdido.
    Seja um sistema de coordenadas cartezianas (x, y). Um círculo C pode ser definido analiticamente como o conjunto de pontos que obedecem uma equacao (x-a)²+(y-b)²=r², em que r é igual ao raio e (a,b) são coordenadas do centro.
    Usando gráfico de funções, um círculo pode ser desenhado em duas etapas:

    1 – fazer parte positiva do gráfico: y= raiz de (r²-(x-a)²)
    2- fazer parte negativa do gráfico: y= – raiz de (r²-(x-a)²)

    Nas duas etapas, a rigor, deve-se considerar x num intervalo que produza Y real, ou seja, x E [a-r, a+r].
    Contudo, na resolução deste exercício, você pode tomar x E R num intervalo suficiente grande e se considerar apenas a parte real de y. Empregando este método, pede-se:

    a) Desenhe, num mesmo gráfico, o círculo c1 definido pela equação x²+y²=1 e o círculo c2 definido por (x-1)²+y²=2

    b) Encontre as coordenadas dos pontos de intersecção dos círculos.

    c) Repita os itens anteriores para c1: x²+y²=1 e c2: (x-1)²+(y-2,1973)²=2

    Se tu conseguir me dar umas dicas como fez antes, agredeço DE NOVO. kkk

    Responder
    1. Guto Melo

      Cara, esse exercício eh muito bom! mas foge do limite do post aqui, recomendo fazer analiticamente primeiro, depois parta pro Scilab.

      Abraços.

      Responder
  8. Kamila

    Muito bom! Até que em fim achei um código que funciona. Eu sei fazer o procedimento a mão, mas precisava de um algorítmo pra economizar serviço!

    Responder
  9. Luiz Armando

    Olá Guto! Estou com um pequeno problema, sou novo em scilab e quando digito o erro de por exemplo: 0.1 ele vai no while e compara (b-a)/2, só que o meu problema essa comparação esta parando com o valor de 0.125 que é maior que 0.1. Tem como eu resolver isso? Obrigado!

    Responder
  10. diegoalves.t@gmail.com

    opa! estou com um trabalho para fazer mas não sei utilizar o scilab tem como me ajudar… URGENTE…

    Responder
  11. diegoalves.t@gmail.com

    a)f(x)=x^2 * ln(x)^2-e^2
    b)f(x)=x sinh(x)-2pi
    c)f(x)=(x-2)^2

    usando os métodos da bissecção, falsa posição, newton-raphson e secante.
    arbitre uma tolerância(E),o intervalo de isolamento da raiz e a estimativa inicial da raiz para cada uma das funções a serem avaliadas.

    compare o desempenho dos métodos

    calcule o erro absoluto entre a solução analítica e a numérica para cada método
    e cada função e cada critério de convergência utilizado.

    apresentar em forma de tabela os resultados.

    se puder me ajudar…
    valeu!!!

    Responder
  12. erich

    nao consigo baixar

    Responder
  13. onavlis soares

    function [ x ] = bissecao(x)
    //Programa que calcula a raiz da função através do método da bisseção
    clc
    a=input(‘digite o valor do 1º intervalo: ‘);
    b=input(‘digite o valor do 2º intervalo: ‘);
    max=input(‘digite o valor de iterações: ‘);
    fa=a^3-2*a-5;
    for iter=1:max
    x=(a+b)/2;
    fx=x^3-2*x-5;
    if fx*fa<0
    b=x;
    else
    a=x;
    end
    iter=iter+1;

    end
    y=(a+b)/2;
    disp('a raiz é ')
    disp(y);
    disp(fa);
    disp(fx);

    endfunction

    Responder
  14. Rodrigo

    gostaria de saber a resolução para os códigos “euler.sci” e “solveU.sce” estou apanhando feio, o segundo código diz respeito a zerar a parte superior esquerda de uma matriz(método triangular superior), tenho que entregar um trabalho com esses códigos rodando até sexta. Se alguém puder ajudar eu ficaria muito feliz e grato.

    Responder
    1. Rodrigo

      Na verdade a triangular superior zera os números do canto inferior esquerdo da matriz. Fiz confusão, me desculpem.

      Responder

Deixar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *