Вы находитесь на странице: 1из 6

MTODO DE MULLER PARA OBTENER TODAS LAS RACES DE UN

POLINOMIO
RESUMEN
Se describe en detalle el algoritmo de Muller para obtener una raz de una
funcin f (x) . Se discute la forma clsica (ms eficiente) de evaluar polinomios
y de realizar la divisin sinttica, procedimientos necesarios para hallar todas
las races de un polinomio de coeficientes reales y grado arbitrario. Los
resultados obtenidos mediante un programa desarrollado por los autores en
la Facultad de Ingeniera Elctrica de la Universidad Tecnolgica de Pereira
se comparan, en trminos de precisin y tiempo de ejecucin, , con los
encontrados con el MATLAB 5.3.

Alvaro Acosta Montoya


Profesor Titular
Ingeniera Elctrica U. T. P
e-mail: aacosta@utp.edu.co
Carlos Galvn Ceballos
Estudiante X semestre
Ingeniera Elctrica U. T. P
e-mail: carlosgc1@hotmail.com
Mario Acosta Acosta
Ingeniero Elctricista U. T. P.
Colombiana Kimberly Colpapel S. A.
e-mail: macosta@kcc.com

ABSTRACT
The Mullers Method to obtain a single root of a function f(x) is described in
detail. The most efficient (classical) approach to evaluate a polynomial and
to make synthetic division are discussed, which are necesary functions to get
all the roots of a polynomial of real coefficients and arbitrary degree. The results
obtained by a program developed by the authors in the Electrical Engineering
Department at Universidad Tecnolgica de Pereira, are compared to those
obtained by using MATLAB 5.3

MTODO DE MULLER PARA HALLAR UNA RAZ DE LA


ECUACIN f (x) ' 0
Entre las propiedades ms destacadas del mtodo se pueden
mencionar[1]:
<

Se puede usar para encontrar cualquier nmero prefijado


de races.

<

Se aplica a funciones arbitrarias.

<

Encuentra races reales y/o complejas.

<

En el entorno de la raz posee convergencia casi


cuadrtica.

<

<

Se basa en aproximar en la proximidad de la raz cualquier


funcin mediante una parbola. Para ello se escogen tres
puntos relativamente contiguos que pertenecen a la funcin
y se halla la ecuacin de la nica parbola que pasa por ellos.
Las soluciones de la ecuacin cuadrtica que resulta
determinan los puntos por donde dicha parbola corta el
eje x, uno de los cuales se toma como mejor aproximacin
a la raz que se busca. Los detalles de la deduccin de las
frmulas se muestran a continuacin:
Sean x0 , x1 y x2 tres aproximaciones diferentes para una
raz de la ecuacin f (x) ' 0 . La ecuacin de la nica parbola
que pasa por los puntos [x0 , f (x0 )] [x1 , f(x1 )] [x2 , f(x2 )] se
supone de la forma:
p(x) ' A x 2 % B x % C

No requiere evaluacin de la derivada de la funcin como


