comparativa de métodos y programas para un problema de m

23
Comparativa de m´ etodos y programas para un problema de m´ ınimos cuadrados Jes´ us Gago-Vargas ´ Indice 1. Introducci´ on 2 2. Planteamiento del problema 3 3. Matlab 5 3.1. Factorizaci´ on de Cholesky ...................... 6 3.2. Factorizaci´ on QR ........................... 6 3.3. Ecuaciones normales ......................... 7 3.4. Descomposici´ on en valores singulares ................ 8 3.5. Inversa generalizada ......................... 8 3.6. Herramientas espec´ ıficas ....................... 9 4. Maple 10 4.1. Factorizaci´ on de Cholesky ...................... 10 4.2. Factorizaci´ on QR ........................... 10 4.3. Ecuaciones normales ......................... 11 4.4. Descomposici´ on en valores singulares ................ 11 4.5. Herramientas espec´ ıficas ....................... 11 5. Scilab 12 5.1. Versi´ on 5.3.0 ............................. 12 5.1.1. Factorizaci´ on de Cholesky .................. 12 5.1.2. Factorizaci´ on QR ....................... 12 5.1.3. Ecuaciones normales ..................... 13 5.1.4. Descomposici´ on en valores singulares ............ 13 5.1.5. Inversa generalizada ..................... 13 5.1.6. Herramientas espec´ ıficas ................... 14 5.2. Versi´ on 5.4.1 ............................. 14 5.2.1. Factorizaci´ on de Cholesky .................. 15 5.2.2. Factorizaci´ on QR ....................... 15 5.2.3. Ecuaciones normales ..................... 15 5.2.4. Descomposici´ on en valores singulares ............ 15 5.2.5. Inversa generalizada ..................... 16 5.2.6. Herramientas espec´ ıficas ................... 16 1

Upload: tranthien

Post on 11-Jan-2017

220 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Comparativa de métodos y programas para un problema de m

Comparativa de metodos y programas para un

problema de mınimos cuadrados

Jesus Gago-Vargas

Indice

1. Introduccion 2

2. Planteamiento del problema 3

3. Matlab 53.1. Factorizacion de Cholesky . . . . . . . . . . . . . . . . . . . . . . 63.2. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.3. Ecuaciones normales . . . . . . . . . . . . . . . . . . . . . . . . . 73.4. Descomposicion en valores singulares . . . . . . . . . . . . . . . . 83.5. Inversa generalizada . . . . . . . . . . . . . . . . . . . . . . . . . 83.6. Herramientas especıficas . . . . . . . . . . . . . . . . . . . . . . . 9

4. Maple 104.1. Factorizacion de Cholesky . . . . . . . . . . . . . . . . . . . . . . 104.2. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . . . . . 104.3. Ecuaciones normales . . . . . . . . . . . . . . . . . . . . . . . . . 114.4. Descomposicion en valores singulares . . . . . . . . . . . . . . . . 114.5. Herramientas especıficas . . . . . . . . . . . . . . . . . . . . . . . 11

5. Scilab 125.1. Version 5.3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

5.1.1. Factorizacion de Cholesky . . . . . . . . . . . . . . . . . . 125.1.2. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . 125.1.3. Ecuaciones normales . . . . . . . . . . . . . . . . . . . . . 135.1.4. Descomposicion en valores singulares . . . . . . . . . . . . 135.1.5. Inversa generalizada . . . . . . . . . . . . . . . . . . . . . 135.1.6. Herramientas especıficas . . . . . . . . . . . . . . . . . . . 14

5.2. Version 5.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.2.1. Factorizacion de Cholesky . . . . . . . . . . . . . . . . . . 155.2.2. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . 155.2.3. Ecuaciones normales . . . . . . . . . . . . . . . . . . . . . 155.2.4. Descomposicion en valores singulares . . . . . . . . . . . . 155.2.5. Inversa generalizada . . . . . . . . . . . . . . . . . . . . . 165.2.6. Herramientas especıficas . . . . . . . . . . . . . . . . . . . 16

1

Page 2: Comparativa de métodos y programas para un problema de m

6. Octave 166.1. Factorizacion de Cholesky . . . . . . . . . . . . . . . . . . . . . . 176.2. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . . . . . 176.3. Ecuaciones normales . . . . . . . . . . . . . . . . . . . . . . . . . 176.4. Descomposicion en valores singulares . . . . . . . . . . . . . . . . 186.5. Inversa generalizada . . . . . . . . . . . . . . . . . . . . . . . . . 186.6. Herramientas especıficas . . . . . . . . . . . . . . . . . . . . . . . 18

7. Sage 187.1. Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197.2. Factorizacion QR . . . . . . . . . . . . . . . . . . . . . . . . . . . 197.3. Ecuaciones normales . . . . . . . . . . . . . . . . . . . . . . . . . 197.4. Descomposicion en valores singulares . . . . . . . . . . . . . . . . 207.5. Inversa generalizada . . . . . . . . . . . . . . . . . . . . . . . . . 207.6. Herramientas especıficas . . . . . . . . . . . . . . . . . . . . . . . 20

8. Centrado de variables 20

9. Conclusiones 21

Resumen

El problema de mınimos cuadrados se puede resolver de diferentesformas, y con diferentes programas. A partir de un ejemplo que presentaun mal condicionamiento, comparamos las respuestas de los diferentesmetodos, y como son tratados por funciones de programas conocidos. Laconclusion final es que hay que saber que se hace desde el punto de vistamatematico, y que no se puede confiar a ciegas en un comando de unprograma para resolver un problema.

