{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "anaconda-cloud": {}, "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" }, "name": "linalg.ipynb", "colab": { "name": "kl_py_magasabb_szint.ipynb", "provenance": [], "collapsed_sections": [], "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "XqR9tfxma5bP", "colab_type": "text" }, "source": [ "# Magasabb rendű probléma elemzések scipy használata ...\n", "\n", "Az alábbi notebookban megismerkedünk két témával, melyek annak ellenére, hogy magukban is fontos jelentőséggel bírnak, kulcsfontosságú szerepet töltenek be más problémák numerikus megoldásában.\n", "\n", "A numerikus integrálás témakörében megvizsgálunk néhány egyszerű integrált a `scipy` csomag `quad` függvényével. \n", "\n", "A második kérdéskör, a differenciálegyenletek megoldása számos fizikai probléma vizsgálatában nyújthat segítséget. \n", "\n", "Gondoljunk csak arra, hogy a klasszikus mechanika [Newton törvényei](https://hu.wikipedia.org/wiki/Newton_t%C3%B6rv%C3%A9nyei), az elektrodinamika [Maxwell-egyenletei](https://hu.wikipedia.org/wiki/Maxwell-egyenletek), a kvantummechanika [Schrödinger-egyenlete](https://hu.wikipedia.org/wiki/Schr%C3%B6dinger-egyenlet), illetve az általános relativitáselmélet [Einstein-egyenletei](https://hu.wikipedia.org/wiki/%C3%81ltal%C3%A1nos_relativit%C3%A1selm%C3%A9let#Az_elm.C3.A9let_l.C3.A9nyege) \n" ] }, { "cell_type": "markdown", "metadata": { "id": "aQHHp7yEa5bR", "colab_type": "text" }, "source": [ "# Numerikus integrálás\n", "\n", "Sok gyakorlati alkalmazásban előkerül egy fügvény integráljának, azaz a függvény görbéje alatti területnek a meghatározása. Sok analitikus függvény integrálját zárt alakban meg lehet határozni. A gyakorlatban viszont sokszor nem ismert a függvény analitikus alakja. Gondoljunk itt például egy zajos mérésre. Ilyen esetben a függvény integrálját a rendelkezésre áló mérési pontok $x_0,x_1,x_2,…x_j,…$ és mért értékek $f_0,f_1,f_2,…f_j,…$ alapján kell valahogy meghatároznunk. Ekkor az integrál értékét rendszerint egy véges összegzéssel határozhatjuk meg, ahol az összeadandó értékek a mérési pontok és a mért mennyiségek valamilyen függvényei. Az alábbiakban a `scipy` csomag `quad` függvényével fogunk megismerkedni, mely függvények numerikus integrálására alkalmas. " ] }, { "cell_type": "markdown", "metadata": { "id": "mFMYj2mOa5bS", "colab_type": "text" }, "source": [ "## 1D integrál" ] }, { "cell_type": "code", "metadata": { "id": "Y-ltxfxia5bT", "colab_type": "code", "colab": {}, "outputId": "f8a99ccc-59ed-4eaf-e30d-5d8aaa937ef3" }, "source": [ "# a szokásos rutinok betöltése\n", "%pylab inline\n", "from scipy.integrate import * # az integráló rutinok betöltése" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "BgwHXBQga5bX", "colab_type": "text" }, "source": [ "Vizsgáljuk meg az alábbi egyszerű integrált $$ \\int_{-1}^1 (x^2+3x +2)\\mathrm{d}x .$$ \n", "Ennek az értéke némi [algebrával](http://www.wolframalpha.com/input/?i=%5Cint_%7B-1%7D%5E1+%28x%5E2%2B3x+%2B2%29) $14/3\\approx 4.66666$ Vajon ugyen ezt kapjuk-e a `quad` fügvénnyel ?" ] }, { "cell_type": "markdown", "metadata": { "id": "J0sDdQy4a5bX", "colab_type": "text" }, "source": [ "Először definiáljuk az integrálandó függvényt." ] }, { "cell_type": "code", "metadata": { "id": "0qz12KHZa5bY", "colab_type": "code", "colab": {} }, "source": [ "def f(x):\n", " return (x**2+3*x+2)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "QqsY3brfa5ba", "colab_type": "text" }, "source": [ "Most már meghívhatjuk a `quad`-ot. Az első változó az integrálandó függvény, a második és a harmadik pedig az integrálási határok. A kimenet két szám. Az első az integrál becsült értéke, a második az algoritmus becsült hibája." ] }, { "cell_type": "code", "metadata": { "id": "K7yiGBTsa5ba", "colab_type": "code", "colab": {}, "outputId": "1a3b1938-51f3-4521-ab8b-5f34f66ef0ef" }, "source": [ "quad(f,-1,1)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(4.666666666666666, 5.1810407815840634e-14)" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "markdown", "metadata": { "id": "QBxxRjnRa5bc", "colab_type": "text" }, "source": [ "Amint az eredmény is mutatja, ez az analitikus számítás és a numerikus integrál megegyeznek. \n", "\n", "Előfordulhat, hogy az integrálási határok végtelenek. Például vizsgáljuk meg a Gauss-görbe alatti területet:\n", "$$ \\int_{-\\infty}^\\infty \\mathrm{e}^{-x^2}\\mathrm{d}x =\\sqrt{\\pi}$$\n", "\n" ] }, { "cell_type": "code", "metadata": { "id": "p-vb199Fa5bd", "colab_type": "code", "colab": {} }, "source": [ "# az integrandus definiálása\n", "def gauss(x):\n", " return exp(-x**2)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "s6emhks_a5bf", "colab_type": "text" }, "source": [ "A `quad` függvénynek a végtelen integrálási határokat az `inf` jelöléssel adhatjuk meg." ] }, { "cell_type": "code", "metadata": { "id": "o0VwnHgGa5bf", "colab_type": "code", "colab": {}, "outputId": "a260c945-491f-475e-b9fb-49f6144eb9d8" }, "source": [ "quad(gauss,-inf,inf)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1.7724538509055159, 1.4202636781830878e-08)" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "code", "metadata": { "id": "AVkqvHk6a5bh", "colab_type": "code", "colab": {}, "outputId": "d04aa121-f4f5-43f4-ecff-decc564100bd" }, "source": [ "sqrt(pi)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1.7724538509055159" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "TaN-SmBXa5bj", "colab_type": "text" }, "source": [ "A fent vizsgált két példával különösebb gond nélkül meg tudott birkózni a `quad`. Előfordul azonban, hogy az integrálás problémákba ütközik. Erre egy jó példa, ha az integrandus szingulárissá válik a integrálási tartomány egy pontjában. Ez nem feltétlenül jelenti azt, hogy az integrál nem létezik! Az ilyen pontokra külön felhívhatjuk a `quad` függvény figyelmét a `points` kulcsszó segítségével.\n", "\n", "Vizsgáljuk meg a $$h(x)=\\sqrt[3]{\\frac{1}{(x-1)^2}}$$ függvényt mely a $x=1$ esetén divergál:" ] }, { "cell_type": "code", "metadata": { "id": "EB1vxTgPa5bk", "colab_type": "code", "colab": {} }, "source": [ "def h(x):\n", " return ((x-1.0)**(-2))**(1.0/3.0)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Yuep8rGta5bo", "colab_type": "code", "colab": {}, "outputId": "710373be-2f8a-4829-8240-18fa9e49f212" }, "source": [ "quad(h,0,2)" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "ZeroDivisionError", "evalue": "0.0 cannot be raised to a negative power", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mquad\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mh\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\scipy\\integrate\\quadpack.py\u001b[0m in \u001b[0;36mquad\u001b[1;34m(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)\u001b[0m\n\u001b[0;32m 339\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mweight\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 340\u001b[0m retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit,\n\u001b[1;32m--> 341\u001b[1;33m points)\n\u001b[0m\u001b[0;32m 342\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 343\u001b[0m retval = _quad_weight(func, a, b, args, full_output, epsabs, epsrel,\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\scipy\\integrate\\quadpack.py\u001b[0m in \u001b[0;36m_quad\u001b[1;34m(func, a, b, args, full_output, epsabs, epsrel, limit, points)\u001b[0m\n\u001b[0;32m 446\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mpoints\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 447\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0minfbounds\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 448\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_quadpack\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_qagse\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfull_output\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mepsabs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mepsrel\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlimit\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 449\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 450\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0m_quadpack\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_qagie\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mbound\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0minfbounds\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfull_output\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mepsabs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mepsrel\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlimit\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m\u001b[0m in \u001b[0;36mh\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mh\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m3.0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mZeroDivisionError\u001b[0m: 0.0 cannot be raised to a negative power" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "PNbXBnuia5bq", "colab_type": "text" }, "source": [ "A `quad` bizony nehézségekbe ütközik, ha a 0 reciprokát kell vennie! Specifikáljuk most az $x=1$-et mint problémás pontot:" ] }, { "cell_type": "code", "metadata": { "id": "dKUZ2QEua5br", "colab_type": "code", "colab": {}, "outputId": "f5dbc1b5-d6a1-4920-9ef3-a3cc50732ceb" }, "source": [ "quad(h,0,2,points=[1.0])" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(6.000000000001058, 4.787281682183675e-12)" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "tTyxL3Hva5bt", "colab_type": "text" }, "source": [ "Így az integrál már szépen elvégezhető." ] }, { "cell_type": "markdown", "metadata": { "id": "GSNHUPX9a5bt", "colab_type": "text" }, "source": [ "## 2D integrál\n", "\n", "A `quad` függvény kétdimenziós változata a `dblquad`. Nézzünk két egyszerű példát kétdimenziós integrálra is!" ] }, { "cell_type": "markdown", "metadata": { "id": "j1umTAC7a5bu", "colab_type": "text" }, "source": [ "Integráljuk a $$ \\cos(x) e^{-(x^2+y^2)} $$ függvényt az alábbi két integrálási tartományon:\n", "- egy origó központú egységnyi hosszú négyzeten \n", "- az origó központú egység körlapon!" ] }, { "cell_type": "code", "metadata": { "id": "EdS4OVZ1a5bv", "colab_type": "code", "colab": {} }, "source": [ "# Az integrandus definiálása\n", "def func(x,y):\n", " return cos(x)*exp(-x**2-y**2)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "WvxCEyGra5bx", "colab_type": "text" }, "source": [ "A `dblquad` első paramétere megint az integrálandó függvény. A második és harmadik bemenő paraméter az integrandusfüggvény első paraméterének határait adja meg. A negyedik és ötödik bemenő paraméter az első integrálási változó függvényeként kifejezve a második integrálási változó határai. A legegyszerűbb esetben ezek valamilyen konstansfüggvények. \n", "Az első integrálási tartomány tehát így számítható :" ] }, { "cell_type": "code", "metadata": { "id": "nYkTHAPoa5by", "colab_type": "code", "colab": {}, "outputId": "d6a0c54d-02ae-4faa-9cc8-d8150081559b" }, "source": [ "dblquad(func, -1/2, 1/2, lambda x:-1/2, lambda x:1/2)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(0.8183636555228812, 9.085661728779128e-15)" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "markdown", "metadata": { "id": "cNyPO3mxa5b0", "colab_type": "text" }, "source": [ "A második integrálási tartományban az $x$ változó függvényében kell paraméterezni az $y$ változó szélső értékeit. Ha az integrálási tartomány az egység sugarú körlap, akkor az alsó határt a $y(x)=-\\sqrt{1-x^2}$, a felső határt pedig a $y(x)=\\sqrt{1-x^2}$ adja:" ] }, { "cell_type": "code", "metadata": { "id": "7XocL_74a5b0", "colab_type": "code", "colab": {}, "outputId": "f762d8ec-72de-498f-8095-8cd4dbd0b7c9" }, "source": [ "dblquad(func,-1,1,lambda x:-sqrt(1-x**2),lambda x:sqrt(1-x**2))" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1.7860608962993605, 2.211336003199449e-09)" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "1wHkmGUva5b3", "colab_type": "text" }, "source": [ "# Differenciálegyenletek" ] }, { "cell_type": "markdown", "metadata": { "id": "NK5N2j0sa5b3", "colab_type": "text" }, "source": [ "Amint azt a bevezetőben is említettük, a fizikai törvények jelentős része a differenciálegyenletek nyelvén van megfogalmazva. \n", "Az alábbiakban megismerkedünk az `odeint` rutinnal amely differenciálegyenletek numerikus megoldását tesz lehetővé. " ] }, { "cell_type": "code", "metadata": { "id": "ZqRIWMk0a5b4", "colab_type": "code", "colab": {} }, "source": [ "from scipy.integrate import * # ez kell a diffegyenletekhez is!!" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "yfqT02gBa5b6", "colab_type": "text" }, "source": [ "Egy egyenletet differenciálegyenletnek hívunk, ha a meghatározandó függvény deriváltjai szerepelnek benne. Egy egyszerű differenciálegyenletre jutunk például, ha megvizsgáljuk egy kondenzátor töltésének időbeli válltozását! \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "2-imNZkva5b7", "colab_type": "text" }, "source": [ "A kondenzátoron felhalmozott $Q$ töltés meghatározására induljunk ki a Kirchhoff-féle huroktörvényből, amit a fenti ábrán látható áramkörre írtunk fel:\n", "$$ \\varepsilon= \\underbrace{I R}_{U_R}+ \\underbrace{\\frac{Q}{C}}_{U_C} = \\frac{\\mathrm{d}Q}{\\mathrm{d}t}R+\\frac{Q}{C}$$\n", "\n", "A megoldandó differenciálegyenlet tehát:\n", "\n", "$$ \\frac{\\mathrm{d}Q}{\\mathrm{d}t}= \\frac{\\varepsilon}{R}-\\frac{Q}{RC} $$\n", "\n", "Tegyük fel, hogy a kezdetben üres volt a kondenzátor, tehát $Q(0)=0$, és számoljunk az $\\varepsilon=1\\mathrm{V}$, $R=1\\mathrm{M}\\Omega$ és $C=100nF$ paraméterekkel!" ] }, { "cell_type": "code", "metadata": { "id": "iCc-Jyc0a5b7", "colab_type": "code", "colab": {} }, "source": [ "# Paraméterek definiálása\n", "epsilon=1\n", "R=1.0e6\n", "C=1.0e-7" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "UUmRLEupa5b9", "colab_type": "text" }, "source": [ "Az `odeint` függvény hívásához szükség van a paramétereken kívül a növekményfüggvényre (azaz a fenti egyenlet jobb oldalára), definiáljuk most ezt:" ] }, { "cell_type": "code", "metadata": { "id": "TcAx9rGWa5b_", "colab_type": "code", "colab": {} }, "source": [ "def RCkor(q,t): \n", " return epsilon/R-q/(R*C)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "YfnhhYMta5cC", "colab_type": "text" }, "source": [ "Most már készen vagyunk arra, hogy meghívjuk a differenciál egyenlet megoldó függvényt! Az `odeint` alapvetően három bemenő paramétert vár. Az első a fent definiált növekményfüggvény, a második a meghatározandó függvény kezdeti értéke, a harmadik pedig azon időpontok halmaza, ahol kíváncsiak vagyunk a megoldásra. A függvény visszatérési értéke maga a keresett adatsor." ] }, { "cell_type": "code", "metadata": { "id": "38pVcbtqa5cD", "colab_type": "code", "colab": {}, "outputId": "6868482d-3bc8-45f9-e434-5b4d5fc3d39b" }, "source": [ "t=linspace(0,1,1000) # ezek az érdekes idő pillanatok\n", "q0=0 # A töltés kezdeti értéke\n", "q=odeint(RCkor,q0,t) # itt oldjuk meg a diffegyenletet" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "NameError", "evalue": "name 'epsilon' is not defined", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlinspace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1000\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# ezek az érdekes idő pillanatok\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mq0\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m \u001b[1;31m# A töltés kezdeti értéke\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mq\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0modeint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mRCkor\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mq0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mt\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# itt oldjuk meg a diffegyenletet\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\scipy\\integrate\\odepack.py\u001b[0m in \u001b[0;36modeint\u001b[1;34m(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg, tfirst)\u001b[0m\n\u001b[0;32m 242\u001b[0m \u001b[0mfull_output\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrtol\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0matol\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtcrit\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mh0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhmax\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhmin\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 243\u001b[0m \u001b[0mixpr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmxstep\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmxhnil\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmxordn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmxords\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 244\u001b[1;33m int(bool(tfirst)))\n\u001b[0m\u001b[0;32m 245\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0moutput\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m<\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[0mwarning_msg\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_msgs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0moutput\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m\" Run with full_output = 1 to get quantitative information.\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m\u001b[0m in \u001b[0;36mRCkor\u001b[1;34m(q, t)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mRCkor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mq\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mepsilon\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mR\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mq\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mR\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mC\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mNameError\u001b[0m: name 'epsilon' is not defined" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "lQQiSJpka5cF", "colab_type": "text" }, "source": [ "Most már csak ábrázolni kell!" ] }, { "cell_type": "code", "metadata": { "id": "0OxJnzlFa5cF", "colab_type": "code", "colab": {}, "outputId": "6964b800-c02b-493c-cea3-ccc5aff1bbf3" }, "source": [ "plot(t,q/C,lw=3)\n", "xlabel(r'$t$[s]',fontsize=20)\n", "ylabel(r'$Q/C$[V]',fontsize=20)\n", "grid()" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "NameError", "evalue": "name 't' is not defined", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mt\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mq\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlw\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mxlabel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mr'$t$[s]'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfontsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mylabel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mr'$Q/C$[V]'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfontsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mgrid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 't' is not defined" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "axkI6Ox6a5cH", "colab_type": "text" }, "source": [ "Vizsgáljunk meg egy másik példát ! Legyen ez egy rugóval rögzített test, mely egy vonal mentén súrlódás nélkül tud mozogni.\n", "\n", "\n", "Ennek a mozgásnak az egyenlete Newton szerint, \n", "\n", "$$m\\frac{\\mathrm{d}^2x}{\\mathrm{d}t^2}(t)=-kx(t)$$\n", "\n", "Írjuk át ezt az időben másodrendű differenciálegyenletet két időben elsőrendű differenciálegyenletre! \n", "\n", "$$\\frac{\\mathrm{d}x}{\\mathrm{d}t}(t)=v(t)$$\n", "\n", "$$m \\frac{\\mathrm{d}v}{\\mathrm{d}t}(t)=-k x(t)$$\n", "\n", "\n", "Általában minden magasabb rendű differenciálegyenlet rendje hasonló módon csökkenthető. Azaz a legáltalánosabb esetben is új ismeretlen függvények bevezetésével elsőrendű differenciálegyenlet-rendszer megoldására tudjuk redukálni a problémánkat!\n", "\n", "Vizsgáljuk meg azt az esetet, ha $m=k=1$ !\n", "Most a növekményfüggvényünk egy kételemű vektort kell, hogy kezeljen!" ] }, { "cell_type": "code", "metadata": { "id": "tzTn4Wh7a5cI", "colab_type": "code", "colab": {} }, "source": [ "def f(u, t):\n", " x=u[0] # az u első komponense a kitérés\n", " v=u[1] # az u második komponense a sebesség\n", " \n", " return [v,-x] # ez maga a növekmény kiértékelése " ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "oJrhkqA3a5cK", "colab_type": "text" }, "source": [ "Oldjuk meg az egyenleteket úgy, hogy kezdetben a kitérés 1, a kezdősebesség pedig nulla!" ] }, { "cell_type": "code", "metadata": { "id": "XiMV9Ijea5cL", "colab_type": "code", "colab": {} }, "source": [ "t=linspace(0,20,1000); # az idő intervallum\n", "u0 = [1,0] # kezdeti érték x-re és v-re\n", "u=odeint(f,u0,t) # itt történik a diffegyenlet megoldása" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "wWLCVFwIa5cM", "colab_type": "code", "colab": {}, "outputId": "a3cef586-ce20-456f-b321-ea74cc1489a0" }, "source": [ "plot(t,u[:,0],label=r'$x(t)$ pozicio')\n", "plot(t,u[:,1],label=r'$v(t)$ sebesseg')\n", "legend(fontsize=20)\n", "xlabel(r'$t$[s]',fontsize=20)\n", "grid()" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nKm8t30q7lHZc8xV/u97ccQcUFnqfl1FdDc88Az/6ka9izOdUNa6+XJViY1PZJu2/vL/W1dU1m/bQ\n8UN60eMX6aHjh3yXU1Wl2rGj6oED3tIPGaL67LO+i0lK7/7rXe08t7MeO3Gs2bQnT53UjCcztKi8\nyHc5dXWqWVmqmzd7S3/nnapz5vguJilVf1at3Rd019LKUk/pbyq4SXPfzI2orAkTVBcu9JZ2yRLV\n0aMjKibphOKmr1ibtE/+ACMyRvDxiY89LSS24M8LmJg1kfTz032X06ED3HorzJ/ffNpt21wf5bhx\nvotJSr069mLoV4ey/K3lzaYt+GvB6Q+K/RKBn/wEfvWr5p/+Kyvdh/j2ROmc2/5c7vnmPczdNrfZ\ntCWVJbxx4A2mZEfWp/nAAzBvnptA2ZTaWli4EH7844iKMRDdkz8wDvgrcAq4qol0w4G9wN+A2c2c\nM6Z3xILSAu23rJ+eqjsVNk3FxxXa8fGO+l7VexGXc/CgaqdOquXl4dPU1alefbVqXl7ExfiyZcuW\n1ikoSqWVpZo+L12Pfno0bJqa2hrNeDJDN/+/x0f3RtTWqvbpo/rKK02nmz5dddashscTpT1bQtWn\nVZo+L11LDpY0mW7k2pG6YNsCT+cM157jx6s+9ljTeRctUh02zP1Nmcie/KMN/plABvBauOCP+1xh\nH9ATaA/sAPo2cc6YNkpdXZ0OXDFQF29fHDbN2HVj9aFXH4q6rIcfVh0xIvwFmZenmp2teir8fSim\nnnjiidYpKAamvjBVZ2yaEfb1X279pY56dlTU5WzcqJqRofrJJ42//uabql27qh450vC1RGrPlrB4\n+2Id8pshYR+knt/zvGY+lak1tTWezheuPffuVe3SRfUf/2g83wcfuN/R2297KiYQIgn+UXX7qGqZ\nqv4daGrb8W8Af1fV/apaCxQArTYRW0TIG53HnC1zKK0sbfD68reWs/vwbh689sGoy5o9Gyoq4Kmn\nGr5WVgb33edGkLTW+iNVsd4duwXNv2E+L+97udFx/0X7i1hUvIin/ruRhvVp1Cjo3x9mzmzY/XP0\nqBt+m5sLnTo1zJtI7dkSpvWbBsAjf3qkwWv7q/Yz46UZLBu5jLR23mZbhWvPzEy491430qqm5szX\namvhtttg2jTIzvZVfXOW1ghDlwDv1/v5QOhYq+nbpS+5I3IZvmb46c0PVJWn33qaOVvmsDFno6dJ\n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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] } ] }