Computergestützte Mathematik zur Analysis¶

Vorlesung vom 17.11.2022

© 2022 Prof. Dr. Rüdiger W. Braun

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

Funktionen¶

In [3]:
def f(x):
    return x**2 + 3*sin(x) + 15   # Funktionskörper abgesetzt (wie Schleifenkörper)
In [4]:
f(1)
Out[4]:
$\displaystyle 3 \sin{\left(1 \right)} + 16$
In [5]:
f(1.)
Out[5]:
$\displaystyle 18.5244129544237$
In [6]:
f(pi/2)
Out[6]:
$\displaystyle \frac{\pi^{2}}{4} + 18$
In [7]:
y = S('y')
f(y)
Out[7]:
$\displaystyle y^{2} + 3 \sin{\left(y \right)} + 15$

Duck typing:

“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”

– James Whitcomb Riley

In [8]:
def fakultaet(n):
    res = 1
    for j in range(1, n+1):
        res *= j
    return res
In [12]:
fakultaet(3)
Out[12]:
$\displaystyle 6$
In [13]:
fakultaet(120) / factorial(120)
Out[13]:
$\displaystyle 1$

Mathematische Funktion vs. Programmfunktion¶

sympy Python
Definition als Ausdruck f def f(x)
Auswertung f.subs(x, ...) f(x)
mathematische Manipulationen ja nein
beliebige Argumente nein ja
Nebeneffekte nein ja

Verwandlung Python-Funktion in Ausdruck durch Auswertung

In [14]:
def f(x):                 # x ist lokal
    return cos(x**2)
In [15]:
y = Symbol('y')
f(y)
Out[15]:
$\displaystyle \cos{\left(y^{2} \right)}$

Verwandlung von Ausdruck in Funktion

zum Zwecke der numerischen Auswertung

In [16]:
p = y**2/2
In [19]:
f = lambdify(y, p)
f
Out[19]:
<function _lambdifygenerated(y)>
In [20]:
f(1)
Out[20]:
$\displaystyle 0.5$
In [21]:
f(pi)
Out[21]:
$\displaystyle 0.5 \pi^{2}$

Einfache Plots von Ausdrücken¶

In [22]:
p
Out[22]:
$\displaystyle \frac{y^{2}}{2}$
In [23]:
plot(p)
Out[23]:
<sympy.plotting.plot.Plot at 0x18cc9b3d9a0>
In [24]:
p1 = plot(p, 1 - p, (y,-sqrt(2),sqrt(2)), show=False)
p1.legend = True
p1.show()

Wenn das nicht reicht, verwenden wir matplotlib

Lösungen von Gleichungen¶

In [27]:
x = S('x')
glg = Eq(x**2, 2)
glg
Out[27]:
$\displaystyle x^{2} = 2$
In [28]:
lsg = solve(glg)
lsg
Out[28]:
$\displaystyle \left[ - \sqrt{2}, \ \sqrt{2}\right]$

Probe:

In [29]:
lsg_dict = solve({glg})  # diese Form ist besser für die Probe
lsg_dict
Out[29]:
$\displaystyle \left[ \left\{ x : - \sqrt{2}\right\}, \ \left\{ x : \sqrt{2}\right\}\right]$
In [31]:
lsd = solve(glg, dict=True)
lsd
Out[31]:
$\displaystyle \left[ \left\{ x : - \sqrt{2}\right\}, \ \left\{ x : \sqrt{2}\right\}\right]$
In [32]:
for l in lsg_dict:
    display(glg.subs(l))
$\displaystyle \text{True}$
$\displaystyle \text{True}$

Die Fibonacci-Zahlen sind von der Form $f_n = aA^n + bB^n$. Wir bestimmen die Unbekannten.

In [33]:
a, A, b, B = symbols("a A b B")  
In [34]:
def g(n):
    return a*A**n + b*B**n
In [35]:
gls = set()
for n in range(1,5):
    glg = Eq(fibonacci(n), g(n))
    gls.add(glg)