1. Introduccion

En el capıtulo 19 del libro de Trefthen y Bau [1, cap. 19], se plantea unexperimento para comparar los diferentes metodos de calculo de un problemade mınimos cuadrados. Se trata de aproximar mediante un polinomio de grado14 una funcion en el intervalo [0, 1], que presenta una gran oscilacion. Esto creauna matriz con un numero de condicion muy elevado, y se ponen a pruebaası los diferentes metodos para encontrar la solucion. Como lo que pretendees la comparativa de metodos, los calculos los realiza con una herramienta, enconcreto Matlab.

En estas notas pretendemos no solamente comparar los diferentes algoritmos,sino que damos un paso mas, y queremos ver como estan implementados envarias herramientas de uso comun. Veremos que en algunos casos obtenemosrespuestas erroneas, sin ningun aviso sobre el problema de partida de la matrizde coeficientes.

En la primera seccion planteamos el problema, y efectuamos los calculosdesde el punto de vista simbolico, para obtener una solucion tan precisa co-mo queramos. Sera la solucion respecto a la cual compararemos todos los re-sultados. Dedicamos una seccion a cada herramienta, donde se desarrollan losdiferentes algoritmos implementados. Tendremos algunos comunes, como ecua-ciones normales, Cholesky, QR, SVD, y otros especıficos, que usan funciones de

2

Page 3: Comparativa de métodos y programas para un problema de m

ajuste o mınimos cuadrados desarrollados explıcitamente. A partir de los resul-tados podremos inferir como estan programados estos metodos. La seccion finalesta dedicada a las conclusiones.

2. Planteamiento del problema

Para ilustrar el comportamiento de los algoritmos, los aplicaremos a un ejem-plo con m = 100 datos y n = 15 parametros a estimar. Queremos ajustar lafuncion exp(sen(4x)) con un polinomio de grado 14, bajo una muestra de 100puntos en el intervalo [0, 1], situados a igual distancia. La matriz del sistema esde tipo Vandermonde, por lo que sabemos que tiene un rango teorico igual a15 (rango completo por columnas). Sin embargo, el rango numerico puede sermenor.

Como primer paso, obtendremos el valor exacto de la solucion del problemaanterior. Para ello aprovechamos la capacidad simbolica de Maple (version 11,pero los comandos funcionan igual en versiones anteriores), que nos permiteresolver el sistema de forma exacta, y a continuacion calculamos su valor encoma flotante. En [1] se usa solamente la componente 15 del vector solucioncomo referencia para determinar la bondad de cada solucion. Aquı usaremos elvector solucion completo para comparar el error relativo, y mostraremos tambiendicho coeficiente.

Comenzamos con la asignacion de datos a la matriz y al vector:

restart:with(LinearAlgebra):

Digits:=32:

m:=100:n:=15:t:=Vector([$0..99]):

t:=1/(m-1) * t:

f:=(i,j)->t[i]^(j-1):

A:=Matrix(100,15):

for i from 1 to 100 do for j from 1 to 15 do A[i,j]:=f(i,j): end do; end do;

h:=i->exp(sin(4*t[i]));

h := i -> exp(sin(4 t[i]))

b:=Vector(100,h):

Las entradas de la matriz A y del vector b son simbolicas. Por ejemplo,

> b[100];A[99,3];

exp(sin(4))

9604

----

9801

Como primer metodo usamos la funcion LeastSquares.

3

Page 4: Comparativa de métodos y programas para un problema de m

sol1:=LeastSquares(A,b):

evalf(sol1[15]);

2006.7874531048518338761038133

Con la funcion evalf pasamos a coma flotante el resultado. El valor obtenido coneste metodo es mas fiable que con metodos exclusivamente numericos. Vamosa confirmarlo aplicando esta aproximacion a los otros metodos de calculo demınimos cuadrados. Por ejemplo, consideremos la factorizacion QR.

> (Q,R):=QRDecomposition(A):

> sol2:=LinearSolve(R,Transpose(Q).b):

> valor_patron:=evalf(sol2[15]);

2006.7874531048518338761038133

> Norm(sol1-sol2,2)

0

Obtenemos exactamente la misma solucion. Podemos pensar que la funcionLeastSquares usa este metodo. La ayuda de Maple solamente indica que usala factorizacion QR para entradas en coma flotante. Consideremos ahora lafactorizacion de Cholesky:

> G:=LUDecomposition(Transpose(A) . A, method=’Cholesky’):

> soltemp:=LinearSolve(G,Transpose(A) . b):

> sol4:=LinearSolve(Transpose(G),soltemp):

> evalf(sol4[15]);

2006.7874531048518338761038133

> Norm(sol1 - sol4,2);

0

Otra vez el mismo valor. Y veamos que ocurre con las ecuaciones normalesdirectamente.

> sol5:=LinearSolve(Transpose(A).A,Transpose(A).b):

> evalf(sol5[15]);

2006.7874531048518338761038133

> Norm(sol1-sol5,2)

0

Ya esperabamos este resultado.Por tanto, hemos confirmado de diferentes formas que el valor del coeficiente

que estamos buscando es

2006,7874531048518338761038133,

y es nuestro patron de medida. Los restantes valores del vector de soluciones seobtienen facilmente:

