Arbeitsblatt 2

Erstellungsdatum: 2015-03-17 20:55

Wichtig: Dieses Arbeitsblatt muss mit dem Dateinamen nachname_vorname_matrikelnummer_uebungszahl.ipynb abgespeichert und zur Abgabe vor der Abgabefrist hochgeladen werden. Die "Übungszahl" ist hierbei optional, und kann für die eigene Übersicht nützlich sein. Hierfür hier oben im IPython Notebook auf den Titel angabe-gruppeN-02 klicken und den Namen eingeben. Sowohl Vor- als auch Nachname bitte ausschließlich in Kleinbuchstaben eingeben -- z.B. mustermann_max_1401567_02.

Eine korrekte Abgabe besteht aus funktionstüchtigen Codezellen, die von oben nach unten ausgewertet werden können. Zur Überprüfung dessen im Menü: KernelRestart auswählen und anschließend mittels CellRun all alle Zellen ausführen.

2.1 Abzählen

In den folgenden Beispielen werden verschiedene Iterationen und Abzählungen vorgenommen. Lies sie durch, mach eine Vermutung über das Ergebnis, und dann führe sie aus. Ist etwas unklar, kopiere Teile der Prozedur in eine neue Zelle und führe diesen Teil separat aus. Erkäre was passiert!

(a)

In []:
namen = ["Susi", "Sandra", "Stephan", "Rudi", "Seraphin"]
namen.append("Norbert")
namen.append("Susi")

count = 0
for name in namen:
    if name.startswith("S"):
        count += 1
print count

Erklärung:

(b)

In []:
prim = [2, 3, 5, 7, 13, 17, 23]
test = [101, 997, 34, 90, 81]

for zahl in test:
    for p in prim:
        if zahl % p == 0:
            print zahl
            break

Erklärung:

(c)

In []:
noten = {
    "Erich": 1,
    "Julia": 3,
    "Natascha": 5,
    "Martina": 1,
    "Ute": 2
}
notendurchschnitt = 0.0

for note in noten.values():
    notendurchschnitt += note
    
notendurchschnitt /= len(noten)

print notendurchschnitt

Erklärung:

(d)

In []:
temps = [4, 6, 8, 9, 3, 9, 10, 5, 6]

temp_max = None
temp_idx = None
for idx, temp in enumerate(temps):
    if temp_max is None or temp > temp_max:
        temp_max = temp
        temp_idx = idx

print("Die höchste Temperatur war am Tag {} mit {:.2f}°C".format(temp_idx, temp_max))

Erklärung:

2.2 Nähester Ort

Georg hat mitten in der Wüste einen Unfall und muss dringend in den nähesten Ort. Er kennt seine Position und die von 4 umliegenden Orten. Wohin ist die Luftlinie am kürzesten?

In []:
position = (14, 5)
orte = [(4, 15), (25, 12), (16, 17), (11, 21)]
In []:
 

2.3 Funktionen Plotten

Plotte folgende Funktionen jeweils im Intervall $[-10,\,10]$. Wenn für eine gute Darstellung notwendig, schränke den Bereich der y-Achse ein.

In []:
%matplotlib inline
from sympy.abc import x
from sympy.plotting import plot
from sympy import sin, tan
from sympy.functions import Abs

(a) $$ f(x) := \frac{x-1}{x^2+2x-3} $$

In []:
 

(b) $$ g(x) := \tan\left(\sin(x)\right) $$

In []:
 

(c) $$ h(x) := \frac{1}{x - \frac{3}{x}} $$

In []:
 

(d) $$ k(x) := \left| x^2-15 \right| $$

In []:
 

2.4 Gleichungen lösen

Verwende die Programmbibliothek SymPy um jeweils folgende Gleichungen zuerst mittels Eq(..., ...) anzugeben und dann nach $x$ zu lösen. Anschließend überprüfe die Ergebnisse mittels einsetzen (d.h. substituiere jede Lösung für x in der jeweiligen Gleichung, e.g. .subs(x, solution[0]).simplify()):

In []:
from sympy import sqrt, exp, Eq, solve, init_printing
from sympy.abc import x
init_printing()

(a) $$ 1 - x = \frac{1 + x}{1-x} $$

In []:
 

(b) $$ x \; (\sqrt{5}+x) = 5 $$

In []:
 
In []:
 
In []:
 

(c) $$ \mathbb{e}^{1/(1+x)} = 3 $$

In []:
 
In []:
 

(d) $$ \frac{a x^3 + b}{c x^2 + d} = 0 $$