gls
Out[35]:
$\displaystyle \left\{1 = A a + B b, 1 = A^{2} a + B^{2} b, 2 = A^{3} a + B^{3} b, 3 = A^{4} a + B^{4} b\right\}$
In [36]:
lsg = solve(gls)
lsg
Out[36]:
$\displaystyle \left[ \left\{ A : \frac{1}{2} - \frac{\sqrt{5}}{2}, \ B : \frac{1}{2} + \frac{\sqrt{5}}{2}, \ a : - \frac{\sqrt{5}}{5}, \ b : \frac{\sqrt{5}}{5}\right\}, \ \left\{ A : \frac{1}{2} + \frac{\sqrt{5}}{2}, \ B : \frac{1}{2} - \frac{\sqrt{5}}{2}, \ a : \frac{\sqrt{5}}{5}, \ b : - \frac{\sqrt{5}}{5}\right\}\right]$
In [37]:
g(n).subs(lsg[0])  
Out[37]:
$\displaystyle - \frac{\sqrt{5} \left(\frac{1}{2} - \frac{\sqrt{5}}{2}\right)^{4}}{5} + \frac{\sqrt{5} \left(\frac{1}{2} + \frac{\sqrt{5}}{2}\right)^{4}}{5}$

$n$ ist aus der Schleife herausgesickert. ($n$ has leaked from the loop)

In [38]:
n = S('n')
g(n).subs(lsg[0])
Out[38]:
$\displaystyle - \frac{\sqrt{5} \left(\frac{1}{2} - \frac{\sqrt{5}}{2}\right)^{n}}{5} + \frac{\sqrt{5} \left(\frac{1}{2} + \frac{\sqrt{5}}{2}\right)^{n}}{5}$
In [42]:
for nn in range(10, 14):
    print(fibonacci(nn), g(nn).subs(lsg[0]).expand())
55 55
89 89
144 144
233 233

Probe

In [40]:
for nn in range(1,35):
    if fibonacci(nn) != g(nn).subs(lsg[0]):
        raise ValueError(f"ungleich für n={nn}")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [40], in <cell line: 1>()
      1 for nn in range(1,35):
      2     if fibonacci(nn) != g(nn).subs(lsg[0]):
----> 3         raise ValueError(f"ungleich für n={nn}")

ValueError: ungleich für n=1
In [43]:
for nn in range(1,35):
    if fibonacci(nn) != g(nn).subs(lsg[0]).expand():
        raise ValueError(f"ungleich für n={nn}")

No news is good news.

Wir prüfen jetzt noch die Rekursionsgleichung $f_{n+2} = f_{n+1} + f_n$

In [44]:
def G(n):
    return g(n).subs(lsg[0])
In [45]:
tmp = G(n+2)-G(n+1)-G(n)
tmp
Out[45]:
$\displaystyle \frac{\sqrt{5} \left(\frac{1}{2} - \frac{\sqrt{5}}{2}\right)^{n}}{5} + \frac{\sqrt{5} \left(\frac{1}{2} - \frac{\sqrt{5}}{2}\right)^{n + 1}}{5} - \frac{\sqrt{5} \left(\frac{1}{2} - \frac{\sqrt{5}}{2}\right)^{n + 2}}{5} - \frac{\sqrt{5} \left(\frac{1}{2} + \frac{\sqrt{5}}{2}\right)^{n}}{5} - \frac{\sqrt{5} \left(\frac{1}{2} + \frac{\sqrt{5}}{2}\right)^{n + 1}}{5} + \frac{\sqrt{5} \left(\frac{1}{2} + \frac{\sqrt{5}}{2}\right)^{n + 2}}{5}$
In [46]:
tmp.expand()
Out[46]:
$\displaystyle 0$

Lösung in Abhängigkeit von Parametern¶

In [47]:
p = S('p')
q = S('q')
f = x**2 + p*x + q
glg = Eq(f, 0)
glg
Out[47]:
$\displaystyle p x + q + x^{2} = 0$
In [48]:
solve(glg)
Out[48]:
$\displaystyle \left[ \left\{ p : - \frac{q}{x} - x\right\}\right]$
In [51]:
solve(glg, {x})
Out[51]:
$\displaystyle \left[ - \frac{p}{2} - \frac{\sqrt{p^{2} - 4 q}}{2}, \ - \frac{p}{2} + \frac{\sqrt{p^{2} - 4 q}}{2}\right]$