for i from 1 to 15 do print(i,evalf(sol1[i])): end do:

1, 1.0000126279096927594304384470324

4

Page 5: Comparativa de métodos y programas para un problema de m

2, 3.993475786505068807429779819573

3, 8.4543353478915654913558572770

4, -12.516264484268198571811602966

5, 149.20212711397611757474514710

6, -1642.3942602314237358713851474

7, 8801.380100061572159632883683

8, -32945.465948449191192303524437

9, 85181.45780463006453536389478

10, -147580.76240341046208704966775

11, 170032.70507622787954255058413

12, -128653.88642249533457589414966

13, 61470.247890921471943449430540

14, -16819.733820371611810603311041

15, 2006.7874531048518338761038133

Nuestro objetivo es doble. Por un lado, vamos a poner a prueba los diferentesmetodos numericos para resolver este problema. Por otro, revisamos como estanimplementados en programas de uso comun. En Excel no ha sido posible probarla funcion de ajuste polinomico, pues el mayor grado admitido es 6.

3. Matlab

Comencemos entonces con los metodos en Matlab (R2007b). Editamos unscript de Matlab e insertamos los siguientes comandos:

format long;

m=100;n=15;

t=(0:m-1)’/(m-1); A=[];for i=1:n, A=[A t.^(i-1)];end

b=exp(sin(4*t));

valor_patron = 2006.7874531048518338761038133;

sol_patron = [1.0000126279096927594304384470324, 3.993475786505068807429779819573, ...

8.4543353478915654913558572770, -12.516264484268198571811602966, ...

149.20212711397611757474514710, -1642.3942602314237358713851474, ...

8801.380100061572159632883683, -32945.465948449191192303524437, ...

85181.45780463006453536389478, -147580.76240341046208704966775, ...

170032.70507622787954255058413, -128653.88642249533457589414966, ...

61470.247890921471943449430540, -16819.733820371611810603311041, ...

2006.7874531048518338761038133]’

El vector t contiene los 100 puntos, y la matriz A es tipo Vandermonde, deorden 100 × 15, cuyas columnas son las potencias 1, τ, . . . , τ14 de las muestrasen los puntos de t. El vector b tiene los valores de la funcion exp(sen(4x)) en lospuntos de muestra. La incognita es un vector x de 15 componentes, que contienelos coeficientes del polinomio de grado 14. La primera componente de x es eltermino independiente y la ultima el coeficiente del termino X14.

En primer lugar, vamos a calcular el numero de condicion de A y AtA.

>> k=cond(A)

k =

2.2718e+010

5

Page 6: Comparativa de métodos y programas para un problema de m

>> cond(A’*A)

ans =

3.5856e+017

Observamos que el numero de condicion de A es alto, y el de la matriz decoeficientes AtA de las ecuaciones normales bastante peor.

3.1. Factorizacion de Cholesky

Como la matriz AtA es simetrica, podemos intentar la factorizacion de Cho-lesky AtA = RtR, con R triangular superior. Veamos que ocurre.

>> R=chol(A’*A)

??? Error using ==> chol

Matrix must be positive definite.

La matriz AtA es casi singular.

>> det(A’*A)

ans =

-2.2570e-090

Por ello, el metodo de calculo de Cholesky falla, pues encuentra un pivote igualcero para Matlab.

3.2. Factorizacion QR

Consideremos una factorizacion QR reducida A = QR, donde Q es unamatriz de la misma dimension que A y columnas ortonormales, y R es cuadraday triangular superior. Entonces

AtA = RtQtQR = RtR.

Como Q es de columnas ortonormales, la matriz QtQ es la identidad de ordenn. El sistema de ecuaciones normales queda entonces

RtRx = RtQtb.

Si R es no singular, la solucion del problema se obtiene resolviendo el sistemaRx = Qtb. Vamos a hacerlo en Matlab.

>> format long

>> [Q,R]=qr(A,0);

>> xQR=R\(Q’*b);

>> x(15)

ans =

2.006787283454561e+003

>> (xQR(15) - valor_patron)/valor_patron

6

Page 7: Comparativa de métodos y programas para un problema de m

ans =

-8.453824576060719e-008

>> norm(xQR-sol_patron,2)/norm(sol_patron,2)

ans =

6.396519003314512e-008

El error relativo es del orden de 10−8. Como los calculos estan hechos con dobleprecision de 10−16, esto significa que los errores de redondeo se han amplificadopor un factor de 1010. Esto parece bastante malo, pero si recordamos el numerode condicion vemos que es del orden de 1010. Ası, la inexactitud de x15 se puedeexplicar por el mal condicionamiento, y no por inestabilidad del algoritmo.

En lo anterior, hemos calculado Q de manera explıcita, pero realmente noes necesario. Basta almacenar los vectores vk de las matrices de Householder,y usarlos para el calculo de Qtb. Esto lo podemos conseguir en Matlab cal-culando una factorizacion QR de la matriz ampliada

[A b

]. En el proceso

de factorizacion, las transformaciones que se aplican a la matriz A para hacerlatriangular superior se aplican tambien a b, y nos deja el valor de Qtb en las pri-meras n posiciones de la columna n+ 1. Es necesario multiplicar por una nuevamatriz de Householder, para hacer las entradas n+2, . . . ,m de la columna n+1igual a cero, pero esto no afecta a las primeras n entradas de esa columna, queson las que nos interesan.