In []:
 
In []:
 
In []:
 
In []:
 

2.5 Zungenbrecher

Schreibe ein Programm, das im folgenden Zungenbrecher die Häufigkeit der Buchstaben s bzw. S zählt. (Gib die Gesamtsumme aus).

In []:
zungenbrecher = """Schnecken erschrecken, wenn sie an Schnecken schlecken, 
weil zum Schrecken vieler Schnecken, Schnecken nicht schmecken."""
In []:
 
In []:
 

2.6 Typenkonvertierung

Python ist eine "strongly typed" Programmiersprache. Bislang sind schon mehrere Basistypen vorgekommen. Es ist üblicherweise wichtig zu wissen, welchen Typ ein gegebenes Objekt hat (Abfrage mittels Funktion "type()") und (damit verbunden) was sich damit machen lässt.

Die in Python eingebauten Funktionen: int, bool, hex, oct, long, str, ord, chr und float helfen, zwischen verschiedenen Typen oder Repräsentationen zu wechseln -- sofern dies möglich ist und einen Sinn hat! Lies über diese Funktionen in der Python 2 Dokumentation.

Beispiel:

In []:
n = 69
chr(n)
In []:
type(n), type(chr(n))
In []:
ord("E")
In []:
float(ord(chr(n)))

Aufgabe

Versuche nun die folgenden vier Objekte (x, l, k, z) mittels der oben erwähnten Funktionen in möglichst viele andere Objekte zu konvertieren. Vermerke dabei jeweils, welcher Typ das ursprüngliche Objekt hat (Abfrage mittels type()) und mittels welcher Funktionen es sich in welchen Wert und Typ verwandeln ließ.

Überlege auch, welche Funktionen jeweils die identische Abbildung sind bzw. welche jeweils zueinander inverse Operationen sind.

(a)

In []:
x = True
In []:
 
  • ursprünglicher Typ: ...
  • Konvertierung in ... (Typ ...) mittels ...
  • Konvertierung in ... (Typ ...) mittels ...
  • ...

(b)

In []:
l = [1, 2, 3]
In []:
 
  • ursprünglicher Typ: ...
  • Konvertierung in ... (Typ ...) mittels ...
  • Konvertierung in ... (Typ ...) mittels ...
  • ...

(c)

In []:
z = "9"
In []:
 
  • ursprünglicher Typ: ...
  • Konvertierung in ... (Typ ...) mittels ...
  • Konvertierung in ... (Typ ...) mittels ...
  • ...

(d)

In []:
k = 9.81
In []:
 
  • ursprünglicher Typ: ...
  • Konvertierung in ... (Typ ...) mittels ...
  • Konvertierung in ... (Typ ...) mittels ...
  • ...

2.7 Zahlensuche

Suche alle vierstelligen Zahlen, also von 1000 bis 9999, welche durch 17 teilbar und Palindrome sind!

Hinweis: str(x) konvertiert eine Zahl x in einen entsprechenden String, dessen Richtung genauso wie bei einer Liste umgedreht werden kann.

In []:
 

2.8 Zahlenakrobatik

$i$ und $j$ sind zwei berühmte akrobatische Variablen in $\mathbb{N}$. Eines ihrer größten Kunststücke ist, dass die Differenz zwischen ihrem Produkt und ihrer Summe genau 99999 ist (d.h. $i j -(i+j)=99999$).

Finde alle Paare $i,\,j$ mit $0 \leq i < j \leq 1000$, wo sie vorkommen.

Idee:

for i in range(1000):
    for j in range(..., 1001):
        if ... == ...:
            print i, j
In []:
 

2.9 Mengen (set)

Python's Datentyp "set" repräsentiert eine ungeordnete Sammlung von Objekten ohne Duplikate. Es unterstützt außerdem Standardmethoden zur Verarbeitung von Mengen. Beobachte das Verhalten der folgenden Codezellen und erkläre, was jeweils passiert.

(a)

In []:
s1 = set([1,4,8,5,8,2,4,2,1])
s1

Erklärung:

(b)

In []:
s21 = set(["Gustav", "Luise", "Stephan"])
s22 = set(["Stephan", "Gustav", "Paul", "Gregor"])
s2 = s21.union(s22)
len(s2)

Erklärung:

(c)

In []:
# probiere hier aus, was randint macht bzw. lies dessen Hilfe mittels 'randint?'
from random import randint
randint(0, 100)
In []:
erledigt = set([9, 16, 12, 41, 8, 67, 91, 73, 42])
naechste = set()
while len(naechste) < 10:
    x = randint(0, 100)
    if x not in erledigt:
        naechste.add(x)
