Lektion 3


In [1]:
from sympy import *
init_printing()

Annahmen


In [2]:
x = Symbol('x')
a = Symbol('a')

In [3]:
I1 = Integral(x*exp(-a*x), (x,0,oo))
I1


Out[3]:
$$\int_{0}^{\infty} x e^{- a x}\, dx$$

In [4]:
I1.doit()


Out[4]:
$$\begin{cases} \frac{1}{a^{2}} & \text{for}\: \left|{\operatorname{periodic_{argument}}{\left (a,\infty \right )}}\right| < \frac{\pi}{2} \\\int_{0}^{\infty} x e^{- a x}\, dx & \text{otherwise} \end{cases}$$

Annahmen über die Variablen


In [5]:
a = Symbol('a', positive=True)

In [6]:
sqrt(a**2)


Out[6]:
$$a$$

In [7]:
I1.doit()


Out[7]:
$$\begin{cases} \frac{1}{a^{2}} & \text{for}\: \left|{\operatorname{periodic_{argument}}{\left (a,\infty \right )}}\right| < \frac{\pi}{2} \\\int_{0}^{\infty} x e^{- a x}\, dx & \text{otherwise} \end{cases}$$

Das $a$ in I1 wurde nicht verändert.


In [8]:
I2 = Integral(x*exp(-a*x), (x,0,oo))  # neues I1
I2.doit()


Out[8]:
$$\frac{1}{a^{2}}$$

In [9]:
a._assumptions


Out[9]:
{'algebraic': None,
 'antihermitian': None,
 'commutative': True,
 'complex': True,
 'finite': None,
 'hermitian': True,
 'imaginary': False,
 'infinite': None,
 'irrational': None,
 'negative': False,
 'nonnegative': True,
 'nonpositive': False,
 'nonzero': True,
 'polar': None,
 'positive': True,
 'rational': None,
 'real': True,
 'zero': False}

In [10]:
n = Symbol('n', integer=True)
cos(pi*n)


Out[10]:
$$\left(-1\right)^{n}$$

Summen und Reihen


In [11]:
n = Symbol('n')
j = Symbol('j')
q = Symbol('q')

In [12]:
S1 = Sum(j, (j,1,n))   # Sum gibt es nur als trägen Operator
S1


Out[12]:
$$\sum_{j=1}^{n} j$$

In [13]:
S1.doit().factor()


Out[13]:
$$\frac{n}{2} \left(n + 1\right)$$

In [14]:
S2 = Sum(1/j**2, (j, 1, oo))
S2


Out[14]:
$$\sum_{j=1}^{\infty} \frac{1}{j^{2}}$$

In [15]:
S2.doit()


Out[15]:
$$\frac{\pi^{2}}{6}$$

In [16]:
S3 = Sum(q**j, (j, 0, oo))
S3


Out[16]:
$$\sum_{j=0}^{\infty} q^{j}$$

In [17]:
S3.doit()


Out[17]:
$$\begin{cases} \frac{1}{- q + 1} & \text{for}\: \left|{q}\right| < 1 \\\sum_{j=0}^{\infty} q^{j} & \text{otherwise} \end{cases}$$

Da kommen wir nur mit einem häßlichen Hack dran:


In [18]:
S3.doit().args


Out[18]:
$$\left ( \left ( \frac{1}{- q + 1}, \quad \left|{q}\right| < 1\right ), \quad \left ( \sum_{j=0}^{\infty} q^{j}, \quad \mathrm{True}\right )\right )$$

In [19]:
S3.doit().args[0]


Out[19]:
$$\left ( \frac{1}{- q + 1}, \quad \left|{q}\right| < 1\right )$$

In [20]:
S3.doit().args[0][0]


Out[20]:
$$\frac{1}{- q + 1}$$

Sympy rechnet komplex


In [21]:
x = Symbol('x')
y = Symbol('y')
z = x+I*y
z


Out[21]:
$$x + i y$$

In [22]:
w = z**4
w


Out[22]:
$$\left(x + i y\right)^{4}$$

In [23]:
re(w).expand()


Out[23]:
$$\left(\Re{x}\right)^{4} - 4 \left(\Re{x}\right)^{3} \Im{y} - 6 \left(\Re{x}\right)^{2} \left(\Re{y}\right)^{2} - 12 \left(\Re{x}\right)^{2} \Re{y} \Im{x} - 6 \left(\Re{x}\right)^{2} \left(\Im{x}\right)^{2} + 6 \left(\Re{x}\right)^{2} \left(\Im{y}\right)^{2} + 12 \Re{x} \left(\Re{y}\right)^{2} \Im{y} + 24 \Re{x} \Re{y} \Im{x} \Im{y} + 12 \Re{x} \left(\Im{x}\right)^{2} \Im{y} - 4 \Re{x} \left(\Im{y}\right)^{3} + \left(\Re{y}\right)^{4} + 4 \left(\Re{y}\right)^{3} \Im{x} + 6 \left(\Re{y}\right)^{2} \left(\Im{x}\right)^{2} - 6 \left(\Re{y}\right)^{2} \left(\Im{y}\right)^{2} + 4 \Re{y} \left(\Im{x}\right)^{3} - 12 \Re{y} \Im{x} \left(\Im{y}\right)^{2} + \left(\Im{x}\right)^{4} - 6 \left(\Im{x}\right)^{2} \left(\Im{y}\right)^{2} + \left(\Im{y}\right)^{4}$$

