1.3.1 Raízes de Equações — Raízes de Polinômios — Newton-Raphson para polinômios

1. Introdução

Tanto os métodos intervalares quanto os abertos funcionam quase sempre bem para a busca de raízes em um polinômio, dependendo da natureza destas raízes.

Se este tiver apenas raízes reais, qualquer método para encontrar raízes pode ser utilizado. Entretanto, quando o polinômio apresenta raízes complexas, os métodos que as isolam não podem ser utilizados devido ao problema de se definir um critério de detecção da raiz, já que os limites dos intervalos não se estendem às aproximações complexas. Sendo assim, a maioria dos métodos intervalares e abertos não são aplicáveis para polinômios de raízes complexas.

Contudo, o Método de Newton-Raphson pode fornecer as raízes complexas, podendo ser implementado em linguagens que suportem um tipo complexo. Sua única desvantagem é que, dependendo do polinômio, ele poderia ter problemas de convergência. Porém, existem outros algoritmos mais eficientes que buscam raízes — reais e complexas — de funções polinomiais.

2. Newton-Raphson para polinômios

! -
! newtonRaphson_c
! return the [complex] root of a function (using the Newton-Raphson Method)
! G: function pointer
! x: some initial point
! imax: max of iterations allowed
! errto: tolerated error 
!
! Author: Pedro Garcia sawp@sawp.com.br
! see: http:!www.sawp.com.br
!
! License: Creative Commons
!          <http ://creativecommons.org/licenses/by-nc-nd/2.5/br/>
! ago 2009
! 
complex function newtonRaphson_c(G, diffG, x, errto, imax)
  implicit none;
  complex, external :: G, diffG;
  real, intent(in) :: x, errto;
  integer :: imax;
 
  ! iteration counter ! 
  integer :: iterCount;
 
  ! relative error ! 
  real(kind=8) :: errno;
 
  ! xi+1 ! 
  complex :: x1,x0;
 
  x0 = (0.,0.);
  x1 = cmplx(x, 0.d0);
  errno = 100.d0;
  iterCount = 0;
 
  do
    x0 = x1;
    x1 = x0 - G(x0)/diffG(x0);
    iterCount = iterCount + 1;
 
    if(x1 /= (0.d0,0.d0) )then      
      errno = abs( (cabs(x1) - cabs(x0))/cabs(x1) ) * 100.d0
    end if
 
    if(errno < errto .or. iterCount > imax)then
      exit;
    end if  
  end do
 
  newtonRaphson_c = x1;
  return;
end function newtonRaphson_c

Este código pode ser encontrado em http://www.sawp.com.br/code/rootfind/NR_polinomial.f90

3. Copyright

Este documento é disponível sob a licença Creative Commons. As regras dos direitos de cópia deste conteúdo estão acessíveis em http://creativecommons.org/licenses/by-nc-nd/2.5/br/.

References

[1] Ralston, Anthony and Rabinowitz, Philip, A First Course in Numerical Analysis.,(2nd ed.) McGraw-Hill and Dover, (2001), 346–347.


[2] N.B Franco, Cálculo Numérico, Pearson Prentice Hall, (2006), 76.