Está en la página 1de 5

I. TELECOMUNICACION.

ALGEBRA LINEAL
Sesion de laboratorio 1. Polinomios y algoritmo de Horner
Esta primera sesion intenta familiarizar al estudiante con la representaci
on y manejo de los
polinomios en MATLAB.

Representaci
on de polinomios

Los polinomios en MATLAB vienen representados por vectores, cuyas componentes guardan los
coeficientes del polinomio en potencias de x y en orden decreciente. As, la expresion
>> p = [1

2];

>>
tiene mas de un sentido en MATLAB: puede representar el vector (fila) p = (1, 3, 2) (el punto
y coma ; impide que la expresion del vector aparezca explcitamente en pantalla). pero tambien
representa el polinomio p(x) = x2 + 3x 2. El n
umero de componentes de p determina el grado
del polinomio, de forma que grado de p = n
umero de componentes de p 1.
Varios comandos de MATLAB van asociados a la manipulacion con polinomios. Los mas
elementales se refieren a las operaciones de producto y division, a su evaluaci
on y al calculo
aproximado de sus races.

Operaciones de producto y divisi


on de polinomios

El comando para realizar el producto de dos polinomios es conv. Por ejemplo, los vectores
>> p = [1 3

2]; q = [1

1];

>>
representan, respectivamente, los polinomios p(x) = x2 + 3x 2, q(x) = x 1. El vector
>> r = conv(p, q)
>> r =
1 2

representa el producto r(x) = p(x)q(x) = x3 + 2x2 5x + 2. La instruccion


>> help

conv

proporciona una breve explicacion del comando, sus variantes, as como comandos relacionados.
Uno de ellos es el que implementa la division, deconv. Muestra como resultado los polinomios

cociente y resto de la division de los polinomios de entrada.


>> b = [1

2]; a = [1

1];

>> [q, r] = deconv(b, a)


>> q =
1

r=
0

0 2

As, la division de b(x) = x2 + 3x 2 entre a(x) = x 1 proporciona el cociente q(x) = x + 4 y


el resto r(x) = 2, de modo que b(x) = a(x)q(x) + r(x).

Evaluaci
on y determinaci
on de races

Algunas operaciones asociadas a polinomios no pueden realizarse exactamente y MATLAB implementa algoritmos numericos de aproximaci
on. Tal es el caso de la determinacion de las races.
El comando roots proporciona una aproximaci
on a los ceros de un polinomio. Por ejemplo, las
instrucciones
>> p = [1

2];

>> roots(p)
ans =
3.5616
0.5616
muestran aproximaciones a las races del polinomio p(x) = x2 + 3x 2 que, por la formula de
resolucion de ecuaciones de segundo grado, son
x =


1
3 17 .
2

Cuando el resultado de una instruccion ejecutada no lleva asociado explcitamente una variable
(como en el uso de roots en el ejemplo anterior) MATLAB asigna una por defecto, llamada ans
(de la palabra inglesa answer). Por otro lado, MATLAB siempre realiza las operaciones con la
misma precision, si bien la representaci
on de los n
umeros puede variar. Esto viene controlado
por el comando format. As, por ejemplo, la sucesion
>> f ormat long
>> p = [1

2]; roots(p)

ans =
3.561552812808830e + 00
0.5615528128088303e 01

genera una representacion de las races con mas decimales y en notacion cientfica. La instruccion
help format se
nala las posibles variantes del comando.
La evaluacion de polinomios viene implementada por el comando polyval. Las instrucciones
>> p = [1

2]; c = 1;

>> pc = polyval(p, c)
pc =
2
dan como resultado la evaluacion del polinomio p(x) = x2 + 3x 2 en el punto c = 1, que
se guarda en la variable pc = p(c) = 2. La aplicacion mas elemental del comando polyval
utiliza el algoritmo de Horner. Como ilustracion general de la construccion de un algoritmo y su
programacion en MATLAB, vamos a implementar nuestro propio programa de evaluaci
on de un
polinomio.
La forma mas habitual de programar un algoritmo comienza elaborando el llamado pseudocodigo. Se trata de un conjunto de instrucciones que muestra claramente los pasos de que
consta el proceso, de manera que su traslacion a cualquier lenguaje de programacion sea mas o
menos directa. En nuestro caso, y en su versi
on mas sencilla, para evaluar un polinomio
P (x) = a0 + a1 x + + aN xN ,
en un punto c, puede escribirse
P (c) = a0 + c(a1 + c(a2 + + c(aN 2 + c(aN 1 + caN )) )),
en una serie de multiplicaciones encajadas. El algoritmo, desarrollado aparentemente de forma
independiente por Ruffini (1804), Budan (1807 y 1813) y Horner (1819), se basa en la evaluaci
on
sucesiva de los parentesis, a partir del mas interno. Si ponemos bN = aN y calculamos
bk = ak + cbk+1 ,

