Vorlesung vom 12.01.2023
© 2023 Prof. Dr. Rüdiger W. Braun
Prüfungstermine
Die Anmeldung zur ersten Klausur ist seit einigen Tagen möglich.
from sympy import *
init_printing()
sympy
¶x = S('x')
y = S('y')
f = -x**4/2 - x**2*y**2 - y**4/2 + x**3 - 3*x*y**2
plotting.plot3d(f);
Hübsch, aber in dieser Form nutzlos
gr = Matrix([f]).jacobian([x,y])
gr
krit = solve(gr)
krit
Was passiert dort?
numpy
und universal functions¶import numpy as np
np.pi # numpy
pi.n() # sympy mit Numerik via mpmath
pi.n(n=42)
A1 = np.array([1.2,2,48])
A1
array([ 1.2, 2. , 48. ])
3*A1
array([ 3.6, 6. , 144. ])
A1 + np.ones_like(A1)
array([ 2.2, 3. , 49. ])
sieht aus wie ein Vektor, hat aber andere Multiplikationsregeln
A1**2
array([1.440e+00, 4.000e+00, 2.304e+03])
S1 = Matrix([1.2, 2, 48])
S1
#S1**2 # NonSquareMatrixError
M1 = np.array([A1, 2*A1, 3*A1])
M1
array([[ 1.2, 2. , 48. ], [ 2.4, 4. , 96. ], [ 3.6, 6. , 144. ]])
M1**2
array([[1.4400e+00, 4.0000e+00, 2.3040e+03], [5.7600e+00, 1.6000e+01, 9.2160e+03], [1.2960e+01, 3.6000e+01, 2.0736e+04]])
M1 @ M1
array([[ 179.04, 298.4 , 7161.6 ], [ 358.08, 596.8 , 14323.2 ], [ 537.12, 895.2 , 21484.8 ]])
M1[0,0]**2 + M1[0,1]*M1[1,0] + M1[0,2]*M1[2,0]
N3 = np.zeros(shape=(3,3))
N3
array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
N3 + 2
array([[2., 2., 2.], [2., 2., 2.], [2., 2., 2.]])
N3 + 2*np.eye(3)
array([[2., 0., 0.], [0., 2., 0.], [0., 0., 2.]])
N3 + A1
array([[ 1.2, 2. , 48. ], [ 1.2, 2. , 48. ], [ 1.2, 2. , 48. ]])
M1 = A1.reshape(3,1)
M1
array([[ 1.2], [ 2. ], [48. ]])
N3 + M1
array([[ 1.2, 1.2, 1.2], [ 2. , 2. , 2. ], [48. , 48. , 48. ]])
Broadcasting: Wenn möglich, wird der kleinere Array durch Stapeln auf die Form des größeren gebracht, bevor eine punktweise Operation ausgeführt wird.
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
xn = np.linspace(0, 10, 10)
xn
array([ 0. , 1.11111111, 2.22222222, 3.33333333, 4.44444444, 5.55555556, 6.66666667, 7.77777778, 8.88888889, 10. ])
len(xn)
np.sin(xn)
array([ 0. , 0.8961922 , 0.79522006, -0.19056796, -0.96431712, -0.66510151, 0.37415123, 0.99709789, 0.51060568, -0.54402111])
#sin(xn) TypeError
g = sin(x) / (1+x**2)
g
gn = lambdify(x, g)
gn
<function _lambdifygenerated(x)>
gn(xn)
array([ 0. , 0.40105839, 0.1339144 , -0.01573497, -0.0464662 , -0.020873 , 0.00823316, 0.0162146 , 0.00638159, -0.00538635])
tn = np.linspace(0, 10, 1000)
%%timeit
[sin(tt)/(1+tt**2) for tt in tn]
33.4 ms ± 1.49 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
gn(tn)
9.08 µs ± 142 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
matplotlib
¶from matplotlib import pyplot as plt
yn = np.sin(tn)/(1+tn**2)
plt.plot(tn, yn);
plt.plot(xn, np.sin(xn)/(1+xn**2));
sympy
schätzt die Anzahl der notwendigen Stützstellen selber ab
pyplot
tut das nicht
plt.plot(xn, np.sin(xn)/(1+xn**2), 'r.')
[<matplotlib.lines.Line2D at 0x1b33b6dc400>]
zn = np.cos(.1*tn**2)
plt.plot(tn, yn, 'b', label="$\\frac{\\sin(x)}{1+x^2}$")
plt.plot(tn, zn, 'r--', label="$\\cos(\\frac{x^2}{10})$")
plt.legend();
Farben als Kürzel (Alternativen später)
b | g | r | c | m | y | k | w |
---|---|---|---|---|---|---|---|
blue | green | red | cyan | magenta | yellow | black | white |
from mpl_toolkits.mplot3d import Axes3D
Der Import definiert einige Klassen um. Axes3d
selbst brauchen wir gar nicht
xn = np.linspace(-3*np.pi, 3*np.pi, 500)
yn = np.linspace(-3*np.pi, 3*np.pi, 501)
X, Y = np.meshgrid(xn, yn)
X.shape
X[:5, :5]
array([[-9.42477796, -9.3870033 , -9.34922864, -9.31145398, -9.27367932], [-9.42477796, -9.3870033 , -9.34922864, -9.31145398, -9.27367932], [-9.42477796, -9.3870033 , -9.34922864, -9.31145398, -9.27367932], [-9.42477796, -9.3870033 , -9.34922864, -9.31145398, -9.27367932], [-9.42477796, -9.3870033 , -9.34922864, -9.31145398, -9.27367932]])
Y[:5, :5]
array([[-9.42477796, -9.42477796, -9.42477796, -9.42477796, -9.42477796], [-9.38707885, -9.38707885, -9.38707885, -9.38707885, -9.38707885], [-9.34937974, -9.34937974, -9.34937974, -9.34937974, -9.34937974], [-9.31168063, -9.31168063, -9.31168063, -9.31168063, -9.31168063], [-9.27398151, -9.27398151, -9.27398151, -9.27398151, -9.27398151]])
Z = np.cos(np.sqrt(X**2+Y**2))
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
# subplot(123) ist der dritte Subplot in einer 1x2-Matrix von Plots
ax.plot_surface(X, Y, Z, cmap=plt.cm.coolwarm);
fig = plt.figure()
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(X, Y, Z)
ax2 = fig.add_subplot(122, projection='3d')
ax2.plot_surface(X, Y, Z, cmap=plt.cm.plasma, alpha=.35) # default ist viridis
plt.savefig('test.pdf')
Wenn's schnell gehen soll
xn = np.linspace(-3*np.pi, 3*np.pi, 200)
yn = np.linspace(-3*np.pi, 3*np.pi, 200)
X, Y = np.meshgrid(xn, yn)
Z = np.cos(np.sqrt(X**2+Y**2))
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10);
%matplotlib qt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10);
# may or may not work
%matplotlib inline
ax.view_init(85,-64); # (hoehe, azimuth)
ax.set_zticks([])
fig
f
fn = lambdify((x,y), f)
xn = np.linspace(-10, 10, 400)
yn = np.linspace(-10, 10, 401)
X, Y = np.meshgrid(xn, yn)
Z = fn(X, Y)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap=plt.cm.viridis);
Dasselbe Bild wie oben
werte = []
for k in krit:
werte.append(fn(k[x].n(), k[y].n()))
werte
import matplotlib.colors as colors
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap=plt.cm.viridis, vmin=-werte[0], vmax=werte[0]);
xn = np.linspace(-2, 2, 400)
yn = np.linspace(-2, 2, 401)
X, Y = np.meshgrid(xn, yn)
Z = fn(X, Y)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap=plt.cm.viridis, vmin=-werte[0], vmax=werte[0]);