{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "

1  積分(int)
1.1  単純な積分(int)
1.2  Integralいろいろ
1.2.1  部分積分(integration by parts)
1.3  置換(change of variables)による積分
1.3.0.1  部分分数(partial fraction)展開による積分
1.4  課題
1.4.1  不定積分
1.4.2  定積分:次の定積分を求めよ.
1.4.3  (発展課題,重積分)次の2重積分を求めよ.
1.4.4  解答例
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "
\n", "積分(integral)\n", "
\n", "
\n", "
\n", "file:/~/python/doing_math_with_python/differential.ipynb\n", "
\n", "cc by Shigeto R. Nishitani 2017 \n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 積分(int)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 単純な積分(int) \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "単純な不定積分.\n", "$$\n", "\\int \\ln x\\, dx = x \\ln x -x\n", "$$" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x*log(x) - x" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import *\n", "x,y = symbols('x y')\n", "\n", "integrate(ln(x),x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "定積分を実行するには,積分変数の範囲を指定する.\n", "$$\n", "\\int_{-\\pi}^0 \\sin x \\, dx = -2\n", "$$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(sin(x),(x,-pi,0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "特異点をもつ場合にも適切に積分結果を求めてくれ...\n", "\n", "$$\n", "\\int_0^2 \\frac{1}{\\sqrt{x(2-x)}} dx = \\pi\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Integral(1/sqrt(x*(-x + 2)), (x, 0, 2))" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(1/sqrt(x*(2-x)),(x,0,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "だめみたいですね.どこで引っかかっているかは不明.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "無限区間(infinity)における定積分は計算してくれる.\n", "$$\n", "\\int_{-\\infty}^{\\infty} \\frac{1}{x^2+4} dx = \\frac{\\pi}{2}\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pi/2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(1/(x**2+4),(x, -oo, oo))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "部分積分法や置換積分法を用いる必要のある複雑な積分も一発で求まる.\n", "$$\n", "{\\rm eq}\\, = \\, \\sqrt{4-{x}^{2}} \\notag \\\\\n", "\\int {\\rm eq}\\, dx = \\frac{1}{2}\\,x \\sqrt{4-{x}^{2}}+2\\,\\arcsin \\left( 1/2\\,x \\right) \\notag\n", "$$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x*sqrt(-x**2 + 4)/2 + 2*asin(x/2)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq=sqrt(4-x**2)\n", "integrate(eq,x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "数学の公式集を見ないとわからないような積分も同じコマンドで求まる.\n", "$$\n", "{\\rm eq2}\\, = \\,\\exp({-{x}^{2}}) \\notag \\\\\n", "\\int_0^{zz} {\\rm eq}\\, dx = \\frac{1}{2}\\, \\sqrt{\\pi }\\, \\mbox{erf} \\left(zz\\right) \\notag\n", "$$" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sqrt(pi)*erf(zz)/2" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zz = symbols('zz')\n", "eq2=exp(-x**2)\n", "integrate(eq2, (x,0,zz))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Integralいろいろ" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ちょっとぐらい難しい積分も,sympyは単純にintegrateコマンドだけで実行してくれます.\n", "しかし,時には,途中の計算法である部分積分,置換積分,部分分数展開が必要になかもしれません.\n", "これらはIntegralというパッケージに幾つか用意されているようです.詳しくは[サイト](http://docs.sympy.org/latest/modules/integrals/integrals.html)を参照してください.\n", "\n", "残念ながら部分積分(integration by parts)の途中を見るコマンドはなさそう." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 部分積分(integration by parts) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\int x \\exp(x)\\, dx = x\\exp(x)-\\int \\exp(x)\\, {dx}\n", "$$\n", "\n", "mapleでは,\n", "```maple\n", "> intparts(Int(x*exp(x),x),x);\n", "```\n", "\n", "sympyでは,こいつはなさそう." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 置換(change of variables)による積分 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "コマンドtransformを使う.\n", "$$\n", "\\int \\left( \\cos \\left( x \\right) +1 \\right) ^{3}\\sin \\left( x \\right) {dx} \\notag\n", "$$\n", "これを$cos(x)+1=u$として置換すると.\n", "$$\n", "\\int-{u}^{3}{du}\n", "$$\n", "となる.\n", "\n", "```maple\n", "> Int((cos(x)+1)^3*sin(x), x);\n", "> changevar(cos(x)+1=u, Int((cos(x)+1)^3*sin(x), x=a..b), u);\n", "> changevar(cos(x)+1=u, int((cos(x)+1)^3*sin(x), x), u);\n", "```\n", "$$\n", "\\int \\left( \\cos \\left( x \\right) +1 \\right) ^{3}\\sin \\left( x \\right) {dx} \\notag \\\\\n", "\\int _{\\cos \\left( a \\right) +1}^{\\cos \\left( b \\right) +1}-{u}^{3}{du} \\notag \\\\\n", "-\\frac{1}{4}\\,{u}^{4} \\notag \\\\\n", "$$\n", "\n" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "⌠ \n", "⎮ 3 \n", "⎮ -u du\n", "⌡ \n" ] } ], "source": [ "a,b,u = symbols('a b u')\n", "\n", "i = Integral((cos(x)+1)**3*sin(x),x)\n", "pprint(i.transform(cos(x)+1,u))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "定積分(x=1..2)を実行すると,以下のようになる.ただし,$-u^3 \\rightarrow u^3$は積分範囲が反対向けになっているのに注意." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cos(1) + 1 \n", " ⌠ \n", " ⎮ 3 \n", " ⎮ u du\n", " ⌡ \n", "cos(2) + 1 \n" ] }, { "data": { "text/plain": [ "-(cos(2) + 1)**4/4 + (cos(1) + 1)**4/4" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "i = Integral((cos(x)+1)**3*sin(x),(x,1,2))\n", "pprint(i.transform(cos(x)+1,u))\n", "integrate(u**3, (u, cos(2) + 1, cos(1) + 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 部分分数(partial fraction)展開による積分 \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "部分分数(partial fraction)展開による積分では,apartコマンドを用いる.\n", "$$\n", "{\\rm pf1}\\, = \\frac{1}{1+x^3} = \\frac{1}{3}\\,{\\frac {-x+2}{{x}^{2}-x+1}}+ \\frac{1}{3\\,\\left( x+1 \\right) } \\notag \\\\\n", "\\int {\\rm pf1} dx = -\\frac{1}{6}\\,\\ln \\left( {x}^{2}-x+1 \\right) +\\frac{1}{3}\\, \\sqrt{3}\\arctan \\left( 1/3\\, \\left( 2\\,x-1 \\right) \\sqrt{3} \\right) +\\frac{1}{3}\\,\\ln \\left( x+1 \\right) \\notag\n", "$$" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " x - 2 1 \n", "- ────────────── + ─────────\n", " ⎛ 2 ⎞ 3⋅(x + 1)\n", " 3⋅⎝x - x + 1⎠ \n", " ⎛2⋅√3⋅x √3⎞\n", " ⎛ 2 ⎞ √3⋅atan⎜────── - ──⎟\n", "log(x + 1) log⎝x - x + 1⎠ ⎝ 3 3 ⎠\n", "────────── - ─────────────── + ────────────────────\n", " 3 6 3 \n" ] } ], "source": [ "eq = 1/(1+x**3)\n", "pprint(apart(eq))\n", "\n", "pprint(integrate(apart(eq),x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 課題" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 不定積分\n", "\n", "次の不定積分を求めよ.\n", "1. $\\int 4\\,x+3{dx}$\n", "1. $ \\int \\frac{1}{ 1+\\mbox{e}^{x} }{dx}$\n", "1. $ \\int \\frac{1}{ \\mbox{e}^{-x}+\\mbox{e}^{x} }{dx}$\n", "1. $ \\int \\sqrt{1-{x}^{2}}{dx}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 定積分:次の定積分を求めよ.\n", "\n", "1. $ \\int _{0}^{\\pi } \\sin x{dx}$\n", "1. $ \\int _{0}^{1} \\arctan x{dx}$\n", "1. $ \\int _{-2}^{2} \\frac{1}{ \\sqrt{4-{x}^{2}} }{dx}$\n", "1. $ \\int _{0}^{1} \\frac{1}{ {x}^{2}+x+1 }{dx}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### (発展課題,重積分)次の2重積分を求めよ.\n", "\n", "$$\n", "\\int \\int_{D} \\sqrt{x^2+y^2}dxdy\\,\\, D:0\\leq y \\leq x \\leq 1\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 解答例" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. \n", "```maple\n", "> int(4*x+3,x);\n", "> int( 1/(1+exp(x)),x);\n", "> int(1/(exp(-x)+exp(x)),x);\n", "> int(sqrt(1-x^2),x);\n", "```\n", "$$\n", "2\\,{x}^{2}+3\\,x \\notag \\\\\n", "-\\ln \\left( 1+ \\mbox{e}^x \\right) +\\ln \\left( \\mbox{e}^x \\right) \\notag \\\\\n", "\\arctan \\left( \\mbox{e}^x \\right) \\notag \\\\\n", "\\frac{1}{2}\\,x \\sqrt{1-{x}^{2}}+\\frac{1}{2}\\,\\arcsin \\left( x \\right) \\notag\n", "$$\n", "\n" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2 \n", "2⋅x + 3⋅x\n", " ⎛ x ⎞\n", "x - log⎝ℯ + 1⎠\n", " 1 \n", "────────\n", " x -x\n", "ℯ + ℯ \n", " ⎛ 2 ⎛ x⎞⎞\n", "RootSum⎝4⋅z + 1, i ↦ i⋅log⎝2⋅i + ℯ ⎠⎠\n", " __________ \n", " ╱ 2 \n", "x⋅╲╱ - x + 1 asin(x)\n", "─────────────── + ───────\n", " 2 2 \n" ] } ], "source": [ "from sympy import *\n", "x = symbols('x')\n", "\n", "pprint(integrate(4*x+3,x))\n", "pprint(integrate(1/(1+exp(x)),x))\n", "pprint(1/(exp(-x)+exp(x)))\n", "pprint(integrate(1/(exp(-x)+exp(x)),x))\n", "pprint(integrate(sqrt(1-x**2),x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. \n", "```maple\n", "> int(sin(x),x=0..Pi);\n", "> int(arctan(x),x=0..1);\n", "> int(1/(sqrt(4-x^(2))),x=-2..2);\n", "> int(1/(x^2+x+1),x=0..1);\n", "```\n", "$$\n", "2 \\notag \\\\\n", "\\frac{1}{4}\\,\\pi -\\frac{1}{2}\\,\\ln \\left( 2 \\right) \\notag \\\\\n", "\\pi \\notag \\\\\n", "\\frac{1}{9}\\,\\pi \\, \\sqrt{3} \\notag\n", "$$" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", " log(2) π\n", "- ────── + ─\n", " 2 4\n", "π\n", "√3⋅π\n", "────\n", " 9 \n" ] } ], "source": [ "pprint(integrate(sin(x),(x,0,pi)))\n", "pprint(integrate(atan(x),(x,0,1)))\n", "pprint(integrate(1/sqrt(4-x**2),(x,-2,2)))\n", "pprint(integrate(1/(x**2+x+1),(x,0,1)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "こいつの表示はまだわからん.\n", "```maple\n", "> with(plots):\n", "> inequal({x-y>=0,x>=0,x<=1,y>=0},x=-0.5..1.5,y=-0.5..1.5,optionsexcluded=(color=white));\n", "```\n", "\n", "![](./figs/Intplot2d1.png)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "f = sqrt(x**2+y**2)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "log(1 + sqrt(2))/6 + sqrt(2)/6" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(integrate(f,(y,0,x)),(x,0,1))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nhVsIITzM/wNp3Q5iPKaY9gAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# example in https://stackoverflow.com/questions/17576508/python-matplotlib-drawing-linear-inequality-functions\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sympy.solvers import solve\n", "from sympy import Symbol\n", "\n", "def f1(x):\n", " return 4.0*x-2.0\n", "def f2(x):\n", " return 0.5*x+2.0\n", "def f3(x):\n", " return -0.3*x+7.0\n", "\n", "x = Symbol('x')\n", "x1, = solve(f1(x)-f2(x))\n", "x2, = solve(f1(x)-f3(x))\n", "x3, = solve(f2(x)-f3(x))\n", "\n", "y1 = f1(x1)\n", "y2 = f1(x2)\n", "y3 = f2(x3)\n", "\n", "plt.plot(x1,f1(x1),'go',markersize=10)\n", "plt.plot(x2,f1(x2),'go',markersize=10)\n", "plt.plot(x3,f2(x3),'go',markersize=10)\n", "\n", "plt.fill([x1,x2,x3,x1],[y1,y2,y3,y1],'red',alpha=0.8)\n", "\n", "xr = np.linspace(0.5,7.5,100)\n", "y1r = f1(xr)\n", "y2r = f2(xr)\n", "y3r = f3(xr)\n", "\n", "plt.plot(xr,y1r,'k--')\n", "plt.plot(xr,y2r,'k--')\n", "plt.plot(xr,y3r,'k--')\n", "\n", "plt.xlim(0.5,7)\n", "plt.ylim(2,8)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "fillplotsというのがあるようだが,python3で動かすとエラーが出る." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "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.6.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "12px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_section_display": "block", "toc_window_display": false, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 2 }