k = N 1, . . . , 0,

entonces b0 = P (c). Un pseudocodigo para este algoritmo podra ser el siguiente:


Pseudoc
odigo del algoritmo de Horner
Dados a0 , . . . , aN y c
bN = aN
Desde k = N 1 hasta 0
bk = ak + cbk+1
P (c) = b0
La traslacion al lenguaje de MATLAB tendra la forma siguiente:

function pc=horner(a,c)
% Algoritmo de Horner para evaluar un polinomio
% de la forma
% a(1) + a(2)x + a(3)x2 + ...a(m)xm1
% El vector a guarda los coeficientes
% c es el punto de evaluaci
on
m = length(a);
b(m) = a(m);
for k = m 1 : 1 : 1
b(k) = a(j) + c b(k + 1);
end
pc = b(1);
Es necesario realizar algunos comentarios:
(i) Todo programa que represente un algoritmo en MATLAB debe encabezarse con una instruccion del tipo
function [a1 , . . . , aN ] = nombre (b1 , . . . , bM )
donde a1 , . . . , aN son los datos de salida y b1 , . . . , bM son las variables de entrada
(ii) Las lneas precedidas de % son de comentario. MATLAB las ignora a efectos de computacion
y son las que aparecen al teclear en la ventana de comandos
>> help nombre
Son muy u
tiles para que el usuario reconozca, en pocas palabras, lo que realiza el programa.
(iii) En el interior de un fichero de funcion (el programa) se pueden declarar variables, realizar
operaciones, crear condicionales, ciclos, llamar a funciones ya creadas, bien de MATLAB o del
usuario, etc. As, el comando length calcula la longitud de un vector. En nuestro caso, hay
que tener en cuenta que el vector representa los coeficientes del polinomio y que MATLAB no
admite vectores con componentes no positivas. De esta manera a = [a(1), . . . , a(m)] representa
el polinomio a(1) + a(2)x + a(3)x2 + ...a(m)xm1 y el pseudocodigo debe adaptarse a ello.
(iv) El ciclo
for k = m 1 : 1 : 1
b(k) = a(j) + c b(k + 1);
end
implementa en MATLAB el cuerpo central del algoritmo. Recuerdese lo mencionado en el
apartado (iii), que influye en los valores lmite (en comparaci
on con el pseudocodigo) y observese
como se implementa un ciclo decreciente en MATLAB. Asmismo, la u
ltima instruccion del programa asigna el resultado del algoritmo a la variable de salida.

Algunos ejercicios

1. Realiza el producto y la division de los polinomios siguientes en MATLAB:


(i) p(x) = x3 + x2 + x + 1,
(ii) p(x) = x3 1,

q(x) = x2 + 2.

q(x) = x 1.

(iii) p(x) = x4 + x2 + 2,

q(x) = x3 + x 1.

2. Calcula una aproximacion a las races de los polinomios siguientes (expresandolas en dos
formatos) y eval
ualos en el punto indicado.
(i) p(x) = x3 + x2 + x + 1,
(ii) p(x) = x5 + x3 x,
(iii) p(x) = x4 + x2 + 2,

c = 1.

c = i.
c = 2.

3. Compara el psudocodigo del algoritmo de Horner con la siguiente variante


Pseudoc
odigo del algoritmo de Horner. Versi
on 2
Dados a0 , . . . , aN y c,
Desde k = N 1 hasta 0
ak ak + cak+1
P (c) = a0
Elabora el correspondiente programa MATLAB y ejec
utalo con p(x) = x3 + x2 + x + 1 y
c = 1.

También podría gustarte