en el mtodo de Newton
Cuando la funcin es un polinomio,[( f (x) ' p(x) ], y se
aproxima una raz repetida no diverge como el mtodo
de Bairstow o el de Newton1.

entonces se debe cumplir:


2

p (x0 ) ' f0 f ( x0 ) ' A x0 % B x0 % C


p(x1 ) ' f1 f (x1 ) '
p (x2 ) ' f2 f ( x2 ) '

No es difcil verificar que cuando f(x) es un


polinomio p(x), el mtodo de Newton en las
proximidades de una raz repetida xk diverge
por cuanto p(xk)=0.

(1)

2
A x1
2
A x2

(2a)

% B x1 % C

(2b)

% B x2 % C

(2c)

Combinando (2c) con (2b) y (2b) con (2a) para eliminar la


incgnita C se obtiene:

SCIENTIA ET TECHNICA No. 12


2

ABRIL /2000 80

A (x2 & x1 ) % B (x2 & x1 ) ' f2 & f1


2

A (x1 & x0 ) % B (x1 & x0 ) ' f1 & f0

(3)

la ecuacin de la parbola tambin se puede expresar de la


siguiente manera:
p (x ) ' f2 % g (x2, x1 ) ( x & x2 ) %
%

que se puede expresar matricialmente de la siguiente manera:


2

( x2 & x1 ) ( x2 & x1 ) A
2
2
( x1 & x0 ) ( x1 & x0 ) B

'

g (x2, x1 ) & g( x1, x0 )


x2 & x0

( x & x2 )( x & x1 )

que permite verificar de manera inmediata que corresponde


a la ecuacin de la nica parbola que pasa por los puntos
[x0 , f (x0 )] [x1 , f(x1 )] [x2 , f(x2 )]

(f2 & f1 )
(f1 & f0 )

cuya solucin es la siguiente:


A '

g( x2, x1 ) & g( x1, x0 )


x2 & x0

Un enfoque alternativo supone que la ecuacin de la parbola


es de la forma:

(4a)

(4)

B ' g( x2, x1 ) & A (x2 % x1 )

(4b)

g (x1, x0 ) '

f2 & f1
x2 & x1
f1 & f0

c ' f (x0)

(5)

x1 & x0

a '

Reemplazando (4) en (2c) se obtiene:


C 'f2 & x2 g( x2, x1 ) & x1 A

(9)

y en este caso mediante un procedimiento similar al descrito


se obtienen las siguientes expresiones para las constantes
a, b y c

donde
g (x2, x1 ) '

p(x) ' a( x & x0 )2 % b (x & x0 ) % c

g (x1, x0) & g (x2, x0)


x1 & x2

(10)

b ' g(x1 , x0) & a (x1 & x0)

(6)
donde

En [1] se sugiere y se justifica que para evitar prdida de


dgitos significativos en la solucin a la ecuacin cuadrtica
p (x ) ' A x 2 % Bx % C ' 0 se haga mediante la frmula
alternativa:

g ( x1 , x0 ) '

g ( x2 , x0 ) '

2C

x3 '
B

B 2 & 4AC

(7)

donde el signo antes del radical se debe escoger de tal


manera que el valor absoluto del denominador sea el ms
grande lo que da la raz de valor absoluto ms pequeo.

x1 & x0
f2 & f0

(11)

x2 & x0

y se mantienen las definiciones dadas en (2a), (2b) y (2c) para


f0 , f1 y f2 , pero en este caso se utiliza (9) para p (x)
p(x0 ) ' f0 f (x0 ) 'c
p(x1 ) ' f1 f (x1 ) ' a(x1 &x0)2 % b(x1 &x0) % c

Si f ( x3 ) # donde es una tolerancia especificada de


antemano, se ha hallado una solucin. En caso contrario se
repite el proceso con las siguientes asignaciones:
x2 ' x3
x1 ' x2
x0 ' x1

f1 & f0

p(x2 ) ' f2 f (x2 ) ' a(x2 &x0)2 % b(x1 &x0) % c

(12)
ALGORITMO DE MULLER

(8)

Reemplazando (4a) en (4b) en (6) y las expresiones resultantes


para las constantes A , B y C en (1), se puede demostrar que

Se supone que los coeficientes del polinomio se almacenan


en el vector A , y que los subndices ms bajos identifican
la posiciones de las potencias mas altas.
1.

Suponer que los tres puntos iniciales contiguos se


encuentran separados entre s INI ' unidad..

SCIENTIA ET TECHNICA No. 12


Inicialmente se busca una raz en el intervalo
& 0.5 # x # 0.5 Es decir,
x0 ' & INI
x1 ' 0

3.

Fijar tolerancia ' 10 & 6 y mximo nmero de


iteraciones MAX ' 1000 e inicializar contador de
iteraciones j ' 0
Si el grado es igual a 1 hacer

a ' 0

b ' A[0]

c ' A[1]

x3 ' & c
b
4.

b ' A[1]

c ' A[2]

5.

Aplicar secuencialmente (12), (11), (10) para obtener las


constantes a , b y c

6.

Aplicar (7) con

A = a, B = b y C = c
para obtener

Evaluacin eficiente de un polinomio

p (x) ' a0 % a1 x %a2 x 2 % an x n

(13)

Es ineficiente evaluar cada uno de los n % 1 trminos


separadamente y sumarlos despus porque el esfuerzo
n (n % 1)
computacional es de n sumas y
multiplicaciones.
2
An si se toma como base x k para evaluar x k % 1 se
requeriran n sumas y (2n & 1) multiplicaciones.
Observando que con excepcin del primero todos los
trminos de (13) contienen el factor comn x (12) se puede
escribir de la siguiente manera:

Si el grado es igual a 2

a ' A[0]

ASPECTOS COMPUTACIONALES

En los mtodos iterativos para encontrar las races de un


polinomio se requiere con demasiada frecuencia la evaluacin
del polinomio de grado entero n > 0 de la forma:

x0 ' INI
2.

ABRIL /2000 81

x3 - x0 , verificar si f (x3 ) # . Si no se

cumple esta condicin incrementar en 1 el nmero de


iteraciones j y si se excede el mximo permitido
MAX volver a iniciar el proceso reduciendo el valor deINI
a la mitad. Si tampoco se encuentra solucin en MAX
iteraciones se reduce nuevamente el valor de INI a la
mitad y se reinicia el proceso. Finalmente si tampoco se
encuentra solucin con INI ' 0.125 ' c despus de MAX
iteraciones se imprime mensaje de no convergencia
despus de 3(MAX iteraciones.

p(x) ' a0 % x(a1 % a2 x % %


% an

&1

xn

&2

% anx n

&1

De nuevo cada trmino dentro del parntesis excepto el


primero tienen el factor comn x
p(x) ' a0 % x(a1 % a2 (x % %
% an

&1

xn

&3

% anx n

&2

))

Continuando con este proceso se obtiene la expresin


anidada de p (x)
p(x) ' a0 % x(a1 % x (a2 % %
% x(an & 1 % x(a n ))))
para evaluar la cual se necesitann sumas yn multiplicaciones.
Divisin Sinttica