naechste

Erklärung:

(d)

In []:
text1 = """\
Most good programmers do programming not because they expect to get paid or get adulation by the public,
but because it is fun to program.
""".lower().split()

text2 = """\
The second stream of material that is going to come out of this project 
is a programming environment and a set of programming tools where 
we really want to focus again on the needs of the newbie. 
This environment is going to have to be extremely user-friendly. 
On the other hand, we want to make it expert-friendly. 
And we also want to make it a lot easier to start using it without much computer experience 
than existing programming environments are.
""".lower().split()

set(text1).intersection(set(text2))

Erklärung:

2.10 Python Funktionen

func_a bis func_d ist jeweils eine Funktion in Python und jede wird anschließend zweimal aufgerufen.

Erkläre jeweils, was beim Aufruf passiert, welche Werte übergeben werden, und wie die übergebenen Werte zu dem jeweiligen Ergebnis verarbeitet werden.

(a)

In []:
def func_a(length, cost = 21):
    return length * cost
In []:
func_a(5)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:
In []:
func_a(length = 9, cost = 0.1)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

(b)

In []:
def func_b(settlement, *damages):
    count = 0
    for damage in damages:
        settlement -= damage
        if settlement < 0:
            break
        count += 1
    return "We can only pay %d clients" % count
In []:
func_b(100, 42, 58, 109, 11)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:
In []:
damages = [15, 19, 21, 32, 14, 25]
func_b(90, *damages)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

(c)

In []:
def func_c(a, b, x = 4, y = 9):
    A = a*b*x
    U = 2*(a+b)*y
    return A + U
In []:
func_c(10, 1, y = 8, x = 2)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:
In []:
func_c(b = 8, a = 7)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

(d)

In []:
def func_d(mary, joe, paul = 40, susan = 5, **others):
    ages = [mary, joe, paul, susan] + others.values()
    return sum(ages)
In []:
ages = {"paul" : 15, "richard": 25}
func_d(10, 20, **ages)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:
In []:
friends = {
    "mary" : 15,
    "paul" : 20,
    "joe" : 25,
    "jack": 30,
}
func_d(**friends)

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

2.11 Interaktiver Plot

Stelle $f(x) := a \sin(b x) + c \sqrt{x}$ in einem interaktiven Plot dar.

  • die Variable $x \in [0,\,20]$
  • die Parameter $a$, $b$ und $c$ sollen jeweils aus dem Intervall $[-3,\,3]$ wählbar sein
  • die Y-Achse im Interval $[-10,\,10]$ fixiert werden
In []:
%matplotlib inline
import matplotlib.pyplot as plt
from IPython.html.widgets import interact
In []:
 

2.12 Funktionen $\mathbb{Z} \Rightarrow \mathbb{Z}$

Plotte die diskreten Funktionen $\mathbb{Z} \Rightarrow \mathbb{Z}$ $$f(x) := (-x+5)^2 + 3x^2 -x$$ und $$g(x) := \left((30+x) (20-x)\right) x + 1000$$ für an den Stellen $$x \in \{-20,\,-19,\dots,\,20\}$$ in denselben Plot, in den Farben grün und blau und den Markern "+" und ".".

Achte darauf, dass die Darstellung diskrete Punkte sind und mit einem Koordinatenraster hinterlegt werden.

Hinweis: Die folgenden Funktionen aus matplotlib's pyplot API werden nützlich sein: scatter und grid.

In []:
%matplotlib inline
import matplotlib.pyplot as plt
In []:
 

2.13 Gleichungssystem 1

Verwende die Programmbibliothek SymPy um folgendes Gleichungssystem zu lösen:

\begin{cases} x + \frac{2x}{y} + 1 &= 0 \\ x y + 2 y + 2 &= 0 \end{cases}

und überprüfe beide Lösungen durch einsetzen.

Aktiviere Sympy's $\LaTeX$ Formeldarstellung.

In []:
from sympy import Eq, sqrt, sin, solve, init_printing
from sympy.abc import x, y, z
init_printing()
In []:
 
In []:
 
In []:
 

2.14 Gleichungssystem 2

Löse außerdem dieses Gleichungssystem und überprüfe die Lösungen durch Einsetzen: \begin{cases} 3x - 4y + z &= 11 \\ x + z &= y +1 \\ 1 - z &= x \; (1-y) \end{cases}

In []:
 
In []:
 
In []:
 
In []:
 
In []: