Você está na página 1de 4

Mtodo Horner

Fernando Espinosa Snchez 2013300118


Es un algoritmo para evaluar de forma eficiente funciones polinmicas de una
forma monomial.
Dado el polinomio
p ( x )=a0 +a1 x+ a2 x 2 ++ an xn
Dnde:

a0 , , an

son nmeros reales, queremos evaluar el polinomio a un


valor especfico de x .
Para llevar a cabo el procedimiento, se debe definir una nueva secuencia de
constantes como se muestra a continuacin:
bn =an
bn1 an1 +bn x 0
b0 =a0 +b 1 x 0
Entonces b0 es el valor de p( x0 )
El algoritmo de Horner se usa a menudo para convertir entre distintos sistemas
numricos posicionales. Es un caso particular del mtodo de coeficientes
separados y se emplea para la divisin de dos polinomios de cualquier grado.

Procedimiento:
Se escribe los coeficientes del dividendo en una fila con su propio signo
Se escribe los coeficientes del divisor en una columna a la izquierda del
primer trmino del dividendo; el primero de ellos con su propio signo y los
restantes con signo cambiado.
El primer trmino del dividendo se divide entre el primer trmino del divisor,
obtenindose el primer trmino.
Se multiplica este trmino del cociente solamente por los trminos del
divisor a los cuales se cambi de signo, colocndose los resultados a partir de la
segunda fila, corriendo un lugar hacia la derecha.
Se reduce la siguiente columna y se coloca el resultado en la parte superior
para dividirlo entre el primer coeficiente del divisor y obtener el segundo trmino
del cociente.
Se multiplica este cociente por los trminos del divisor a los cuales se
cambi de signo, colocndose el resultado en la tercera fila y corriendo un lugar
hacia la derecha.

Se continuara este procedimiento hasta obtener el trmino debajo del


ltimo trmino del dividendo, separando inmediatamente los trminos del cociente
y resto.
Para obtener los coeficientes del residuo se reducen directamente cada una
de las columnas que pertenecen.

#include<stdlib.h>
#include<math.h>
int main(){
int i,n;
float A0,A1,A2,A3,A4,A5,AM,B5,B4,B3,B2,B1,C5,C4,C3,C2;
float x0,x1,x2,y1,R,S,aux0,auxn,Er;
system("color 1f");//esta en la libreria stdlib.h
//Mensaje para el usuario
printf("**********************************************\n");
printf("***ALGORITMO DE HORNER (Division sintetica)***\n");
printf("**********************************************\n\n");
//polinomio tipo a analizar
printf("Pn(x)=a5x^5+a4x^4+a3x^3+a2x^2+a1x^1+a0 \n\n");
printf("Para cualquier polonomio con grado menor o igual a 5\n");
printf("escriba sus coeficientes:\n");
printf(" a5=");scanf("%f",&A5);
printf(" a4=");scanf("%f",&A4);
printf(" a3=");scanf("%f",&A3);
printf(" a2=");scanf("%f",&A2);
printf(" a1=");scanf("%f",&A1);
printf(" a0=");scanf("%f",&A0);
//Verificacion de si A0 es el coeficiente mayor (AM)
if(A0 != 0){//fabs() genera el valor absoluto para valores float
if(fabs(A0)>=fabs(A1) && fabs(A0)>=fabs(A2) && fabs(A0)>=fabs(A3) &&
fabs(A0)>=fabs(A4) && fabs(A0)>=fabs(A5)){
AM=fabs(A0);
}
}
//Verificacion de si A1 es el coeficiente mayor (AM)
if(A1 != 0){
if(fabs(A1)>=fabs(A0) && fabs(A1)>=fabs(A2) && fabs(A1)>=fabs(A3) &&
fabs(A1)>=fabs(A4) && fabs(A1)>=fabs(A5)){
AM=fabs(A1);
}
}
//Verificacion de si A2 es el coeficiente mayor (AM)
if(A2 != 0){
if(fabs(A2)>=fabs(A0) && fabs(A2)>=fabs(A1) && fabs(A2)>=fabs(A3) &&
fabs(A2)>=fabs(A4) && fabs(A2)>=fabs(A5)){
AM=fabs(A2);
}

}
//Verificacion de si A3 es el coeficiente mayor (AM)
if(A3 != 0){
if(fabs(A3)>=fabs(A0) && fabs(A3)>=fabs(A1) && fabs(A3)>=fabs(A2) &&
fabs(A3)>=fabs(A4) && fabs(A3)>=fabs(A5)){
AM=fabs(A3);
}
}
//Verificacion de si A4 es el coeficiente mayor (AM)
if(A4 != 0){
if(fabs(A4)>=fabs(A0) && fabs(A4)>=fabs(A1) && fabs(A4)>=fabs(A2) &&
fabs(A4)>=fabs(A3) && fabs(A4)>=fabs(A5)){
AM=fabs(A4);
}
}
//Verificacion de si A5 es el coeficiente mayor (AM)
if(A5 != 0){
if(fabs(A5)>=fabs(A0) && fabs(A5)>=fabs(A1) && fabs(A5)>=fabs(A2) &&
fabs(A5)>=fabs(A3) && fabs(A5)>=fabs(A4)){
AM=fabs(A5);
}
}
//Caso en que A0 sea 0
aux0=A0;
if(A0==0){
auxn=A1;
if(A1==0){
auxn=A2;
}
}
//Caso en que A5 sea 0
auxn=A5;
if(A5==0){
auxn=A4;
if(A4==0){
auxn=A3;
}
}
//Cotas por anillo de polinomio
x1=(float)fabs(aux0)/(fabs(aux0)+AM);
x2=(float)(fabs(auxn)+AM)/fabs(auxn);
printf("Las raices del polinomio se encuentran es estos intervalos");
printf("\n[-%.3f ,-%.3f] y [%.3f ,%.3f]",x2,x1,x1,x2);
printf("\n\nElija algun punto de inicio para el algoritmo:");
scanf("%f",&x0);
printf("Cuantas iteraciones quiere realizar?:");
scanf("%d",&n);
printf("\n Iteraciones Error entre ellas");
for(i=1;i<=n;i++){
B5=x0*A5;

B4=(B5+A4)*x0;
B3=(B4+A3)*x0;
B2=(B3+A2)*x0;
B1=(B2+A1)*x0;
R=(B1+A0);
C5=x0*A5;
C4=(B5+A4+C5)*x0;
C3=(B4+A3+C4)*x0;
C2=(B3+A2+C3)*x0;
S=(B2+A1+C2);
y1=x0-R/S;
Er=fabs(y1-x0);
x0=y1;
printf("\nX%d=%0.9f Er(X%d)=%0.9f ",i,x0,i-1,Er);
}
printf("\n\n");
system("pause");
}

Você também pode gostar