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/.
Você pode ler as eventuais respostas desta entrada
através do RSS 2.0 feed.
As respostas estão encerradas, mas você pode
trackback
a partir do seu próprio site.