7.

Cuando se haya encontrado una raz se debe proceder


a realizar la deflacin (divisin sinttica) para reiniciar
el proceso con un polinomio de orden menor. Debe
tenerse en cuenta que, puesto que el polinomio tiene
coeficientes reales, cuando ocurre una raz compleja
tambin ocurre su conjugado y en ese caso la divisin
sinttica se debe aplicar dos veces.

Dados los n % 1 coeficientes a 0 , , a n del polinomio (12)


y el nmero z hacer
b n ' an
Para k ' n & 1, , 0 hacer
bk ' ak % z bk % 1

(14)

Entonces aplicando (14) se obtiene mediante un proceso


inductivo

SCIENTIA ET TECHNICA No. 12


b 0 ' a0 % z b 1
' a0 % z (a1
' a0 % z (a1
!
b 0 ' p (z) ' a0
%

ABRIL /2000 82

% z b 2)
% z (a2 % zb 3))
! ! ! !
% z (a 1 % z (a2 % %
z (an & 1 % z (an )) ))

(15)

Los autores se vieron en la necesidad de desarrollarla porque


estn trabajando en un paquete para la solucin analtica de
circuitos elctricos de parmetros concentrados. Se realizaron
pruebas y se obtuvieron resultados ligeramente mejores, tanto
en tiempo de ejecucin como en precisin, con los arrojados
por el MATLAB 5.3. Los lectores interesados en hacer uso
de la librera completa pueden solicitarla a cualquiera de los
autores va e-mail

La secuencia de nmeros b n , b n & 1 , , b 1 tienen una


propiedad muy til que se deriva a continuacin:
BIBLIOGRAFA
De (14)

(16)

[1] CONTE, S. D. y CARL de Boor, Elementary


Numerical Analysis, Mc-Graw Hill, 2 edicin, New
York, 1972

Por lo tanto si q (x) es un polinomio de grado n & 1 de la


forma

[2] FADEEV, D. K. y V. N. FADEEVA, Computational


Methods of Linear Algebra, W. H Freeman and
Company, San Francisco, 1963

ak '

k ' n

bk
bk & bk

% 1z

k < n

k ' 0, , n

q(x) ' b 1 % b 2 x % % b n x n

&1

[3] JOYANES, A. Luis, C++ A SU ALCANCE: Un


enfoque orientado a objetos, McGraw-Hill,
Mxico, 1995