>> [Q2,R2]=qr([A b],0);

>> R2a=R2(1:n,1:n);

>> Qb=R2(1:n,n+1);

>> xQR2=R2a\Qb;

>> xQR2(15)

ans =

2.006787284261716e+003

>> (xQR2(15) - valor_patron)/valor_patron

ans =

-8.413603339940180e-008

>> norm(xQR2-sol_patron,2)/norm(sol_patron,2)

ans =

6.370459565063055e-008

La respuesta es casi identica a la anterior. Esto indica que los errores introdu-cidos en la factorizacion QR de A ocultan a los introducidos en el calculo deAtb.

3.3. Ecuaciones normales

Podemos intentar la resolucion directa del sistema de ecuaciones normalesAtAx = Atb.

>> xnormal=(A’*A)\(A’*b);

Warning: Matrix is close to singular or badly scaled.

7

Page 8: Comparativa de métodos y programas para un problema de m

Results may be inaccurate. RCOND = 2.037440e-018.

>> xnormal(15)

ans =

-6.098392279291390e+002

El aviso de Matlab es bastante elocuente, y el resultado es muy malo. Es elpeor que hemos obtenido, y no coincide ningun dıgito. La razon esta en queel condicionamiento del sistema de ecuaciones normales esta gobernado porcond(A)2.

3.4. Descomposicion en valores singulares

Vamos a calcular la descomposicion en valores singulares reducida de A, esdecir, expresamos A = U ΣV t, donde U es una matriz de orden m × n, decolumnas ortonormales, Σ es una matriz diagonal de orden n y V es una matrizortogonal de orden n. Entonces

AtA = V ΣtU tU ΣV t = V (ΣtΣ)V t,

y el sistema de ecuaciones normales queda

V (ΣtΣ)V tx = V ΣtU tb.

Si Σ es no singular, el sistema a resolver es

ΣV tx = U tb.

