Skip to content
Snippets Groups Projects
seminar07.ipynb 49 KiB
Newer Older
schwabmi's avatar
schwabmi committed
    "  </div>       \n",
    "</details>\n",
    "\n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">4. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "     \n",
    "Die while-Schleife ersetzt das Summenzeichen. Überlegen Sie sich wie Sie die Bedingung formulieren müssen. Die Abbruchbedingung lautet $abs(term)<1e-15$\n",
    "     \n",
    "  </div>       \n",
    "</details>\n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">5. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "      \n",
    "Das Summenzeichen berechnet und addiert Werte von `k=0` bis unendlich. `k` muss also in jedem Schleifendurchlauf um 1 erhöht werden.   \n",
    "  </div>       \n",
    "</details>\n",
    "\n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">6. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "      \n",
    "Alles was hinter dem Summenzeichen steht, wird in der Schleife berechnet.\n",
    "      \n",
    "  </div>       \n",
    "</details>\n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">7. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "\n",
    "In jedem Durchgang der Schleife werden Zähler (hier `num`) und Nenner (hier `den`) einzeln berechnet und je einer Variablen zugewiesen.\n",
    "      \n",
    "  </div>       \n",
    "</details>\n",
    "\n",
    "\n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">8. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "     \n",
    "Anschließend wird der Wert des Terms im aktuellen Schleifendurchlauf berechnet, indem die Konstante vor dem Summenzeichen mit dem Bruch hinter dem Summenzeichen multipliziert wird.\n",
    "      \n",
    "  </div>       \n",
    "</details>   \n",
    "   \n",
    "  \n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">9. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "      \n",
    "Dieser Wert wird in jedem Schleifendurchlauf auf das Gesamtergebnis hinzuaddiert.\n",
    "      \n",
    "  </div>       \n",
    "</details>  \n",
    "  \n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">10. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "      \n",
    "Danach wird geprüft, ob die Abbruchbedingung erfüllt ist.\n",
    "      \n",
    "  </div>       \n",
    "</details>\n",
    "\n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-primary\">11. Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "     \n",
    "Da diese Formel 1/$\\pi$ berechnet, muss 1/ergebnis gerechnet werden um $\\pi$ zu erhalten. \n",
    "      \n",
    "  </div>       \n",
    "</details>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
schwabmi's avatar
schwabmi committed
   "source": [
    "# Implementieren Sie hier die Funktion estimate_pi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Spoiler Alert](https://imgs.xkcd.com/comics/spoiler_alert.png)\n",
schwabmi's avatar
schwabmi committed
    "\n",
    "([Spoiler Alert](https://xkcd.com/109/), Randall Munroe) [Erklärung des Comics](https://www.explainxkcd.com/wiki/index.php/109:_Spoiler_Alert) falls Sie mehr erfahren wollen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "def fakultaet(n):\n",
    "    if not isinstance(n, int):\n",
    "        print('Die Fakultät ist nur für ganze Zahlen definiert.')\n",
    "        return None\n",
    "    elif n < 0:\n",
    "        print('Die Fakultät für negative ganze Zahlen ist nicht definiert.')\n",
    "        return None\n",
    "    elif n == 0:\n",
    "        return 1\n",
    "    else:\n",
    "        return n * fakultaet(n-1)\n",
    "\n",
    "def estimate_pi():\n",
    "    faktor = 2 * math.sqrt(2) / 9801 \n",
    "    ergebnis = 0\n",
    "    k = 0\n",
    "    while True:\n",
    "        num = fakultaet(4*k) * (1103 + 26390*k)\n",
    "        den = fakultaet(k)**4 * 396**(4*k)\n",
    "        term = faktor * num / den\n",
    "        ergebnis= ergebnis + term\n",
    "        if abs(term) < 1e-15:\n",
    "            break\n",
    "        k =k + 1\n",
    "        \n",
    "    fast_pi= 1/ ergebnis\n",
    "    return fast_pi\n",
    "print(estimate_pi())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Speichern](https://amor.cms.hu-berlin.de/~jaeschkr/teaching/spp/floppy.png) Speichern Sie dieses Notebook, so dass Ihre Änderungen nicht verlorengehen (nicht auf einem Pool-Rechner). Klicken Sie dazu oben links auf das Disketten-Icon und nutzen Sie beispielsweise einen USB-Stick, E-Mail, Google Drive, Dropbox oder Ihre [HU-Box](https://box.hu-berlin.de/).  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Smiley](https://upload.wikimedia.org/wikipedia/commons/5/57/Face-wink.svg)\n",
    "Herzlichen Glückwunsch! Sie haben das 7. Kapitel geschafft. Weiter geht es in [8: Zeichenketten](seminar08.ipynb)."
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}