Für welche Werte von $p$ und $q$ hat $f$ eine doppelte Nullstelle?

In [52]:
glg2 = Eq(f.diff(x), 0)
glg2
Out[52]:
$\displaystyle p + 2 x = 0$
In [55]:
solve({glg, glg2}, {x,q})
Out[55]:
$\displaystyle \left[ \left\{ q : \frac{p^{2}}{4}, \ x : - \frac{p}{2}\right\}\right]$

Für beliebiges $p$ und $q = \frac{p^2}4$ ist $x=-\frac p2$ doppelte Nullstelle von $f$.

Annahmen bei solve¶

In [56]:
glg = Eq(x**4, 16)
solve(glg)
Out[56]:
$\displaystyle \left[ -2, \ 2, \ - 2 i, \ 2 i\right]$
In [57]:
y = Symbol('y', positive=True)
solve(glg.subs(x, y))
Out[57]:
$\displaystyle \left[ 2\right]$

Sympy rechnet komplex¶

auch wenn man es nicht erwartet

In [58]:
I
Out[58]:
$\displaystyle i$
In [59]:
I**2
Out[59]:
$\displaystyle -1$
In [60]:
exp(I*pi/2)
Out[60]:
$\displaystyle i$
In [61]:
((I+1)**3).expand()
Out[61]:
$\displaystyle -2 + 2 i$
In [62]:
re(3+4*I)
Out[62]:
$\displaystyle 3$
In [63]:
im(3+4*I)
Out[63]:
$\displaystyle 4$
In [64]:
conjugate(3+4*I)
Out[64]:
$\displaystyle 3 - 4 i$
In [65]:
re(exp(I*x))
Out[65]:
$\displaystyle e^{- \operatorname{im}{\left(x\right)}} \cos{\left(\operatorname{re}{\left(x\right)} \right)}$
In [66]:
x = Symbol('x', real=True)
In [67]:
re(exp(I*x))
Out[67]:
$\displaystyle \cos{\left(x \right)}$
In [68]:
b = I*(I**Rational(3,7) - I**Rational(-3,7))
b
Out[68]:
$\displaystyle i \left(i^{\frac{11}{7}} + i^{\frac{3}{7}}\right)$

$b$ ist reell

In [69]:
b.simplify()
Out[69]:
$\displaystyle i^{\frac{3}{7}} i \left(1 + i^{\frac{8}{7}}\right)$
In [70]:
b.expand(complex=True)
Out[70]:
$\displaystyle - 2 \sin{\left(\frac{3 \pi}{14} \right)}$
In [71]:
glg = Eq(exp(x), E)
solve({glg})
Out[71]:
$\displaystyle \left\{ x : 1\right\}$

Es gibt aber noch mehr Lösungen

In [72]:
n = Symbol('n', integer=True)
In [74]:
glg.subs(x, 1 + 2*n*pi*I).simplify()
Out[74]:
$\displaystyle \text{True}$

Mengen von Nullstellen¶

In [75]:
lsg_cplx = solveset(glg)
lsg_cplx
Out[75]:
$\displaystyle \left\{2 n i \pi + 1\; \middle|\; n \in \mathbb{Z}\right\}$
In [76]:
for (j, z) in zip(range(5), lsg_cplx):
    display(z)
$\displaystyle 1$
$\displaystyle 1 + 2 i \pi$
$\displaystyle 1 - 2 i \pi$
$\displaystyle 1 + 4 i \pi$
$\displaystyle 1 - 4 i \pi$
In [77]:
list(zip([1,2,3], ['a', 'b', 'c']))
Out[77]:
[(1, 'a'), (2, 'b'), (3, 'c')]
In [78]:
solveset(glg, domain=Reals)
Out[78]:
$\displaystyle \left\{1\right\}$

Andere Wahlen für domain: Naturals, Naturals0, Integers, Complexes (Voreinstellung)