Lo descomponemos en dos sistemas{Σy = U tbV tx = y

,

y entonces x = V y, donde y es la solucion de Σy = U tb. Existe un comandoen Matlab para calcular esta factorizacion reducida, y es mediante svd(A,0).En nuestro caso,

>> [U,S,V]=svd(A,0);

>> xSVD=V*(S\(U’*b));

>> xSVD(15)

ans =

2.006787283450415e+003

>> (xSVD(15) - valor_patron)/valor_patron

ans =

-8.454031171512151e-008

>> norm(xSVD-sol_patron,2)/norm(sol_patron,2)

ans =

6.396672221557381e-008

3.5. Inversa generalizada

El calculo de mınimos cuadrados mediante la inversa generalizada de Moore-Penrose A+ suele pasar por la descomposicion en valores singulares. En este casotenemos un comando especıfico:

8

Page 9: Comparativa de métodos y programas para un problema de m

>> xpinv=pinv(A)*b;

>> xpinv(15)

ans =

2.006787283463171e+003

>> (xpinv(15)-valor_patron)/valor_patron

ans =

-8.453395545493429e-008

>> norm(xpinv - sol_patron,2)/norm(sol_patron,2)

ans =

6.396432831277665e-008

3.6. Herramientas especıficas

En Matlab existen conjuntos de rutinas especıficas para aproximar unafuncion por un polinomio. Vamos a tratar poltyfit y \.

1. Comando \. Resuelve el problema de mınimos cuadrados a traves de ma-trices de Householder.

>> xslash=A\b;

>> xslash(15)

ans =

2.006787595731301e+003

>> (xslash(15) - valor_patron)/valor_patron

ans =

7.107202554620744e-008

>> norm(xslash-sol_patron,2)/norm(sol_patron,2)

ans =

3.955374055300423e-008

La respuesta es ligeramente diferente a QR, debido a que Matlab usa unafactorizacion QR con pivoteo. No la discutiremos aquı. Desde el punto devista de analisis de estabilidad, estas variantes de la factorizacion QR soniguales. El coste de este procedimiento es del orden de 2mn2.

2. Comando polyfit.

>> format long

>> xpoly = polyfit(t,b,14);

Warning: Polynomial is badly conditioned. Add points with distinct X

values, reduce the degree of the polynomial, or try centering

and scaling as described in HELP POLYFIT.

Aplicamos entonces el centrado y escalado, que es un parametro del co-mando. El comando polyfit devuelve en la primera posicion el coeficientedel termino de mayor grado. Para comparar con la solucion, hay que des-hacer el cambio.

[xpoly, S, MU] = polyfit(t,b,14) ;

xpoly(1)

ans =

9

Page 10: Comparativa de métodos y programas para un problema de m

6.911774280695585e-05

(xpoly(1)/MU(2)^14 - valor_patron)/valor_patron

ans =

4.331672350147769e-11

4. Maple

En el caso de Maple vamos a evaluar su capacidad numerica, no la simbolica.Lo primero que hacemos es transformar las entradas simbolicas en numericaspara la solucion con precision extendida:

sol_patron:=evalf(sol1):

Los calculos de la solucion del problema de mınimos cuadrados mediante losdiferentes metodos necesitan como punto de partida una matriz A y un vectorb de tipo numerico en coma flotante. Si mantenemos el valor de la variable deentorno Digits a 32, los errores de las soluciones oscilan entre 10−13 y 10−23.Para comparar con las otras herramientas, asignamos su valor original, que es20. Por tanto, debemos crear la matriz A y el vector b de forma numerica desdeel principio.

A:=map(evalf, A):

b:=map(evalf, b):

tt:=Vector(100,1):for ii from 0 to 99 do tt[ii+1]:=evalf(1/(m-1)*ii); end do:

ff:=(i,j)->tt[i]^(j-1):AA:=Matrix(100,15):

for i from 1 to 100 do for j from 1 to 15 do AA[i,j]:=ff(i,j): end do: end do:

bb:=Vector(100,1):

for i from 1 to 100 do bb[i]:=exp(sin(4*tt[i])): end do:

4.1. Factorizacion de Cholesky

G:=LUDecomposition(Transpose(A) . A, method=’Cholesky’):

soltemp:=LinearSolve(G,Transpose(A) . b):

solChol:=LinearSolve(Transpose(G),soltemp):

solChol[15];

1491.5657223477764460

(solChol[15]-valor_patron)/valor_patron;

-.25673956151157766584

Norm(solChol - sol_patron,2)/Norm(sol_patron,2);

.15670255857671663111

4.2. Factorizacion QR

(Q,R):=QRDecomposition(A):

solQR:=LinearSolve(R,Transpose(Q).b):

solQR[15];

2006.7874532704272153

(solQR[15]-valor_patron)/valor_patron;

.82507682188178858527e-10

10

Page 11: Comparativa de métodos y programas para un problema de m

Norm(solQR-sol_patron,2)/Norm(sol_patron,2);

.59669716961184577606e-10

4.3. Ecuaciones normales

solNormal:=LinearSolve(Transpose(A).A,Transpose(A).b):

solNormal[15];

1783.5141791619578132

(solNormal[15]-valor_patron)/valor_patron;

-.11125905416512901869

Norm(solNormal - sol_patron,2)/Norm(sol_patron,2);

.68780636996765469582e-1

4.4. Descomposicion en valores singulares

U, Vt := SingularValues(A, output=[’U’, ’Vt’]):

SS:=SingularValues(A):

El rango de A es 15, por lo que la matriz SS tiene que ser diagonal, con lasprimeras 15 entradas distintas de cero, y la numero 16 igual a cero.

> SS[15],SS[16];

.60373544617753943090e-910^-9, 0

Construimos entonces la SVD reducida, y resolvemos el sistema:

U1:=SubMatrix(U,1..100,1..15):

S1:=DiagonalMatrix(SS[1..15]):

solSVD:=Transpose(Vt) . (LinearSolve(S1,Transpose(U1) . b)):

solSVD[15];

2006.7874529844581333

(solSVD[15]-valor_patron)/valor_patron;

-.59993249615812501174e-10

Norm(solSVD - sol_patron,2)/Norm(sol_patron,2);

.41880829543977519082e-10

4.5. Herramientas especıficas

Usamos las funciones LinearAlgebra[LeastSquares] y Statistics[PolynomialFit].

solLST1:=LeastSquares(A,b):

solLST1[15];

2006.7874532704117265

(solLST1[15]-valor_patron)/valor_patron;

.82499963981661254427e-10

Norm(solLST1 - sol_patron,2)/Norm(sol_patron,2);

.59665521864256114050e-10

with(Statistics):

solPF:=PolynomialFit(14,t,b);

solPF[15];

2006.7874531078715652

11

Page 12: Comparativa de métodos y programas para un problema de m

(solPF[15]-valor_patron)/valor_patron;

-11

0.15047589097330395103 10

Norm(solPF-sol_patron,2)/Norm(sol_patron,2);

-11

0.10260993161831952250 10

5. Scilab

La secuencia de comandos para SciLab es la misma que para Matlab.

5.1. Version 5.3.0

format("v",16);

m=100;n=15;

t=(0:m-1)’/(m-1); A=[];for i=1:n, A=[A t.^(i-1)];end

b=exp(sin(4*t));

valor_patron = 2006.7874531048518338761038133;

sol_patron = [1.0000126279096927594304384470324, 3.993475786505068807429779819573, ...

8.4543353478915654913558572770, -12.516264484268198571811602966, ...

149.20212711397611757474514710, -1642.3942602314237358713851474, ...

8801.380100061572159632883683, -32945.465948449191192303524437, ...

85181.45780463006453536389478, -147580.76240341046208704966775, ...

170032.70507622787954255058413, -128653.88642249533457589414966, ...

61470.247890921471943449430540, -16819.733820371611810603311041, ...

2006.7874531048518338761038133]’

5.1.1. Factorizacion de Cholesky

format("v",16)

R=chol(A’*A);

!--error 29

matrix is not positive definite

det(A’*A)

ans =

- 1.995995885D-89

5.1.2. Factorizacion QR

format("v",16)

[Q1,R1]=qr(A,"e");

xQR=R1\(Q1’*b);

warning matrix is close to singular or badly scaled. rcond = 2.5781D-11

computing least squares solution. (see lsq)

xQR(15)

12

Page 13: Comparativa de métodos y programas para un problema de m

ans =

- 649.21206592594

-->(xQR(15) - valor_patron)/valor_patron

ans =

- 1.3235081348159

-->norm(xQR - sol_patron,2)/norm(sol_patron,2)

ans =

1.007910710766

Tenemos un aviso de que algo puede ir mal, y efectivamente el resultado es muymalo.

5.1.3. Ecuaciones normales

-->xnormal=(A’*A)\(A’*b);

warning

matrix is close to singular or badly scaled. rcond = 1.0901D-18

computing least squares solution. (see lsq)

-->(xnormal(15) - valor_patron)/valor_patron

ans =

- 0.9963043887768

-->norm(xnormal - sol_patron,2)/norm(sol_patron,2)

ans =

0.9999756460199

5.1.4. Descomposicion en valores singulares

-->[U,S,V]=svd(A,"e");

-->xSVD=V*(S\(U’*b));

warning

matrix is close to singular or badly scaled. rcond = 4.4018D-11

computing least squares solution. (see lsq)

-->(xSVD(15) - valor_patron)/valor_patron

ans =

- 0.9578984453643

-->norm(xSVD - sol_patron,2)/norm(sol_patron,2)

ans =

0.9999838053207

5.1.5. Inversa generalizada

-->xpinv=pinv(A)*b;

-->(xpinv(15) - valor_patron)/valor_patron

ans =

- 0.0000000151343

-->norm(xpinv - sol_patron,2)/norm(sol_patron,2)

ans =

13

Page 14: Comparativa de métodos y programas para un problema de m

0.0000000225802

5.1.6. Herramientas especıficas

1. Comando \.

-->xslash=A\b;

rank defficient. rank = 13

-->(xslash(15) - valor_patron)/valor_patron

ans =

- 1.3235081351117

-->norm(xslash - sol_patron,2)/norm(sol_patron,2)

ans =

1.007910710774

Esto nos dice que este comando usa la factorizacion QR.

2. Comando lsq.

-->xlsq=lsq(A,b);

-->(xlsq(15) - valor_patron)/valor_patron

ans =

- 1.4040027179604

-->norm(xlsq - sol_patron,2)/norm(sol_patron,2)

ans =

0.9990480335231

No hay aviso de que algo va a ir mal, y da un resultado muy malo.

5.2. Version 5.4.1

format("v",16);

m=100;n=15;

t=(0:m-1)’/(m-1); A=[];for i=1:n, A=[A t.^(i-1)];end

b=exp(sin(4*t));

valor_patron = 2006.7874531048518338761038133;

sol_patron = [1.0000126279096927594304384470324, 3.993475786505068807429779819573, ...

8.4543353478915654913558572770, -12.516264484268198571811602966, ...

149.20212711397611757474514710, -1642.3942602314237358713851474, ...

8801.380100061572159632883683, -32945.465948449191192303524437, ...

85181.45780463006453536389478, -147580.76240341046208704966775, ...

170032.70507622787954255058413, -128653.88642249533457589414966, ...

61470.247890921471943449430540, -16819.733820371611810603311041, ...

2006.7874531048518338761038133]’

14

Page 15: Comparativa de métodos y programas para un problema de m

5.2.1. Factorizacion de Cholesky

format("v",16)

R=chol(A’*A);

soltemp = R’\(A’*b) ;

solChol = R\soltemp ;

solChol(15) - sol_patron(15))/sol_patron(15)

