Métodos Numéricos Tema 7: Valores y vectores propios Dep. Matemática Aplicada III EPSEM-UPC Profesor: Francisco Palacios Mayo 2008, Versión 1.3 Ejercicio 1 > with(linalg): Warning, new definition for norm Warning, new definition for trace > a:=matrix(2,2,[1,2,2,1]); ⎡1 a := ⎢ ⎣2 2⎤ ⎥ 1⎦ Polinomio característico > p:=charpoly(a,t); p := t2 − 2 t − 3 Valores y vectores propios > vaps:=eigenvals(a); veps:=eigenvects(a); vaps := -1, 3 veps := [ -1, 1, { [ -1, 1 ] } ], [ 3, 1, { [ 1, 1 ] } ] Matriz de valores propios. > v:=transpose([[-1,1],[1,1]]);#entro los vectores por filas y traspongo v1:=inverse(v); d:=evalm(v1&*a&*v); ⎡ -1 v := ⎢ ⎣ 1 ⎡ ⎢ ⎢ v1 := ⎢⎢ ⎢ ⎢ ⎣ 1⎤ ⎥ 1⎦ 1 ⎤ ⎥ 2 ⎥⎥ 1 ⎥⎥ ⎥ 2 ⎦ -1 2 1 2 ⎡ -1 d := ⎢ ⎣ 0 0⎤ ⎥ 3⎦ Ejercicio 2 Podemos usar una matriz con elementos sin asignar para ver la forma que tiene en general el polinomio característico. > a:=matrix(2,2,[]);; print(a); p:=charpoly(a,t); a := array( 1 .. 2, 1 .. 2, [ ] ) ⎡a1, 1 ⎢⎢ ⎣a2, 1 a1, 2⎤ ⎥ a2, 2⎥⎦ p := t2 − t a2, 2 − a1, 1 t + a1, 1 a2, 2 − a1, 2 a2, 1 Ejercicio 3 1. Calculamos traza y determinante. > a:=matrix(2,2,[-5,18,-6,16]); tr:=trace(a); d:=det(a); ⎡-5 a := ⎢ ⎣-6 18⎤ ⎥ 16⎦ tr := 11 d := 28 Calculamos > tr^2-4*d; 9 La matriz tendrá dos valores propios reales. 2. Valores propios. Cálculo de los valores propios usando la traza y el determinante. vp1, vp2 son los valores propios. Page 1 > eq1:=vp1+vp2=tr; eq2:=vp1*vp2=d; solve({eq1,eq2},{vp1,vp2});#resolvemos el sistema eq1 := vp1 + vp2 = 11 eq2 := vp1 vp2 = 28 { vp2 = 4, vp1 = 7 }, { vp2 = 7, vp1 = 4 } Càlculo usando el polinomio característico. > p:=t^2-tr*t+d; solve(p,t); p := t2 − 11 t + 28 4, 7 3,4. Calculo de vectores propios y diagonalización. > eigenvects(a); v:=transpose([[2,1],[3/2,1]]); v1:=inverse(v); ad:=evalm(v1&*a&*v); ⎡ ⎡3 ⎤ ⎤ [ 4, 1, { [ 2, 1 ] } ], ⎢⎢ 7, 1, { ⎢⎢ , 1 ⎥⎥ } ⎥⎥ ⎣ ⎣2 ⎦ ⎦ ⎡ ⎢ v := ⎢⎢ ⎢ ⎣ 3 ⎤ ⎥ 2 ⎥⎥ ⎥ 1 ⎦ 2 1 ⎡2 v1 := ⎢ ⎣-2 -3⎤ ⎥ 4⎦ ⎡4 ad := ⎢ ⎣0 0⎤ ⎥ 7⎦ > Ejercicio 4 > with(linalg): 1. Cálculo de valores propios. > a:=matrix(3,3,[3,-2,-6,-4,5,4,5,-5,-8]); p:=charpoly(a,x); espect:=solve(p); ⎡3 ⎢ a := ⎢-4 ⎢ ⎣5 -2 5 -5 -6⎤ ⎥ 4⎥ ⎥ -8⎦ p := x3 − 7 x + 6 espect := 1, 2, -3 Cálculo directo con eigenvals. > eigenvals(a); 1, 2, -3 2. Vectores propios, cálculo directo con eigenvects. > eigenvects(a); [ -3, 1, { [ 1, 0, 1 ] } ], [ 2, 1, { [ -2, -4, 1 ] } ], [ 1, 1, { [ 1, 1, 0 ] } ] 3. Matriz de cambio y diagonalización. > v:=transpose([[1,0,1],[-2,-4,1],[1,1,0]]); v1:=inverse(v); d:=evalm(v1&*a&*v); ⎡1 ⎢ v := ⎢0 ⎢ ⎣1 -2 -4 1 1⎤ ⎥ 1⎥ ⎥ 0⎦ ⎡-1 ⎢ v1 := ⎢ 1 ⎢ ⎣4 1 -1 -3 2⎤ ⎥ -1⎥ ⎥ -4⎦ ⎡-3 ⎢ d := ⎢ 0 ⎢ ⎣0 0 2 0 0⎤ ⎥ 0⎥ ⎥ 1⎦ Page 2 Ejercicio 5 > a:=matrix(3,3,[1,-1,0,-2,4,-2,0,-1,1]); p:=charpoly(a,x); esp:=solve(p); eigenvects(a); ⎡1 ⎢ a := ⎢-2 ⎢ ⎣0 -1 4 -1 0⎤ ⎥ -2⎥ ⎥ 1⎦ p := x3 − 6 x2 + 5 x esp := 0, 1, 5 [ 1, 1, { [ 1, 0, -1 ] } ], [ 0, 1, { [ 1, 1, 1 ] } ], [ 5, 1, { [ 1, -4, 1 ] } ] > v:=transpose(matrix(3,3,[1,-4,1,-1,0,1,1,1,1])); v1:=inverse(v); d:=evalm(v1&*a&*v); ⎡1 ⎢ v := ⎢-4 ⎢ ⎣1 ⎡ ⎢ ⎢ ⎢ ⎢ v1 := ⎢⎢ ⎢ ⎢ ⎢ ⎢⎢ ⎣ -1 0 1 1 -1 10 -1 5 1⎤ ⎥ 1⎥ ⎥ 1⎦ 1 ⎤ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ 2 ⎥ ⎥ 2 ⎥ ⎥⎥ 5 ⎦ 10 1 0 2 2 1 5 5 ⎡5 ⎢ d := ⎢ 0 ⎢ ⎣0 0 1 0 0⎤ ⎥ 0⎥ ⎥ 0⎦ Ejercicio 6 Versión básica del programa para el método de la potencia usando la norma de infinito. En este programa, ny1,ny2,ny3,... tiende al valor absoluto del valor propio dominate. > Digits:=8; a:=matrix(3,3,[-4,14,0,-5,13,0,-1,0,2]); x0:=[1,0,0]; n:=5; for i from 0 to n-1 do `****************** iteración `,i,`*************`; y.(i+1):=evalm(a&*x.i); ny.(i+1):=norm(y.(i+1)); x.(i+1):=evalf(evalm(1/ny.(i+1)*y.(i+1))); od; Digits := 8 ⎡-4 ⎢ a := ⎢-5 ⎢ ⎣-1 14 13 0 0⎤ ⎥ 0⎥ ⎥ 2⎦ x0 := [ 1, 0, 0 ] n := 5 ****************** iteración , 0, ************* y1 := [ -4, -5, -1 ] ny1 := 5 x1 := [ -.80000000, -1., -.20000000 ] ****************** iteración , 1, ************* y2 := [ -10.800000, -9.0000000, .40000000 ] ny2 := 10.800000 x2 := [ -1.0000000, -.83333334, .037037037 ] ****************** iteración , 2, ************* y3 := [ -7.6666670, -5.8333330, 1.0740741 ] Page 3 ny3 := 7.6666670 x3 := [ -1.0000000, -.76086951, .14009662 ] ****************** iteración , 3, ************* y4 := [ -6.6521730, -4.8913036, 1.2801932 ] ny4 := 6.6521730 x4 := [ -1.0000000, -.73529412, .19244737 ] ****************** iteración , 4, ************* y5 := [ -6.2941180, -4.5588236, 1.3848947 ] ny5 := 6.2941180 x5 := [ -1.0000000, -.72429906, .22002999 ] > > Versión básica 2, los valors c1,c2,c3,... tienden al valor propio dominate. En cada iteración cj contiene el valor de una componente dominante del vector yj > Digits:=8; a:=matrix(3,3,[-4,14,0,-5,13,0,-1,0,2]); x0:=[1,0,0]; n:=5; for i from 0 to n-1 do `****************** iteración `,i+1,`*************`; y.(i+1):=evalm(a&*x.i); ny:=norm(y.(i+1)); for j from 1 to vectdim(y.(i+1)) do if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi; od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); od; Digits := 8 ⎡-4 ⎢ a := ⎢-5 ⎢ ⎣-1 14 13 0 0⎤ ⎥ 0⎥ ⎥ 2⎦ x0 := [ 1, 0, 0 ] n := 5 ****************** iteración , 1, ************* y1 := [ -4, -5, -1 ] ny := 5 c1 := -5. x1 := [ .80000000, 1.0000000, .20000000 ] ****************** iteración , 2, ************* y2 := [ 10.800000, 9.0000000, -.40000000 ] ny := 10.800000 c2 := 10.800000 x2 := [ 1.0000000, .83333334, -.037037037 ] ****************** iteración , 3, ************* y3 := [ 7.6666670, 5.8333330, -1.0740741 ] ny := 7.6666670 c3 := 7.6666670 x3 := [ 1.0000000, .76086951, -.14009662 ] ****************** iteración , 4, ************* y4 := [ 6.6521730, 4.8913036, -1.2801932 ] ny := 6.6521730 c4 := 6.6521730 x4 := [ 1.0000000, .73529412, -.19244737 ] ****************** iteración , 5, ************* Page 4 y5 := [ 6.2941180, 4.5588236, -1.3848947 ] ny := 6.2941180 c5 := 6.2941180 x5 := [ 1.0000000, .72429906, -.22002999 ] Versión con parada por error estimado sobre el valor propio. > with(linalg): Digits:=8; a:=matrix(3,3,[-4,14,0,-5,13,0,-1,0,2]); x0:=[1,0,0]; c0:=1;#componente dominante del vector inicial t:=5; n:=23; for i from 0 to n-1 do `****************** iteración `,i+1,`*************`; y.(i+1):=evalm(a&*x.i); ny:=norm(y.(i+1),infinity); for j from 1 to vectdim(y.(i+1)) do #calcula la componente dominante if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi;od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); erc.(i+1):=abs(c.(i+1)-c.i); if erc.(i+1)<0.5*10^(-t) then print(`**** precisión alcanzada ***`); vpdom:=c.(i+1);#asigna el valor propio dominante a vpdom break; fi; od; vpdom; Digits := 8 ⎡-4 ⎢ a := ⎢-5 ⎢ ⎣-1 14 13 0 0⎤ ⎥ 0⎥ ⎥ 2⎦ x0 := [ 1, 0, 0 ] c0 := 1 t := 5 n := 23 ****************** iteración , 1, ************* y1 := [ -4, -5, -1 ] ny := 5 c1 := -5. x1 := [ .80000000, 1.0000000, .20000000 ] erc1 := 6. ****************** iteración , 2, ************* y2 := [ 10.800000, 9.0000000, -.40000000 ] ny := 10.800000 c2 := 10.800000 x2 := [ 1.0000000, .83333334, -.037037037 ] erc2 := 15.800000 ****************** iteración , 3, ************* y3 := [ 7.6666670, 5.8333330, -1.0740741 ] ny := 7.6666670 c3 := 7.6666670 x3 := [ 1.0000000, .76086951, -.14009662 ] erc3 := 3.1333330 ****************** iteración , 4, ************* y4 := [ 6.6521730, 4.8913036, -1.2801932 ] Page 5 ny := 6.6521730 c4 := 6.6521730 x4 := [ 1.0000000, .73529412, -.19244737 ] erc4 := 1.0144940 ****************** iteración , 5, ************* y5 := [ 6.2941180, 4.5588236, -1.3848947 ] ny := 6.2941180 c5 := 6.2941180 x5 := [ 1.0000000, .72429906, -.22002999 ] erc5 := .3580550 ****************** iteración , 6, ************* y6 := [ 6.1401870, 4.4158878, -1.4400600 ] ny := 6.1401870 c6 := 6.1401870 x6 := [ 1.0000000, .71917807, -.23453032 ] erc6 := .1539310 ****************** iteración , 7, ************* y7 := [ 6.0684930, 4.3493149, -1.4690606 ] ny := 6.0684930 c7 := 6.0684930 x7 := [ 1.0000000, .71670429, -.24207997 ] erc7 := .0716940 ****************** iteración , 8, ************* y8 := [ 6.0338600, 4.3171558, -1.4841599 ] ny := 6.0338600 c8 := 6.0338600 x8 := [ 1.0000000, .71548823, -.24597188 ] erc8 := .0346330 ****************** iteración , 9, ************* y9 := [ 6.0168350, 4.3013470, -1.4919438 ] ny := 6.0168350 c9 := 6.0168350 x9 := [ 1.0000000, .71488533, -.24796157 ] erc9 := .0170250 ****************** iteración , 10, ************* y10 := [ 6.0083950, 4.2935093, -1.4959231 ] ny := 6.0083950 c10 := 6.0083950 x10 := [ 1.0000000, .71458507, -.24897217 ] erc10 := .0084400 ****************** iteración , 11, ************* y11 := [ 6.0041910, 4.2896059, -1.4979443 ] ny := 6.0041910 c11 := 6.0041910 x11 := [ .99999999, .71443528, -.24948312 ] erc11 := .0042040 ****************** iteración , 12, ************* y12 := [ 6.0020940, 4.2876586, -1.4989662 ] ny := 6.0020940 c12 := 6.0020940 x12 := [ 1.0000000, .71436045, -.24974054 ] erc12 := .0020970 Page 6 ****************** iteración , 13, ************* y13 := [ 6.0010460, 4.2866859, -1.4994811 ] ny := 6.0010460 c13 := 6.0010460 x13 := [ 1.0000000, .71432314, -.24986996 ] erc13 := .0010480 ****************** iteración , 14, ************* y14 := [ 6.0005240, 4.2862008, -1.4997399 ] ny := 6.0005240 c14 := 6.0005240 x14 := [ .99999999, .71430441, -.24993482 ] erc14 := .0005220 ****************** iteración , 15, ************* y15 := [ 6.0002620, 4.2859573, -1.4998696 ] ny := 6.0002620 c15 := 6.0002620 x15 := [ 1.0000000, .71429503, -.24996735 ] erc15 := .0002620 ****************** iteración , 16, ************* y16 := [ 6.0001300, 4.2858354, -1.4999347 ] ny := 6.0001300 c16 := 6.0001300 x16 := [ 1.0000000, .71429044, -.24998371 ] erc16 := .0001320 ****************** iteración , 17, ************* y17 := [ 6.0000660, 4.2857757, -1.4999674 ] ny := 6.0000660 c17 := 6.0000660 x17 := [ .99999998, .71428808, -.24999181 ] erc17 := .0000640 ****************** iteración , 18, ************* y18 := [ 6.0000331, 4.2857451, -1.4999836 ] ny := 6.0000331 c18 := 6.0000331 x18 := [ 1.0000000, .71428692, -.24999589 ] erc18 := .0000329 ****************** iteración , 19, ************* y19 := [ 6.0000170, 4.2857300, -1.4999918 ] ny := 6.0000170 c19 := 6.0000170 x19 := [ .99999997, .71428629, -.24999792 ] erc19 := .0000161 ****************** iteración , 20, ************* y20 := [ 6.0000081, 4.2857219, -1.4999958 ] ny := 6.0000081 c20 := 6.0000081 x20 := [ .99999999, .71428601, -.24999896 ] erc20 := .89 10-5 ****************** iteración , 21, ************* y21 := [ 6.0000040, 4.2857181, -1.4999979 ] ny := 6.0000040 c21 :=Page 6.0000040 7 x21 := [ 1.0000000, .71428589, -.24999949 ] erc21 := .41 10-5 **** precisión alcanzada *** 6.0000040 Vericamos el resultado calculando los valores y vectores propios con eigenvects. > e:=eigenvects(a); ⎡ ⎡ -20 ⎤ ⎤ e := [ 2, 1, { [ 0, 0, 1 ] } ], ⎢⎢ 6, 1, { ⎢⎢ -4, , 1 ⎥⎥ } ⎥⎥, [ 3, 1, { [ 2, 1, -2 ] } ] ⎣ ⎣ ⎦ ⎦ 7 > v:=[-4.,-20/7.,1.]; vn:=v/norm(v,infinity); v := [ -4., -2.8571429, 1. ] vn := [ -1.0000000, -.71428573, .25000000 ] Ejercicio 7 Calculamos la traza y el determinante. > a:=matrix(3,3,[-4,14,0,-5,13,0,-1,0,2]); t:=trace(a); > ⎡-4 ⎢ a := ⎢-5 ⎢ ⎣-1 14 13 0 0⎤ ⎥ 0⎥ ⎥ 2⎦ t := 11 > d:=det(a); d := 36 Construimos un sistema de ecuaciones lineales para determinar los valores porpios que faltan. > eq1:=s1+s2+6=11; eq2:=s1*s2*6=36; eq1 := s1 + s2 + 6 = 11 eq2 := 6 s1 s2 = 36 > solve({eq1,eq2},{s1,s2}); { s1 = 3, s2 = 2 }, { s2 = 3, s1 = 2 } > eigenvals(a);#verificamos con Maple 6, 2, 3 Ejercicio 8 Calculamos el valor propio dominante. > Digits:=8; a:=matrix(4,4,[1,1,1,1,1,2,1,1,1,1,3,1,1,1,1,4]); x0:=[1,1,1,1]; t:=5; c0:=1; n:=23; for i from 0 to n-1 do `****************** iteración `,i+1,`*************`; y.(i+1):=evalm(a&*x.i); ny:=norm(y.(i+1),infinity); for j from 1 to vectdim(y.(i+1)) do if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi; od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); erc.(i+1):=abs(c.(i+1)-c.i); if erc.(i+1)<0.5*10^(-t) then print(`**** precisión alcanzada ***`); vpdom:=c.(i+1);#asigna el valor propio dominante a vpdom break; fi; od: `***** valor propio dominante de A ***`; vpdomA:=vpdom; Digits := 8 Page 8 ⎡1 ⎢ ⎢1 a := ⎢ ⎢1 ⎢ ⎣1 1 2 1 1 1⎤ ⎥ 1⎥ ⎥ 1⎥ ⎥ 4⎦ 1 1 3 1 x0 := [ 1, 1, 1, 1 ] t := 5 c0 := 1 n := 23 **** precisión alcanzada *** ***** valor propio dominante de A *** vpdomA := 5.8038884 Cálculo del valor propio de módulo mínimo. Aplicamos el método de la potencia a la matriz inversa inv(A). Entonces vapmin=1/vdom, donde vdom es el valor propio dominante de la matriz inv(A). > with(linalg): Digits:=8; a:=matrix(4,4,[1,1,1,1,1,2,1,1,1,1,3,1,1,1,1,4]); a1:=inverse(a); x0:=[1,1,1,1]; t:=5; c0:=1; n:=23; for i from 0 to n-1 do `****************** iteración `,i+1,`*************`; y.(i+1):=evalm(a1&*x.i);#el método usa la inversa a1 ny:=norm(y.(i+1),infinity); for j from 1 to vectdim(y.(i+1)) do if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi; od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); erc.(i+1):=abs(c.(i+1)-c.i); if erc.(i+1)<0.5*10^(-t) then print(`**** precisión alcanzada ***`); vpdom:=c.(i+1);#asigna el valor propio dominante a vpdom break; fi; od: `*** valor propio dominante de inv(A) ***`; vpdom; `*** valor propio de módulo mínimo de A ***`; vpminA:=1/vpdom;#asigna el nombre vpmin al valor propio calculado Digits := 8 ⎡1 ⎢ ⎢1 a := ⎢ ⎢1 ⎢ ⎣1 ⎡ ⎢ ⎢ ⎢ ⎢ ⎢ a1 := ⎢⎢ ⎢ ⎢ ⎢ ⎢ ⎢⎢ ⎣ 17 6 -1 -1 2 -1 3 1 2 1 1 -1 1 0 0 1⎤ ⎥ 1⎥ ⎥ 1⎥ ⎥ 4⎦ 1 1 3 1 -1 2 0 1 2 0 -1 ⎤ ⎥ 3 ⎥⎥ 0 ⎥⎥ ⎥ 0 ⎥⎥ ⎥ ⎥ 1 ⎥ ⎥⎥ 3 ⎦ x0 := [ 1, 1, 1, 1 ] t := 5 c0 := 1 n := 23 **** precisión alcanzada *** *** valor propio dominante Page 9 de inv(A) *** 1. *** valor propio de módulo mínimo de A *** vpminA := 1. Calculamos la traza y el determinante y construimos un sistema de ecuaciones para determinar los valores propios restantes. Usamos solve para resolver el sistema de ecuaciones. > t:=trace(a); t := 10 > d:=det(a); d := 6 > eq1:=vpdomA+s2+s3+vpminA=t; eq2:=vpdomA*s2*s3*vpminA=d; eq1 := 6.8038884 + s2 + s3 = 10 eq2 := 5.8038884 s2 s3 = 6 > solve({eq1,eq2},{s2,s3}); { s3 = .36517598, s2 = 2.8309356 }, { s3 = 2.8309356, s2 = .36517598 } Verificamos los resultado, calculando los valores propios con eigenvals. > eigenvals(evalf(evalm(a))); .29608965, 1.3922753, 2.5077487, 5.8038864 > Ejercicio 9 > with(linalg): Digits:=8; a:=matrix(3,3,[-4,14,0,-5,13,0,-1,0,2]); af:=evalf(evalm(a)); vpest:=3.1; b:=evalm(af-vpest*diag(1,1,1)); b1:=inverse(b); x0:=[5,1,1]; t:=5; c0:=5;#componente dominante del vector inicial n:=23; for i from 0 to n do `****************** iteración `,i+1,`*************`; y.(i+1):=evalm(b1&*x.i);#el método usa la inversa b1 ny:=norm(y.(i+1),infinity); for j from 1 to vectdim(y.(i+1)) do if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi; od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); erc.(i+1):=abs(c.(i+1)-c.i); if erc.(i+1)<0.5*10^(-t) then print(`**** precisión alcanzada ***`); vpdom:=c.(i+1);#valor propio dominante de la inversa de la matriz desplazada break; fi; od; vp:=1/vpdom+vpest;#asigna el nombre vp al valor propio calculado Digits := 8 ⎡-4 ⎢ a := ⎢-5 ⎢ ⎣-1 14 13 0 0⎤ ⎥ 0⎥ ⎥ 2⎦ ⎡-4. ⎢ af := ⎢-5. ⎢ ⎣-1. 14. 13. 0 0⎤ ⎥ 0⎥ ⎥ 2.⎦ vpest := 3.1 Page 10 ⎡-7.1 ⎢ b := ⎢ -5. ⎢ ⎣ -1. ⎡-34.137931 ⎢ b1 := ⎢-17.241379 ⎢ ⎣ 31.034483 14. 9.9 0 0 ⎤ ⎥ 0 ⎥ ⎥ -1.1⎦ 48.275862 24.482759 -43.887147 0 ⎤ ⎥ ⎥ 0 ⎥ -.90909091⎦ x0 := [ 5, 1, 1 ] t := 5 c0 := 5 n := 23 ****************** iteración , 1, ************* y1 := [ -122.41380, -61.724136, 110.37618 ] ny := 122.41380 c1 := -122.41380 x1 := [ 1.0000000, .50422531, -.90166452 ] erc1 := 127.41380 ****************** iteración , 2, ************* y2 := [ -9.796020, -4.896552, 9.7251680 ] ny := 9.796020 c2 := -9.796020 x2 := [ .99999996, .49985114, -.99276723 ] erc2 := 112.61778 ****************** iteración , 3, ************* y3 := [ -10.007185, -5.003643, 9.9999577 ] ny := 10.007185 c3 := -10.007185 x3 := [ 1.0000000, .50000505, -.99927779 ] erc3 := .211165 ****************** iteración , 4, ************* y4 := [ -9.999756, -4.999876, 9.9991224 ] ny := 9.999756 c4 := -9.999756 x4 := [ 1.0000000, .49999980, -.99993664 ] erc4 := .007429 ****************** iteración , 5, ************* y5 := [ -10.000010, -5.000004, 9.9999513 ] ny := 10.000010 c5 := -10.000010 x5 := [ 1.0000000, .49999990, -.99999413 ] erc5 := .000254 ****************** iteración , 6, ************* y6 := [ -10.000005, -5.000002, 9.9999996 ] ny := 10.000005 c6 := -10.000005 x6 := [ 1.0000000, .49999995, -.99999946 ] erc6 := .5 10-5 ****************** iteración , 7, ************* y7 := [ -10.000002, -5.000001, 10.000002 ] ny := 10.000002 c7 := -10.000002 x7 := [ 1.0000000, .50000000, -1.0000000 ] erc7 := .3 10-5 Page 11 **** precisión alcanzada *** vp := 3.0000000 Calculamos los valores propios con eigenvals. > eigenvals(a); 6, 2, 3 Ejercicio 10 como D=inv(V)*A*V, tenemos A=V*D*inv(V) > d:=diag(1.23,5.67,8.62); v:=transpose([[0.23,1.42,-1.54],[1.53,-1.42,-2.54],[0,-3.12,5.45]]); vinv:=inverse(v); a:=evalm(v&*d&*vinv); ⎡1.23 ⎢ d := ⎢ 0 ⎢ ⎣ 0 0 5.67 0 0 ⎤ ⎥ 0 ⎥ ⎥ 8.62⎦ ⎡ .23 ⎢ v := ⎢ 1.42 ⎢ ⎣-1.54 1.53 -1.42 -2.54 0 ⎤ ⎥ -3.12⎥ ⎥ 5.45 ⎦ ⎡1.9357143 ⎢ vinv := ⎢.36260504 ⎢ ⎣.71596639 1.0304622 -.15490608 .21898171 .58991597 ⎤ ⎥ -.088680178⎥ ⎥ .30884825 ⎦ ⎡ 3.6932486 ⎢ a := ⎢-18.794046 ⎢ ⎣ 24.746590 Verificamos calculando los valores propios de a. > eigenvals(a); -1.0523079 -2.8423656 10.566567 -.60242218⎤ ⎥ -6.5619416⎥ ⎥ 14.669117 ⎦ 1.2300010, 5.6699999, 8.6199992 vectores normalizados > v1:=[0.23,1.42,-1.54]/(-1.54); v2:=[1.53,-1.42,-2.54]/(-2.54); v3:=[0,-3.12,5.45]/5.45; v1 := [ -.14935065, -.92207792, 1.0000000 ] v2 := [ -.60236221, .55905512, 1.0000000 ] v3 := [ 0, -.57247707, 1.0000000 ] Ejercicio 11 > with(linalg): Digits:=8; # a:= está asignada del ejercicio anterior x0:=[1,1,1]; t:=5; c0:=1; n:=23; for i from 0 to n do `****************** iteración `,i+1,`*************`; y.(i+1):=evalm(a&*x.i); ny:=norm(y.(i+1),infinity); for j from 1 to vectdim(y.(i+1)) do if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi; od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); erc.(i+1):=abs(c.(i+1)-c.i); if erc.(i+1)<0.5*10^(-t) then print(`**** precisión alcanzada ***`); vpdom:=c.(i+1);#asigna el valor propio dominante a vpdom vepdom:=x.(i+1); break; fi; od: print(`valor propio dominante = `,vpdom,` vector propio asociado=`,vepdom); Digits := 8 Page 12 x0 := [ 1, 1, 1 ] t := 5 c0 := 1 n := 23 **** precisión alcanzada *** valor propio dominante = , 8.6200077, vector propio asociado=, [ .11612519 10-5, -.57247932, 1.0000000 ] Tomamos del ejercicio anterior el vector propio normalizado para comparar. > v3; [ 0, -.57247707, 1.0000000 ] Ejercicio 12 El siguente programa calcula el valor propio dominante de inv(A) con el nombre vpdom. El valor propio de módulo mínimo de A es entonces vpmin=1/vpdom. vepdom contiene un vector propio asociado a vpmin. > with(linalg): Digits:=8; # a:= está asignada del ejercicio anterior a1:=inverse(a); x0:=[1,1,1]; t:=5; c0:=0; n:=23; for i from 0 to n-1 do `****************** iteración `,i,`*************`; y.(i+1):=evalm(a1&*x.i); ny:=norm(y.(i+1),infinity); for j from 1 to vectdim(y.(i+1)) do if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi; od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); erc.(i+1):=abs(c.(i+1)-c.i); if erc.(i+1)<0.5*10^(-t) then print(`**** precisión alcanzada ***`); vpdom:=c.(i+1);#asigna el valor propio dominante a vpdom vepdom:=x.(i+1); break; fi; od: vpmin:=1/vpdom;#asigna el nombre vpmin al valor propio calculado print(`valor propio de módulo mínimo = `,vpmin,` vector propio asociado=`,vepdom); Digits := 8 ⎡ .45980843 ⎢ a1 := ⎢ 1.8847713 ⎢ ⎣-2.1333426 .15088788 1.1491732 -1.0823266 .086379858⎤ ⎥ .59146268 ⎥ ⎥ -.50359793 ⎦ x0 := [ 1, 1, 1 ] t := 5 c0 := 0 n := 23 **** precisión alcanzada *** vpmin := 1.2300005 valor propio de módulo mínimo = , 1.2300005, vector propio asociado=, [ -.14935079, -.92207754, .99999998 ] Verificamos el vector propio tomando v1 del Ejercicio 10. > v1; [ -.14935065, -.92207792, 1.0000000 ] Ejercicio 13 En este ejercicio calculamos el valor propio de A próximo a vpest= 5.1. El programa aplica el método de la potencia para obtener el valor propio de módulo máximo de inv(A-vpest·I). Entoces el valor propio buscado es vp=1/vpdom+vpsest Page 13 > with(linalg): Digits:=8; # a:= está asignada del ejercicio anterior vpest:=5.1; b:=evalm(a-vpest*diag(1,1,1)); b1:=inverse(b); x0:=[1,1,1]; t:=5; c0:=1; n:=23; for i from 0 to n-1 do `****************** iteración `,i,`*************`; y.(i+1):=evalm(b1&*x.i); ny:=norm(y.(i+1),infinity); for j from 1 to vectdim(y.(i+1)) do if abs(y.(i+1)[j])=ny then cdom:=y.(i+1)[j]; break fi; od; c.(i+1):=evalf(cdom); x.(i+1):=evalm(1/c.(i+1)*y.(i+1)); erc.(i+1):=abs(c.(i+1)-c.i); if erc.(i+1)<0.5*10^(-t) then print(`**** precisión alcanzada ***`); vpdom:=c.(i+1);#asigna el valor propio dominante a vpdom vepdom:=x.(i+1); break; fi; od: vp:=1/vpdom+vpest;#asigna el nombre vp al valor propio calculado print(`valor propio = `,vp,` vector propio asociado=`,vepdom); Digits := 8 vpest := 5.1 ⎡-1.4067514 ⎢ b := ⎢-18.794046 ⎢ ⎣ 24.746590 -1.0523079 -7.9423656 10.566567 -.60242218⎤ ⎥ -6.5619416⎥ ⎥ 9.569117 ⎦ ⎡ .85826673 ⎢ b1 := ⎢-2.2482039 ⎢ ⎣ .26299352 -.47704315 -.18629386 1.4393887 -.27309633⎤ ⎥ -.26928471⎥ ⎥ 1.1081084 ⎦ x0 := [ 1, 1, 1 ] t := 5 c0 := 1 n := 23 **** precisión alcanzada *** vp := 5.6699980 valor propio = , 5.6699980, vector propio asociado=, [ -.60236216, .55905513, 1.0000000 ] Verificamos tomando el vector propio normalizado del Ejercicio 10. > v2; [ -.60236221, .55905512, 1.0000000 ] > Page 14