{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2023年度計算機演習A・B\n",
    "\n",
    "# 第4回：数列の極限"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 0. 複合代入演算子（前回までの補足）\n",
    "\n",
    "Pythonでは、変数に対して計算を行った結果を元の変数に代入する際に、複合代入演算子を用いて簡潔な書き方をすることができます。これはC言語などの多くのプログラミング言語に共通するものであり、覚えておくと便利です。\n",
    "\n",
    "| 通常の書き方 | 複合代入演算子を用いた書き方 |\n",
    "| :---: | :---: |\n",
    "| x = x+a | x += a |\n",
    "| x = x-a | x -= a |\n",
    "| x = x\\*a | x \\*= a |\n",
    "| x = x/a | x /= a |"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = 1\n",
    "print(x)\n",
    "\n",
    "x += 2\n",
    "print(x)\n",
    "\n",
    "x -= 2\n",
    "print(x)\n",
    "\n",
    "x *= 2\n",
    "print(x)\n",
    "\n",
    "x /= 2\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ただし、1を加算するインクリメント演算子`++`と1を減算するデクリメント演算子`--`は、Pythonでは使用できません。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. グラフの描画\n",
    "\n",
    "### 1.1. グラフの描画の基本\n",
    "\n",
    "Pythonでグラフを描画する際には、matplotlibというライブラリの中のpyplotというライブラリを使用します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "import文でasを使うと、ライブラリに別名（省略名）を付けることができます。matplotlib.pyplotの場合は、慣例的に別名としてpltを使います。\n",
    "\n",
    "次のコードのように、plot関数を使うと折れ線グラフを描画することができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x = [1,2,3,4,5]        #x座標が格納されたリストと\n",
    "y1 = [30,10,50,20,40]  #y座標が格納されたリストを用意しておく\n",
    "y2 = [20,30,20,30,20]\n",
    "\n",
    "plt.plot(x,y1)  #2つのリストの各要素の組を点として結び、折れ線グラフを描画する\n",
    "plt.plot(x,y2)\n",
    "\n",
    "plt.show()  #グラフを表示する（Notebookの場合、無くてもグラフの表示はされる）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2. グラフのスタイル、装飾\n",
    "\n",
    "plot関数の3つ目の引数では、色、マーカーのスタイル、線のスタイルを指定可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x = [1,2,3,4,5]\n",
    "y1 = [30,10,50,20,40]\n",
    "y2 = [20,30,20,30,20]\n",
    "y3 = [35,35,35,35,35]\n",
    "\n",
    "plt.plot(x,y1,\"ro-\")   #色は赤、マーカーは丸、線は実線\n",
    "plt.plot(x,y2,\"gd--\")  #色は緑、マーカーはダイヤモンド、線は破線\n",
    "plt.plot(x,y3,\"bv:\")   #色は青、マーカーは下三角、線は点線\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "また、次のコードのように、グラフに様々な装飾を施すことができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x = [1,2,3,4,5]\n",
    "y1 = [30,10,50,20,40]\n",
    "y2 = [20,30,20,30,20]\n",
    "y3 = [35,35,35,35,35]\n",
    "\n",
    "plt.plot(x,y1,\"ro-\")\n",
    "plt.plot(x,y2,\"gd--\")\n",
    "plt.plot(x,y3,\"bv:\")\n",
    "\n",
    "plt.grid()  #グリッド線を引く\n",
    "plt.title(\"Graph Title\")  #グラフタイトルを設定する（全角文字は使用不可）\n",
    "plt.legend([\"a\",\"b\",\"c\"])  #凡例を設定する（全角文字は使用不可）\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 数列の収束・発散\n",
    "\n",
    "### 2.1. 定義\n",
    "\n",
    "ご存知のように、数列は収束する数列と発散する数列に分けられます。さらに、発散する数列は正の無限大に発散する数列、負の無限大に発散する数列、振動する数列に分けられます。\n",
    "\n",
    "数学的な定義は、次の通りです。\n",
    "\n",
    "- 数列 $\\{a_n\\}$ が実数 $\\alpha$ に収束する $\\overset{\\mathrm{def}}{\\iff}$ 任意の $\\varepsilon>0$ に対してある自然数 $N$ が存在し、任意の自然数 $n\\geq N$ に対して $|a_n-\\alpha|<\\varepsilon$ が成り立つ。\n",
    "\n",
    "- 数列 $\\{a_n\\}$ が正の無限大に発散する $\\overset{\\mathrm{def}}{\\iff}$ 任意の $K>0$ に対してある自然数 $N$ が存在し、任意の自然数 $n\\geq N$ に対して $a_n>K$ が成り立つ。\n",
    "\n",
    "- 数列 $\\{a_n\\}$ が負の無限大に発散する $\\overset{\\mathrm{def}}{\\iff}$ 任意の $K<0$ に対してある自然数 $N$ が存在し、任意の自然数 $n\\geq N$ に対して $a_n<K$ が成り立つ。\n",
    "\n",
    "- 数列 $\\{a_n\\}$ が振動する $\\overset{\\mathrm{def}}{\\iff}$ $\\{a_n\\}$ がどの実数にも収束しない、かつ、正の無限大にも負の無限大にも発散しない。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2. 数列のグラフの描画\n",
    "\n",
    "以下では、数列のグラフをプログラムで描画することによって、収束・発散の様子を確認します。\n",
    "\n",
    "次の式で定まる数列 $\\{a_n\\}$ と $\\{b_n\\}$ に対して、第1項から第50項までを用いてグラフを描画してみます。\n",
    "\n",
    "$$\n",
    "a_n=\\left(1+\\frac{1}{n}\\right)^n, \\quad b_n=\\left(1+\\frac{1}{n}\\right)^{n+1}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "n_list = range(1,51)  #1～50の整数のリスト（正確にはlist型ではなくrange型）\n",
    "a_list = []\n",
    "b_list = []\n",
    "for n in n_list:\n",
    "    a_list.append((1+1/n)**n)      #a_nの各項をリストに追加する\n",
    "    b_list.append((1+1/n)**(n+1))  #b_nの各項をリストに追加する\n",
    "\n",
    "plt.plot(n_list,a_list,\".-\")  #a_nのグラフを描画する\n",
    "plt.plot(n_list,b_list,\".-\")  #b_nのグラフを描画する\n",
    "\n",
    "plt.grid()\n",
    "plt.legend([\"$a_n$\",\"$b_n$\"])  #凡例として、LaTeXの数式の記法が使える\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数列 $\\{a_n\\}$ と $\\{b_n\\}$ はどちらもネイピア数 $e=2.71828\\ldots$ に収束することが数式から分かりますが、グラフでもその様子が観察できます。また、$\\{a_n\\}$ は単調増加、$\\{b_n\\}$ は単調減少な数列であることが確認できます。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1\n",
    "\n",
    "収束する数列、正の無限大（または負の無限大）に発散する数列、振動する数列をそれぞれ一つ考え、第1項から第50項までを用いてグラフを描画してください。ただし、考えた数列の説明（定義式）も書くこと。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（Markdownとして、考えた数列の説明（定義式）を書く）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#演習1のコード\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "n_list = range(1,51)\n",
    "\n",
    "#ここに、コードを書いてください"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 級数の収束・発散\n",
    "\n",
    "### 3.1. 定義\n",
    "\n",
    "数列の無限個の項の和のことを、級数（無限級数）といいます。数列 $\\{a_n\\}$ に対しては、級数 $\\sum_{n=1}^{\\infty}a_n$ を考えることができます。\n",
    "\n",
    "級数を定める数列の第1項から第 $n$ 項までの和、すなわち $S_n=\\sum_{k=1}^{n}a_k$ を第 $n$ 部分和といいます。級数の収束・発散の定義は、次の通りです。\n",
    "\n",
    "- 級数 $\\sum_{n=1}^{\\infty}a_n$ が実数 $\\beta$ に収束する $\\overset{\\mathrm{def}}{\\iff}$ 部分和の数列 $\\{S_n\\}$ が $\\beta$ に収束する。\n",
    "\n",
    "- 級数 $\\sum_{n=1}^{\\infty}a_n$ が発散する $\\overset{\\mathrm{def}}{\\iff}$ 部分和の数列 $\\{S_n\\}$ が発散する。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2. 級数のグラフの描画\n",
    "\n",
    "以下では、級数のグラフ（正確には級数の部分和の数列のグラフ）をプログラムで描画することによって、収束・発散の様子を確認します。\n",
    "\n",
    "次の式で定まる数列 $\\{a_n\\}$ に対して、級数 $\\sum_{n=1}^{\\infty}a_n$ の部分和の数列 $\\{S_n\\}$ の第1項から第50項までを用いてグラフを描画してみます。\n",
    "\n",
    "$$\n",
    "a_n=\\left(\\frac{1}{3}\\right)^n\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "n_list = range(1,51)\n",
    "a_list = []\n",
    "S_list = []\n",
    "\n",
    "for n in n_list:\n",
    "    a_list.append((1/3)**n)  #a_nの各項をリストに追加する\n",
    "\n",
    "S = 0\n",
    "for a in a_list:\n",
    "    S = S+a\n",
    "    S_list.append(S)  #S_nの各項をリストに追加する\n",
    "\n",
    "plt.plot(n_list,S_list,\".-\")  #S_nのグラフを描画する\n",
    "\n",
    "plt.grid()\n",
    "plt.legend([\"$S_n$\"])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "級数 $\\sum_{n=1}^{\\infty}\\left(\\frac{1}{3}\\right)^n$ は $\\frac{\\frac{1}{3}}{1-\\frac{1}{3}}=\\frac{1}{2}$ に収束することが数式から分かりますが、グラフでもその様子が観察できます。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "\n",
    "$p$ を正の実数とし、次の式で定まる数列 $\\{a^p_n\\}$ に対して、級数 $\\sum_{n=1}^{\\infty}a^p_n$ の部分和 $S^p_n=\\sum_{k=1}^{n}a^p_k$ を考えます。\n",
    "\n",
    "$$\n",
    "a^p_n=\\frac{1}{n^p}\n",
    "$$\n",
    "\n",
    "$p=0.1,0.5,1,2,4$ の各場合について、部分和の数列 $\\{S^p_n\\}$ の第1項から第50項までを用いてグラフを描画してください。ただし、五つのグラフをなるべく一つの図にまとめて表示すること。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#演習2のコード\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "n_list = range(1,51)\n",
    "\n",
    "#ここに、コードを書いてください"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習3（オプション）\n",
    "\n",
    "級数の収束・発散という観点で、演習2に関する考察を書いてください。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（Markdownとして考察を書く）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第4回レポート課題\n",
    "\n",
    "演習1～演習3に取り組んでください。"
   ]
  }
 ],
 "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.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