ans =

- 1.2204323280225

norm(solChol - sol_patron,2)/norm(sol_patron,2)

ans =

0.9760194550526

5.2.2. Factorizacion QR

format("v",16)

[Q1,R1]=qr(A,"e");

xQR=R1\(Q1’*b);

xQR(15)

ans =

2006.7879222768

(xQR(15) - valor_patron)/valor_patron

ans =

0.0000002337926

norm(xQR - sol_patron,2)/norm(sol_patron,2)

ans =

0.0000001448773

5.2.3. Ecuaciones normales

xnormal=(A’*A)\(A’*b);

(xnormal(15) - valor_patron)/valor_patron

ans =

- 1.3982542397095

norm(xnormal - sol_patron,2)/norm(sol_patron,2)

ans =

0.9695547854431

5.2.4. Descomposicion en valores singulares

[U,S,V]=svd(A,"e");

xSVD=V*(S\(U’*b));

(xSVD(15) - valor_patron)/valor_patron

ans =

0.0000002337920

norm(xSVD - sol_patron,2)/norm(sol_patron,2)

ans =

15

Page 16: Comparativa de métodos y programas para un problema de m

0.0000001448771

5.2.5. Inversa generalizada

xpinv=pinv(A)*b;

(xpinv(15) - valor_patron)/valor_patron

ans =

0.0000002337904

norm(xpinv - sol_patron,2)/norm(sol_patron,2)

ans =

0.0000001448785

5.2.6. Herramientas especıficas

1. Comando \.

xslash=A\b;

(xslash(15) - valor_patron)/valor_patron

ans =

0.0000000911646

norm(xslash - sol_patron,2)/norm(sol_patron,2)

ans =

0.0000000535619

2. Comando lsq.

-->xlsq=lsq(A,b);

(xlsq(15) - valor_patron)/valor_patron

ans =

- 1.4040027180439

norm(xlsq - sol_patron,2)/norm(sol_patron,2)

ans =

0.9990480335147

6. Octave

Pendiente de los datos de la ultima version sobre Linux. Las pruebas se hanhecho con la version 3.2.4. La secuencia de comandos inicial es la misma quepara Matlab:

format long;

m=100;n=15;

t=(0:m-1)’/(m-1); A=[];for i=1:n, A=[A t.^(i-1)];end

b=exp(sin(4*t));

valor_patron = 2006.7874531048518338761038133;

