CoCalc Shared Filesangabe-gruppe1-02.ipynbOpen in CoCalc with one click!
Authors: harald @schil.ly, Testing CoCalc, John Jeng, Harald Schilly, Harald Schilly, ℏal Snyder, William A. Stein
Views : 10
Description: IPython notebook angabe-gruppe1-02.ipynb

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 [1]:
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
5

Erklärung:

(b)

In [2]:
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
34 90 81

Erklärung:

(c)

In [3]:
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
2.4

Erklärung:

(d)

In [4]:
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))
Die höchste Temperatur war am Tag 6 mit 10.00°C

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 [5]:
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][-10,\,10]. Wenn für eine gute Darstellung notwendig, schränke den Bereich der y-Achse ein.

In [6]:
%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):=x1x2+2x3 f(x) := \frac{x-1}{x^2+2x-3}

In [ ]:

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

In [ ]:

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

In [ ]:

(d) k(x):=x215 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 xx 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 [7]:
from sympy import sqrt, exp, Eq, solve, init_printing from sympy.abc import x init_printing()

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

In [ ]:

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

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

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

In [ ]:
In [ ]:

(d) ax3+bcx2+d=0 \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 [8]:
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 [9]:
n = 69 chr(n)
'E'
In [10]:
type(n), type(chr(n))
(int, str)
In [11]:
ord("E")
69
In [12]:
float(ord(chr(n)))
69.0

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 [13]:
x = True
In [ ]:
  • ursprünglicher Typ: ...
  • Konvertierung in ... (Typ ...) mittels ...
  • Konvertierung in ... (Typ ...) mittels ...
  • ...

(b)

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

(c)

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

(d)

In [16]:
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

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

Finde alle Paare i,ji,\,j mit 0i<j10000 \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 [17]:
s1 = set([1,4,8,5,8,2,4,2,1]) s1
{1, 2, 4, 5, 8}

Erklärung:

(b)

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

Erklärung:

(c)

In [19]:
# probiere hier aus, was randint macht bzw. lies dessen Hilfe mittels 'randint?' from random import randint randint(0, 100)
34
In [20]:
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
{7, 11, 17, 33, 44, 45, 52, 63, 77, 89}

Erklärung:

(d)

In [21]:
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))
{'is', 'it', 'programming', 'the', 'to'}

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 [22]:
def func_a(length, cost = 21): return length * cost
In [23]:
func_a(5)
105

Erklärung:

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

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

(b)

In [25]:
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 [26]:
func_b(100, 42, 58, 109, 11)
'We can only pay 2 clients'

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:
In [27]:
damages = [15, 19, 21, 32, 14, 25] func_b(90, *damages)
'We can only pay 4 clients'

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

(c)

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

Erklärung:

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

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

(d)

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

Erklärung:

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

Erklärung:

  • Aufruf:
  • Übergebene Elemente:
  • Ablauf:

2.11 Interaktiver Plot

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

  • die Variable x[0,20]x \in [0,\,20]
  • die Parameter aa, bb und cc sollen jeweils aus dem Intervall [3,3][-3,\,3] wählbar sein
  • die Y-Achse im Interval [10,10][-10,\,10] fixiert werden
In [34]:
%matplotlib inline import matplotlib.pyplot as plt from IPython.html.widgets import interact
/projects/sage/sage-6.9/local/lib/python2.7/site-packages/IPython/html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`. "`IPython.html.widgets` has moved to `ipywidgets`.", ShimWarning)
In [ ]:

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

Plotte die diskreten Funktionen ZZ\mathbb{Z} \Rightarrow \mathbb{Z} f(x):=(x+5)2+3x2xf(x) := (-x+5)^2 + 3x^2 -x und g(x):=((30+x)(20x))x+1000g(x) := \left((30+x) (20-x)\right) x + 1000 für an den Stellen x{20,19,,20}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 [35]:
%matplotlib inline import matplotlib.pyplot as plt
In [ ]:

2.13 Gleichungssystem 1

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

{x+2xy+1=0xy+2y+2=0\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\LaTeX Formeldarstellung.

In [36]:
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: {3x4y+z=11x+z=y+11z=x  (1y)\begin{cases} 3x - 4y + z &= 11 \\ x + z &= y +1 \\ 1 - z &= x \; (1-y) \end{cases}

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