entonces
b 0 % q(x)(x & z) ' b 0 % (b 1 % b 2 x %
& (b 1 % b 2 x %

Apndice A
Codificacin de Evaluacin de polinomios

' (b 0 & b 1 z) % (b 1 & b 2 z)x %


(b n

&1

& b n z)x n

' a0 % a1 x % % an

&1

&1

% b0x n
xn

&1

(17)

' p (x)
Es decir, b 1 , , b n & 1 , b n son los coeficientes del
polinomio resultante de dividir p (x) entre el polinomio de
primer orden x & z y b 0 es el residuo. Haciendo x ' z en
(16) se obtiene nuevamente b 0 ' p (z) [ver ecuacin (15)].
Sip (z) # x ' z esunarazylasecuenciadecoeficientesb 1 , , b n & 1 , b n
son los del polinomio base para continuar hallando todas
las dems races.

CONCLUSIONES
Se ha descrito en detalle el algoritmo de Muller para obtener
todas las races de un polinomio de coeficientes reales. Esta
resulta ser una herramienta til en el anlisis de sistemas
lineales. Tambin sirve de base para realizar expansin en
fracciones parciales.

float eval(FPoly &A,float &x)


{
float resul;
resul=A.poly[0];//coeficiente de mayor potencia
for (register unsigned char j=1;j<=A.grado;j++) //limita a un
polinomio de grado 126
{
resul=resul*x+A.poly[j];
}
return resul;
}
La clase Fpoly ha sido creada para representar un polinomio
de coeficientes reales y grado arbitrarion y se le han definido,
adems de los constructores de copia y sobrecarga de
operadores binarios y de flujo, funciones para encontrar sus
races, evaluar el polinomio y realizar la divisin sinttica

Apndice B
Codificacin de la Divisin Sinttica

FPoly Div(FPoly &A,const float &x)


{

SCIENTIA ET TECHNICA No. 12


float resul;
Fpoly B(char(A.grado-1));
resul=A.poly[0];//coeficiente de mayor potencia
for (register unsigned char j=1;j<=A.grado;j++)
//limita a un orden del polinomio a 126
{
B[char(j-1)]=resul;
resul=resul*x+A.poly[j];
}
return B;
}
Apndice C
Cdigo para encontrar races de un polinomio

Roots roots(FPoly A)
{
Roots raices(A.grado);
const int MAX=1000;
const float TOL=1E-6,REAL=1E-5;
//Contador de las raices encontradas
unsigned char N;
const unsigned char NRAICES=char(A.grado-1);
complex a,b,c,x0,x1,x2,h1,h12,h2,D,f10,f20;
float INI;
float var;
bool FINDROOT;
N=0;
INI=0.5;
do
{
FINDROOT=false;
x0=-INI;
x1=0;
x2=INI;
for(short i=0;i<=MAX;i++)
{
if(A.grado==2)
{
bool r1;
r1=false;
D=A[1]*A[1]-4*A[0]*A[2];
D=sqrt(D);

ABRIL /2000 83
if(abs(A[1]+D)<abs(A[1]-D))
{
raices[N]=-2*A[2]/(A[1]-D);
r1=true;
}
else raices[N]=-2*A[2]/(A[1]+D);
if(fabs(imag(raices[N]))<=REAL)
{
if(r1) raices[char(N+1)]=-2*A[2]/(A[1]+D);
else raices[char(N+1)]=-2*A[2]/(A[1]-D);
raices[N]=real(raices[N]);
raices[char(N+1)]=real(raices[char(N+1)]);
}
else raices[char(N+1)]=conj(raices[N]);
N=char(N+2);
FINDROOT=true;
break;
}
else if(A.grado==1)
{
raices[N]=-A[1]/A[0];
N++;
FINDROOT=true;
break;
}
c=eval(A,x0);
h1=x1-x0;
h2=x2-x0;
h12=x1-x2;
f10=(eval(A,x1)-eval(A,x0))/h1;
f20=(eval(A,x2)-eval(A,x0))/h2;
a=(f10-f20)/h12;
b=f10-a*h1;
D=b*b-4*a*c;
D=sqrt(D);
if(abs(b+D)<abs(b-D))
{
D*=-1;
D+=b;
}
else D+=b;
raices[N]=x0-2*c/D;
if(abs(eval(A,raices[N]))<TOL)

SCIENTIA ET TECHNICA No. 12


{
//una vez se obtenga una raiz aplicamos la deflacion
FINDROOT=true;
if(fabs(imag(raices[N]))<=REAL)
{
//si la raiz es real
var=real(raices[N]);
if(N<NRAICES) A=Div(A,var);
raices[N]=var;
}
else {
//si la raiz es compleja
if(N+1<NRAICES) A=Div(A,raices[N]);
raices[char(N+1)]=conj(raices[N]);
N++;
}
N++;
INI=0.5;
break;
}
//si no se encuentra raiz preparamos la siguiente
iteracion
else
{
x0=x1;
x1=x2;
x2=raices[N];
}
}
// si no converge en MAX iteraciones,
cambiamos el valor de INI
if(!FINDROOT)
{
INI/=2;
if(INI<0.125) {
cout<<"NO CONVERGE EN
"
<<3*MAX<<"ITERACIONES";
getch();
exit(-1);
}
}

ABRIL /2000 84
}
while(N<=NRAICES);
return raices;
}
Ntese que un objeto de la clase Fpoly no sirve para
almacenar las races del polinomio, ya que algunas de
estas podran ser complejos. De ah surge la necesidad
de crear la clase Roots que representa un polinomio de
coeficientes complejos.

Вам также может понравиться