sol_patron = [1.0000126279096927594304384470324, 3.993475786505068807429779819573, ...

16

Page 17: Comparativa de métodos y programas para un problema de m

8.4543353478915654913558572770, -12.516264484268198571811602966, ...

149.20212711397611757474514710, -1642.3942602314237358713851474, ...

8801.380100061572159632883683, -32945.465948449191192303524437, ...

85181.45780463006453536389478, -147580.76240341046208704966775, ...

170032.70507622787954255058413, -128653.88642249533457589414966, ...

61470.247890921471943449430540, -16819.733820371611810603311041, ...

2006.7874531048518338761038133]’

6.1. Factorizacion de Cholesky

> R = chol(A’*A);

> c = A’*b;

> y = R’\c;

> xChol=R\y;

> (xChol(15) - valor_patron)/valor_patron

ans = -1.67962851650969

> norm(xChol- sol_patron,2)/norm(sol_patron,2)

ans = 0.981470104879422

En versiones anteriores advertıa de problemas en la matriz R al calcular lafactorizacion de Cholesky.

6.2. Factorizacion QR

> format long

> [Q1,R1]=qr(A,0);

> xQR = R1 \ (Q1’ * b);

> (xQR(15) - valor_patron)/valor_patron

ans = -2.64493206932710e-008

> norm(xQR - sol_patron,2)/norm(sol_patron,2)

ans = 1.32275937478565e-008

6.3. Ecuaciones normales

> xnormal = (A’*A) \ (A’*b);

warning: matrix singular to machine precision, rcond = 1.95568e-019

warning: attempting to find minimum norm solution

warning: dgelsd: rank deficient 15x15 matrix, rank = 12 > x(15)

> (xnormal(15) - valor_patron)/valor_patron

ans = -0.957907312531143

Tampoco funciona con las funciones especiales que resuelven sistemas de ecua-ciones donde la matriz de coeficientes es simetrica definida positiva.

> B = A’*A;

> c = A’*b;

> xnormal2 = bicgstab(B,c);

bicgstab converged at iteration 15 bicgstab converged at iteration 0

17

Page 18: Comparativa de métodos y programas para un problema de m

> (xnormal2(15) - valor_patron)/valor_patron

ans = -0.996810485581730

> xnormal3 = cgs(B,c);

> (xnormal3(15) - valor_patron)/valor_patron

ans = -1.00109615464132

6.4. Descomposicion en valores singulares

> [U,S,V]=svd(A,0);

> xSVD=V * (S \ (U’*b));

> (xSVD(15) - valor_patron)/valor_patron

ans = -2.64494597152184e-008

> norm(xSVD - sol_patron,2)/norm(sol_patron,2)

ans = 1.32276761230050e-008

6.5. Inversa generalizada

> xpinv = pinv(A) * b;

> (xpinv(15) - valor_patron)/valor_patron

ans = -2.64503239853202e-008

> norm(xpinv - sol_patron,2)/norm(sol_patron,2)

ans = 1.32280127177657e-008

6.6. Herramientas especıficas

1. Comando \.

> xslash = A\b;

> (xslash(15) - valor_patron)/valor_patron

ans = -2.64510262331034e-008

> norm(xslash - sol_patron,2)/norm(sol_patron,2)

ans = 1.32282816548089e-008

2. Comando ols. El manual indica el uso de la funcion pinv.

> [xols, sigma,r] = ols(b,A);

> (xols(15) - valor_patron)/valor_patron

ans = -1.15365334040336e-007

> norm(xols - sol_patron,2)/norm(sol_patron,2)

ans = 7.24036138638635e-008

3. Comando polyfit.

7. Sage

Las rutinas de calculo de algebra lineal numerica que utiliza Sage son lasde Numpy o de Scipy. Usaremos las de Scipy, tal como recomienda el manualde referencia.

18

Page 19: Comparativa de métodos y programas para un problema de m

import numpy as np

import scipy as sp

from scipy import linalg

m=100

tt=sp.array([j/99 for j in range(m)]);

sol_patron = sp.array([

1.0000126279096927594304384470324, 3.993475786505068807429779819573,

8.4543353478915654913558572770, -12.516264484268198571811602966,

149.20212711397611757474514710, -1642.3942602314237358713851474,

8801.380100061572159632883683, -32945.465948449191192303524437,

85181.45780463006453536389478, -147580.76240341046208704966775,

170032.70507622787954255058413, -128653.88642249533457589414966,

61470.247890921471943449430540, -16819.733820371611810603311041,

2006.7874531048518338761038133]);

Atemp = sp.array([tt^0, tt, tt^2, tt^3, tt^4, tt^5, tt^6, tt^7,

tt^8, tt^9, tt^10, tt^11, tt^12, tt^13, tt^14]);

A = Atemp.transpose();

b = sp.array([exp(sin(4*tt[j])) for j in range(m)]);

7.1. Cholesky

B = A.transpose().dot(A);

R = sp.linalg.cholesky(B);

c = A.transpose().dot(b);

c1 = sp.linalg.solve_triangular(R.transpose(), c, lower=true) ;

solChol = sp.linalg.solve_triangular(R, c1)

(solChol[14] - sol_patron[14])/sol_patron[14]

-3.3751536911947606

sp.linalg.norm(solChol - sol_patron)/sp.linalg.norm(sol_patron)

1.102499372042844

7.2. Factorizacion QR

