Vorlesung vom 15.12.2022
© 2022 Prof. Dr. Rüdiger W. Braun
from sympy import *
init_printing()
M = eye(5)
M
ones(3,4)
zeros(2,1)
diag(1,2,3)
l = [1,2,3]
diag(l)
diag(*l)
print(l)
print(*l) # *l packt die ELemente von l aus
[1, 2, 3] 1 2 3
A = Matrix(3, 3, list(range(1,10)))
A
A.det()
C = A + eye(3)
C
C.det()
C1 = C**(-1)
C1
C1 == C.inv()
True
C * C1
A.shape
v = Matrix([1,2,3])
v
v.shape
Es gibt keine Vektoren, nur $n \times 1$-Matrizen
type(v)
sympy.matrices.dense.MutableDenseMatrix
B = Matrix(5,6, range(30))
B
B[2:4, 3:4]
B[:4, 3:]
B[:, :2]
C = B
C[0,0] = 121
B, C
C = B.copy()
C[0,1] = -1000
B, C
d1 = {'b':B} # dictionary
d2 = d1.copy()
d1['b'][0,0] = 42
d1['b'], d2['b']
import copy
d3= copy.deepcopy(d1)
d1['b'][0,0] = 12
d1['b'], d3['b']
A
A.T
Matrix.hstack(eye(3), eye(3))
# eine class method
Matrix.vstack(eye(3), eye(3))
B = Matrix(4, 6, list(range(24)))
B
B.reshape(1, 24)
flatten(B)
type(B.reshape(1,24))
sympy.matrices.dense.MutableDenseMatrix
type(flatten(B))
list
als Beispiel für schlecht konditionierte Matrizen
def hilbert(i,j):
return 1/(1+i+j)
H = Matrix(5, 5, hilbert)
H
H.det()
H.inv()
N = 12
H = Matrix(N, N, hilbert)
H.det()
H1 = H**(-1)
H1[N-5:, N-5:]
import numpy as np
Hn = np.empty((N,N))
for i in range(N):
for j in range(N):
Hn[i,j] = 1/(1+i+j)
np.linalg.det(Hn)
H.det().n()
Hn1 = Hn**(-1)
Hn1[N-5:, N-5:]
array([[15., 16., 17., 18., 19.], [16., 17., 18., 19., 20.], [17., 18., 19., 20., 21.], [18., 19., 20., 21., 22.], [19., 20., 21., 22., 23.]])
Hn**(-1)
hat die Kehrwerte aller Matrixeinträge bestimmt
Hn1 = np.linalg.inv(Hn)
Hn1[N-3:, N-3:]
array([[ 1.88806550e+15, -7.89466867e+14, 1.42959120e+14], [-7.89478678e+14, 3.30975528e+14, -6.00766591e+13], [ 1.42963152e+14, -6.00774507e+13, 1.09285030e+13]])
zum Vergleich
H1[N-3:, N-3:]
%%timeit
H**(-1)
152 ms ± 946 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
Hn1 = np.linalg.inv(Hn)
6.33 µs ± 50.3 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
Eine Python-Bibliothek, die numerische Operationen in beliebige wählbarer Genauigkeit durchführen kann, ist mpmath
A
A.rank()
x = S('x')
y = S('y')
M = Matrix(3, 2, [2*x+2, 2*y-2, 2*x+2, -2*y+2, y-1, x+1])
M
M.rank()
Glauben wir das für alle Wahlen von $x$ und $y$?
M.rref(pivots=False) # Zeilenstufenform (engl. reduced row echelon form)
M
M1 = M.elementary_row_op('n->kn', row=2, k=2*x+2)
M1
Das darf ich aber nur, wenn $2x+2\ne0$.
M2 = M1.elementary_row_op('n->n+km', row1=2, row2=0, k=1-y).expand()
M2
Das darf ich immer.
M2
M3 = M2.elementary_row_op('n->n+km', row1=1, row2=0, k=-1)
M3
M4 = M3.elementary_row_op('n->n+km', row1=2, row2=1, k=-M3[2,1]/M3[1,1])
M4
Das darf ich nur für $4-4y\ne0$, weil ich durch diesen Wert geteilt habe
Bis jetzt gesehen:
Für $x\ne-1$ und $y\ne1$ ist der Rang gleich $2$.
M.subs(x, -1)
M.subs({x:-1, y:1})
sympy
rechnet im Körper $\mathbb R(x,y)$ der rationalen Polynome