Resolución Maple

Anuncio
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
Descargar