QA, RA = sp.linalg.qr(A,mode=’economic’);

cQA = (QA.T).dot(b)

solQR = sp.linalg.solve_triangular(RA,cQA)

(solQR[14] - sol_patron[14])/sol_patron[14]

-2.4392909746715248e-08

sp.linalg.norm(solQR - sol_patron)/sp.linalg.norm(sol_patron)

9.954238724732369e-09

7.3. Ecuaciones normales

Bnormal = (A.T).dot(A)

bnormal = (A.T).dot(b)

solNormal = sp.linalg.solve(Bnormal, bnormal)

sp.linalg.norm(solNormal - sol_patron)/sp.linalg.norm(sol_patron)

19

Page 20: Comparativa de métodos y programas para un problema de m

1.0103546099498162

7.4. Descomposicion en valores singulares

UA, sA, VA = sp.linalg.svd(A,full_matrices=0)

SA = sp.linalg.diagsvd(sA,15,15)

solSVD = (VA.T).dot(sp.linalg.solve(SA, (UA.T).dot(b)))

# ojo con la sintaxis; es al rev\’{e}s que en muchos otros programas

sp.linalg.norm(solSVD - sol_patron)/sp.linalg.norm(sol_patron)

9.953924434706912e-09

7.5. Inversa generalizada

solPinv1 = (sp.linalg.pinv(A)).dot(b)

solPinv2 = (sp.linalg.pinv2(A)).dot(b)

sp.linalg.norm(solPinv1 - sol_patron)/sp.linalg.norm(sol_patron)

9.953252223262366e-09

sp.linalg.norm(solPinv2 - sol_patron)/sp.linalg.norm(sol_patron)

0.9977949887477375

7.6. Herramientas especıficas

sol_lstsq=np.linalg.lstsq(A,b)[0]

sol_lstsq[14]

2006.7874041457626

(sol_lstsq[14] - sol_patron[14])/sol_patron[14]

-2.4396748769245077e-08

# Con Scipy obtenemos el mismo resultado

from scipy import linalg

sol_lstsq_sp = sp.linalg.lstsq(A,b)[0]

sol_lstsq_sp[14]

2006.787404145764

(sol_lstsq_sp[14] - sol_patron[14])/sol_patron[14]

-2.439674808943115e-08

sp.linalg.norm(sol_lstsq_sp - sol_patron)/sp.linalg.norm(sol_patron)

9.956773423060118e-09

8. Centrado de variables

Una tecnica muy habitual para el ajuste por mınimos cuadrados es el cen-trado y escalado previo de las variables que se utilizan para formar el modelolineal. En este ejemplo, usamos unicamente la variable t, por lo que se defineuna nueva variable vi = 1

σ (ti − µ), donde µ es la media de la muestra ti y σla desviacion estandar. El ajuste se realiza ahora con un polinomio en v, porlo que la nueva matriz de coeficientes tiene como columnas las potencias de laforma vki ; esto es lo que hemos hecho con la herramienta polyfit de Matlab.La ventaja, en general, es la disminucion del numero de condicion de la matriz

20

Page 21: Comparativa de métodos y programas para un problema de m

de coeficientes del sistema de ecuaciones normales. Un paso mas en esta lınea,pero que no trataremos aquı, es el uso de polinomios ortogonales como base delespacio vectorial de polinomios de grado menor que 15, lo que mejora aun masesta matriz.

9. Conclusiones

Resumimos los resultados en el cuadro 1.

Los diferentes algoritmos dan los resultados esperados para un problemamal condicionado como este. La factorizacion QR, SVD o las herramientasespecıficas de cada programa son los que proporcionan un mejor resultado.

Algunos metodos dan un aviso de que algo puede ir mal. Estan marcadoscon la palabra “aviso”.

El comportamiento de los productos ha cambiado en las diferentes ver-siones, tal como se ha mostrado en Scilab. Es mas, en las versiones masantiguas se advierte del caracter mal condicionado de la matriz, aviso queno aparece en las mas actuales. Es una cuestion de diseno sobre la gestionde errores.

Los buenos resultados de Maple estan condicionados al uso de Digits:=20,que es el valor de arranque. Se obtienen peores resultados para un valorigual a 16.

21

Page 22: Comparativa de métodos y programas para un problema de m

Metodo Matlab R2007b Maple v11 Scilab v5.3.0 Scilab v5.4.1 Octave Sage/ScipyCholesky error 10−1 error 100 100 100

QR 6 × 10−8 6 × 10−11 100 (aviso) 10−7 10−8 10−8

Normales 6 × 102 (aviso) 6 × 10−2 100 (aviso) 100 100 100

SVD 6 × 10−8 4 × 10−11 100 (aviso) 10−7 10−8 10−8

pinv 6 × 10−8 N/A 2 × 10−8 10−7 10−8 10−8 (pinv1)

Especıfica3 × 10−8

(\)6 × 10−11

(LeastSq)101

(\)5 × 10−8

(\)10−8

(\)2 × 10−8

(lstsq)4 × 10−11

(polyfit)10−12

(PolynomialFit)10lsq

100

lsq

7 × 10−8

ols

polyfit

Cuadro 1: Error relativo segun metodo y programa

22

Page 23: Comparativa de métodos y programas para un problema de m

Referencias

[1] L.N. Trefethen, D. Bau III, Numerical Linear Algebra, (1997), SIAM.

23