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.
</p>
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 </p> </p>
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/.