In [24]:
x = Symbol('x', real=True)
y = Symbol('y', real=True)
z = x+I*y
z


Out[24]:
$$x + i y$$

In [25]:
w = z**4
re(w)


Out[25]:
$$x^{4} - 6 x^{2} y^{2} + y^{4}$$

In [26]:
im(w)


Out[26]:
$$4 x^{3} y - 4 x y^{3}$$

numpy-Funktions

auch "universal functions" genannt


In [27]:
import numpy as np

In [28]:
xn = np.linspace(0, 1, 4)
xn


Out[28]:
array([ 0.        ,  0.33333333,  0.66666667,  1.        ])

In [29]:
#sin(pi*xn) # mislingt
np.sin(np.pi*xn)


Out[29]:
array([  0.00000000e+00,   8.66025404e-01,   8.66025404e-01,
         1.22464680e-16])

Verwandlung von Ausdrücken in numpy-Funktionen


In [30]:
f = exp(-x/2) * sin(pi*x)
f


Out[30]:
$$e^{- \frac{x}{2}} \sin{\left (\pi x \right )}$$

In [31]:
fn = lambdify(x, f, 'numpy')
fn


Out[31]:
<function numpy.<lambda>>

In [32]:
f.subs(x, .5), fn(.5)


Out[32]:
$$\left ( 0.778800783071405, \quad 0.778800783071\right )$$

In [33]:
fn(xn)


Out[33]:
array([  0.00000000e+00,   7.33074678e-01,   6.20534318e-01,
         7.42785831e-17])

Funktionsgraphen


In [34]:
plot(f, (x, -pi, pi));



In [35]:
f = sin(pi*x)
g = cos(pi*x)
p1 = plot(f, (x, -2, 2), show=False)
p2 = plot(g, (x, -2, 2), show=False)
p1.extend(p2)
p1[1].line_color = 'green'
p1.legend = True
p1.show()


Funktionsgraphen sind Numerik


In [36]:
import matplotlib.pyplot as plt

interaktiv:


In [37]:
#%matplotlib notebook

für den Druck


In [38]:
%matplotlib inline

In [39]:
fn = lambdify(x, f, 'numpy')
gn = lambdify(x, g, 'numpy')
xn = np.linspace(-2, 2, 300)
plt.plot(xn, fn(xn), label='sin')
plt.plot(xn, gn(xn), label='cos')
plt.legend();



In [40]:
xn = np.linspace(-3, 3, 300)
h = exp(-x)/x
hn = lambdify(x, h, 'numpy')
plt.figure()    # schreibt sonst in den bereits geöffneten Plot,
                # wenn dieser noch nicht abgeschlossen ist
plt.plot(xn, hn(xn));


unbrauchbar


In [41]:
xp = np.linspace(.0001, 3, 150)
xm = -xp
plt.figure()
plt.plot(xp, hn(xp))
plt.plot(xm, hn(xm), 'b')  # mögliche Werte rgbcmykw
plt.axis(ymin=-10, ymax=10)
plt.title(str(h));


etwas eleganter


In [42]:
xn = np.linspace(-3, 3, 300)
plt.figure()
yn = hn(xn)
yn[abs(yn)>10] = np.nan
plt.plot(xn, yn)
plt.title(str(h));


Index Tricks


In [43]:
xn = np.linspace(-.3, .3, 15)
yn = hn(xn)


/az076/anaconda3/envs/compana16/lib/python3.5/site-packages/numpy/__init__.py:1: RuntimeWarning: divide by zero encountered in true_divide
  """

In [44]:
yn


Out[44]:
array([ -4.49952936,  -5.02922724,  -5.78189079,  -6.9241629 ,
        -8.84490948, -12.71077499, -24.35507134,          inf,
        22.35445903,  10.70832512,   6.83939472,   4.91435258,
         3.76654949,   3.00711344,   2.46939407])

In [45]:
abs(yn) > 10


Out[45]:
array([False, False, False, False, False,  True,  True,  True,  True,
        True, False, False, False, False, False], dtype=bool)

In [46]:
yn[abs(yn) > 10] = np.nan
yn


Out[46]:
array([-4.49952936, -5.02922724, -5.78189079, -6.9241629 , -8.84490948,
               nan,         nan,         nan,         nan,         nan,
        6.83939472,  4.91435258,  3.76654949,  3.00711344,  2.46939407])

np.nan wird von den plot-Routinen ignoriert

3D Graphen


In [47]:
from sympy.plotting import plot3d

In [48]:
x = Symbol('x')
y = Symbol('y')
f = cos(sqrt(x**2+y**2))
f


Out[48]:
$$\cos{\left (\sqrt{x^{2} + y^{2}} \right )}$$

In [49]:
plot3d(f, (x, -3*pi, 3*pi), (y, -3*pi, 3*pi));



In [ ]: