[NumAn] PC-Oef6

2273 days ago by Niels.Neirynck

Eigenwaarden en eigenvectoren

Sage bezit een aantal handige procedures voor de berekening van eigenwaarden en eigenvectoren. Een overzicht kan men vinden op http://wiki.sagemath.org/quickref, namelijk quickref-linalg.pdf.

Als eerste voorbeeld beschouwen we een eenvoudige 3x3-matrix:

A = matrix([[1,2,3],[2,3,4],[3,4,5]]); show(A) Aeig = A.eigenvalues(); show(Aeig) parent(Aeig[0]) 
       
Algebraic Field
Algebraic Field
De eigenwaarden van $A$ zijn numeriek berekend. We bekijken het matrixtype van $A$:
parent(A); 
       
Full MatrixSpace of 3 by 3 dense matrices over Integer Ring
Full MatrixSpace of 3 by 3 dense matrices over Integer Ring

Door de ring van $A$ te veranderen naar Symbolic Ring (SR) kunnen we Sage dwingen om de eigenwaarden toch symbolisch te berekenen:

A = A.change_ring(SR); Aeig = A.eigenvalues(); show(Aeig) parent(Aeig[0]); 
       
Symbolic Ring
Symbolic Ring

Maar het is niet altijd zo eenvoudig. Beschouw nu de matrix $B$ uit Oefening 6.1 met $n=6$.

def oef6_matrix(n): m = matrix(n) for i in range(n): for j in range(i+1): m[j,i] = n - i; m[i,j] = n - i; return m; n = 6; B = oef6_matrix(n); B = B.change_ring(SR); #we willen symbolisch rekenen. show(B); 
       

                                
                            

                                
B.eigenvalues() 
       
Traceback (click to the left of this block for traceback)
...
ArithmeticError: could not determine eigenvalues exactly using symbolic
matrices; try using a different type of matrix via self.change_ring(),
if possible
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_7.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("Qi5laWdlbnZhbHVlcygp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/var/sage/tmpFNpBXn/___code___.py", line 2, in <module>
    exec compile(u'B.eigenvalues()
  File "", line 1, in <module>
    
  File "sage/matrix/matrix_symbolic_dense.pyx", line 190, in sage.matrix.matrix_symbolic_dense.Matrix_symbolic_dense.eigenvalues (/opt/sage/sage-6.8/src/build/cythonized/sage/matrix/matrix_symbolic_dense.c:2569)
ArithmeticError: could not determine eigenvalues exactly using symbolic matrices; try using a different type of matrix via self.change_ring(), if possible

Sage is niet in staat om de eigenwaarden symbolisch te berekenen. Het symbolisch berekenen van de eigenwaarden van $B$ is voor vele softwarepakketten al reeds te complex. Wil men deze eigenwaarden toch numeriek bepalen, dan kan men in vlottende-puntvoorstelling werken:

BB = B.change_ring(RealField(37)); show(BB) 
       

                                
                            

                                

We veranderen de ring van de matrix naar RealField(37), een vlottende-puntvoorstelling met 37-bit precisie. Dit komt ongeveer overeen met 10 decimale cijfers na de komma.

We berekenen de eigenwaarden:

eigBB = BB.eigenvalues(); eigBB 
       
__main__:1: UserWarning: Using generic algorithm for an inexact ring,
which will probably give incorrect results due to numerical precision
issues.
[17.20685727, 1.988156537, 0.7747192223, 0.4462147548, 0.3188643843,
0.2651878342]
__main__:1: UserWarning: Using generic algorithm for an inexact ring, which will probably give incorrect results due to numerical precision issues.
[17.20685727, 1.988156537, 0.7747192223, 0.4462147548, 0.3188643843, 0.2651878342]
Ter verificatie: de vergelijking met de analytische uitdrukking voor de eigenwaarden:
eigBB_exact = [N((1/2)*(1-cos((2*k-1)*pi/(2*n+1)))^(-1),prec=37) for k in range(1,n+1)]; eigBB_exact 
       
[17.20685727,
 1.988156537,
 0.7747192223,
 0.4462147548,
 0.3188643843,
 0.2651878342]
[17.20685727,
 1.988156537,
 0.7747192223,
 0.4462147548,
 0.3188643843,
 0.2651878342]
show(matrix(vector(eigBB)).stack(vector(eigBB_exact)).transpose()) 
       

                                
                            

                                
Beschouw opnieuw de 3x3-matrix $A$:
show(A); 
       

                                
                            

                                
We berekenen de (rechter)eigenvectoren van $A$:
eigvec = A.eigenvectors_right() show(eigvec) 
       

                                
                            

                                
Het resultaat bestaat uit een lijst van triples. Een triple bevat een eigenwaarde, de eigenvector van de eigenwaarde en de algebraïsche multipliciteit van de eigenwaarde.
for i in range(3): show(eigvec[i]) 
       

                                
                            

                                
Beschouw voor de algemeenheid ook een matrix die geen basis van eigenvectoren heeft:
A = matrix( [[0,0,1],[0,0,0],[0,0,0]]); show(A) 
       

                                
                            

                                
A.eigenvalues() 
       
[0, 0, 0]
[0, 0, 0]
A.jordan_form() 
       
[0 1|0]
[0 0|0]
[---+-]
[0 0|0]
[0 1|0]
[0 0|0]
[---+-]
[0 0|0]

Dus deze matrix A heeft eigenwaarde 0 met algebraische multipliciteit 3 en geometrische multipliciteit 2.