Skip to content
Snippets Groups Projects
seminar07.ipynb 49.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • schwabmi's avatar
    schwabmi committed
        "<details>\n",
        "    <summary type=\"button\" class=\"btn btn-primary\">2. Hinweis</summary>\n",
        "  <div class=\"alert alert-info\" role=\"alert\">\n",
        "      \n",
        "Wie Sie sehen können wird in der Formel zweimal eine Fakultät berechnet. Dafür können Sie die Funktion, die Sie in Seminar 6 geschrieben haben, verwenden.\n",
        "      \n",
        "  </div>       \n",
        "</details>  \n",
        "  \n",
        "<details>\n",
        "    <summary type=\"button\" class=\"btn btn-primary\">3. Hinweis</summary>\n",
        "  <div class=\"alert alert-info\" role=\"alert\">\n",
        "      \n",
        "Berechnen Sie zuerst die Konstante vor dem Summenzeichen und speichern Sie den Wert in einer Variablen. In unserer Lösung wird diese Variable `faktor` genannt.\n",
        "      \n",
        "  </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
    }