In [1]:
from sympy import *
init_printing()
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from IPython.display import display
In [2]:
def komposition(f, g):
"gibt die Funktion f ∘ g zurück"
def func(x):
return f(g(x))
return func
In [3]:
h = komposition(cos, sqrt)
h(pi**2)
Out[3]:
In [4]:
x = Symbol('x')
h(x)
Out[4]:
In [5]:
C = Matrix(3, 3, [-4, -2, -3, 5, 3, 3, 5, 2, 4])
C
Out[5]:
In [6]:
C.eigenvals()
Out[6]:
In [7]:
C.eigenvects()
Out[7]:
Das ist einer zu wenig.
In [8]:
T, J = C.diagonalize() # MatrixError
In [10]:
T, J = C.jordan_form()
T, J
Out[10]:
In [11]:
T * J * T**(-1) == C
Out[11]:
In [12]:
M = Matrix(3, 3, range(1,10))
M
Out[12]:
In [13]:
M.rank()
Out[13]:
In [14]:
x = Symbol('x')
y = Symbol('y')
M = Matrix(3, 2, [2*x+2, 2*y-2, 2*x+2, -2*y+2, y-1, x+1])
M
Out[14]:
In [15]:
M.rank()
Out[15]:
Glauben wir das?
In [16]:
def mult_zeile(A, zeilennr, faktor):
B = Matrix(A)
def func(b, j):
return b*faktor
B.row_op(zeilennr, func)
return B
def add_zeile(A, quell_nr, ziel_nr, faktor):
B = Matrix(A)
def func(b, j):
return b + B[quell_nr,j]*faktor
B.row_op(ziel_nr, func)
return B
In [17]:
M1 = add_zeile(M, 0, 1, -1)
M1
Out[17]:
In [18]:
M2 = mult_zeile(M1, 0, y-1) # nur für y != 1
M3 = mult_zeile(M2, 2, x+1) # nur für x != -1
M3
Out[18]:
In [19]:
M4 = add_zeile(M3, 0, 2, -Rational(1,2)).expand()
factor(M4)
Out[19]:
Wenn $x\ne-1$ und $y\ne1$, dann ist der Rang dieser Matrix gleich 2
In [20]:
M5 = M.subs(x, -1)
factor(M5)
Out[20]:
Für $y\ne1$ ist der Rang dieser Matrix immer noch 2.
In [21]:
M6 = M.subs(y, 1)
factor(M6)
Out[21]:
dito für $x\ne-1$
In [22]:
M7 = M.subs({x:-1, y:1})
M7
Out[22]:
Kein Fehler von sympy.
In [23]:
v = Matrix([1,2,3])
v
Out[23]:
In [24]:
v.norm()
Out[24]:
In [27]:
sqrt((v.T*v)[0])
Out[27]:
In [28]:
v.norm(oo)
Out[28]:
In [30]:
v.norm(4)
Out[30]:
In [32]:
C
Out[32]:
In [33]:
C.norm()
Out[33]:
Die Frobeniusnorm ist submultiplikativ, also $\left\Vert A B \right\Vert \le \left\Vert A \right\Vert \left\Vert B \right\Vert$. Sie ist aber keine Matrixnorm im Sinne der Analysis II.
In [34]:
C.norm(2)
Out[34]:
In [35]:
(C.T*C).eigenvals()
Out[35]:
In [36]:
C.norm().n(), C.norm(2).n()
Out[36]:
In [37]:
w = Matrix([-1,-2,3])
z = v.cross(w)
z
Out[37]:
In [38]:
v.T*z
Out[38]:
In [39]:
w.T*z
Out[39]:
Das Kreuzprodukt $v \times w$ steht senkrecht auf $v$ und $w$. Seine euklidische Norm ist gleich dem Flächeninhalt des von $v$ und $w$ aufgespannten Parallelogramms.
In [40]:
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
var = [x,y,z]
In [41]:
f = exp(x**2 + 2*y**2 + 3*z**2)
f
Out[41]:
In [42]:
gr = Matrix([f.diff(t) for t in var])
gr
Out[42]:
sympy hat eine Funktion gradient, aber nur in 3D. Man beachte aber den nächsten Abschnitt.
In [45]:
J = Matrix([f]).jacobian(var)
J
Out[45]:
In [46]:
H = factor(gr.jacobian(var))
H
Out[46]:
Das ist die Hesse Matrix.
In [47]:
factor(hessian(f, var)) == H
Out[47]:
In [53]:
f = Function('f')
f(*var)
Out[53]:
In [54]:
hessian(f(x,y,z), var)
Out[54]:
In [55]:
H1 = H.subs({x:1, y:0, z:-1})
H1
Out[55]:
In [58]:
H1.is_positive # falscher Befehl
Out[58]:
In [59]:
H1.det()
Out[59]:
In [60]:
for tmp in H1.eigenvals():
display((tmp, tmp.n()))
In [61]:
ImmutableMatrix(eye(3)).is_positive # das ist nicht die
# Antwort auf unsere Frage
Out[61]:
Hurwitz Kriterium
In [62]:
for j in range(1,4):
minor = H1[0:j, 0:j]
display(minor.det())
Also positiv definit
In [63]:
for j in range(1,4):
minor = -H1[0:j, 0:j]
display(minor.det())
Es sei $M \in \mathbb R^{n\times n}$ eine symmetrische Matrix.
In [64]:
from mpl_toolkits.mplot3d import Axes3D
In [65]:
f = -x**4/2 - x**2*y**2 - y**4/2 + x**3 - 3*x*y**2
fn = lambdify((x,y), f)
f
Out[65]:
In [66]:
xn = np.linspace(-5, 5)
yn = np.linspace(-5, 5)
X, Y = np.meshgrid(xn, yn)
W = fn(X, Y)
In [67]:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, W, rstride=1, cstride=1, linewidth=0,
cmap=plt.cm.coolwarm);
In [68]:
glg1 = Eq(f.diff(x), 0)
glg2 = Eq(f.diff(y), 0)
gls = {glg1, glg2}
gls
Out[68]:
In [69]:
Lsg = solve(gls)
Lsg
Out[69]:
In [70]:
H = hessian(f, [x,y])
H
Out[70]:
In [71]:
H1 = H.subs(Lsg[0])
H1
Out[71]:
In [72]:
H1[0,0]
Out[72]:
In [73]:
H1.det()
Out[73]:
negativ definit
In [74]:
H2 = H.subs(Lsg[1])
H2
Out[74]:
In [75]:
H2.det()
Out[75]:
In [76]:
H3 = H.subs(Lsg[2])
H3
Out[76]:
In [77]:
H4 = H.subs(Lsg[3])
H4
Out[77]:
In [78]:
for l in Lsg:
y0 = f.subs(l)
display((y0, y0.n()))
In [79]:
from matplotlib.colors import Normalize
norm = Normalize(-.5, 1)
In [80]:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, W, rstride=1, cstride=1, linewidth=0,
cmap=plt.cm.coolwarm, norm=norm);
In [81]:
for l in Lsg:
display((x.subs(l).n(), y.subs(l).n()))
In [82]:
xn = np.linspace(-1.5, 2, 100)
yn = np.linspace(-1.8, 1.8, 100)
X, Y = np.meshgrid(xn, yn)
W = np.maximum(fn(X, Y), -.1)
In [83]:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, W, rstride=1, cstride=1, linewidth=0,
cmap=plt.cm.coolwarm);
In [84]:
f.subs(y, 0)
Out[84]:
Also Sattel in $(0,0)$.
In [ ]: