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

1  行列と連立方程式
1.1  python code
2  掃き出し
3  写像
3.1  一点からの写像
3.2  写像のポンチ絵の正体
4  固有ベクトルの幾何学的意味
4.1  解答
5  行列式の幾何学的意味
6  行列式が0の写像
7  全単射
8  課題
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "
\n", "線形代数-写像\n", "
\n", "
\n", "
\n", "file:/Users/bob/Github/TeamNishitani/jupyter_num_calc/lafundamentals\n", "
\n", "https://github.com/daddygongon/jupyter_num_calc/tree/master/notebooks_python\n", "
\n", "cc by Shigeto R. Nishitani 2017-19 \n", "
\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# 行列と連立方程式\n", "\n", "\n", "大学の理系で必修なのは微積分と線形代数です.線形代数というと逆行列と固有値の計算がすぐに思い浮かぶでしょう.計算がややこしくてそれだけでいやになります.でも,行列の計算法は一連の手順で記述できるので,pythonでは微積分とおなじように一個のコマンドで片が付きます.それが3x3以上でも同じです.問題はその意味です.ここでは,線形代数の計算がpythonを使えばどれほど簡単にできるかを示すと共に,線形代数の基本となる概念についてスクリプトと描画を使って,直観的に理解することを目的とします.\n", "\n", "先ずは連立方程式から入っていきます.中学の時に\n", "\n", "$$\n", "4x = 2\n", "$$\n", "というのを解きますよね.一般的には\n", "\n", "$$\n", "\\begin {array}{rl}\n", "ax &= b \\\\\n", "x &= b/a\n", "\\end {array}\n", "$$\n", "と書けるというのは皆さんご存知のはず.これと同じようにして連立方程式を書こうというのが逆行列の基本.つまり\n", "\n", "$$\n", "\\begin {array}{rrl}\n", "2x\\, + &5y &=7 \\\\\n", "4x\\, + &y &=5\n", "\\end {array}\n", "$$\n", "という連立方程式は,係数から作られる2x2行列を係数行列$A$,左辺の値で作るベクトルを$b$として,\n", "\n", "$$\n", "\\begin {array}{rll}\n", "Ax &= b & \\\\\n", "x &= b/A &= A^{-1}b\n", "\\end {array}\n", "$$\n", "としたいわけです.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## python code\n", "\n", "線形代数の問題をpythonで扱うには,scipyに用意されているlinalgパッケージを使うのが現在主流.numpyにある線形代数関数をすべてカバー(包含)しているから.\n", "\n", "まずは行列\n", "$$\n", "\\left[ \\begin {array}{cc} 2&5\\\\ 4&1\\end {array} \\right]\n", "$$\n", "を作ります." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[2, 5],\n", " [4, 1]])\n" ] } ], "source": [ "import numpy as np\n", "from pprint import pprint\n", "aa = np.array([[2,5], [4,1]])\n", "\n", "pprint(aa)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pprintのimportと呼び出しの仕方は微妙なんで,\n", "上で示した順番を守ってください.\n", "\n", "で,次は$b$ ベクトル\n", "$$\n", "\\left[ \\begin {array}{c} \n", "7\\\\\n", "5\n", "\\end {array} \\right]\n", "$$\n", "です." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([7, 5])\n" ] } ], "source": [ "b = np.array([7,5])\n", "pprint(b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "連立方程式の解(Solve a linear matrix equation, or system of linear scalar equations)を一発で求める関数は次の通りです." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([ 1., 1.])\n" ] } ], "source": [ "import scipy.linalg as linalg\n", "pprint(linalg.solve(aa,b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "逆行列と$b$ の積から求めるのは次の通りです." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-0.05555556 0.27777778]\n", " [ 0.22222222 -0.11111111]]\n" ] } ], "source": [ "# 逆行列(matrix inverse)\n", "inv_a = linalg.inv(aa)\n", "print(inv_a)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 1.]\n" ] } ], "source": [ "# 逆行列と,定数項(ordinate)の転置(transpose)との\n", "t_b = np.transpose(b)\n", "print(np.dot(inv_a,t_b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pythonのarrayは横ベクトルということに注意してください.\n", "行列に右から掛けるには,転置しておく必要があります." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 掃き出し\n", "\n", "係数行列$A$とベクトル$b$を足して作られる行列は拡大係数行列と呼ばれます.numpyでは,これは" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[2, 5, 7],\n", " [4, 1, 5]])\n" ] } ], "source": [ "ab = np.column_stack((aa,b))\n", "pprint(ab)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "として作られます.ここから行列の掃き出し操作をおこなうには,luというコマンドを使います." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "P=\n", "array([[ 0., 1.],\n", " [ 1., 0.]])\n", "L=\n", "array([[ 1. , 0. ],\n", " [ 0.5, 1. ]])\n", "U=\n", "array([[ 4. , 1. , 5. ],\n", " [ 0. , 4.5, 4.5]])\n" ] } ], "source": [ "P, L, U = linalg.lu(ab)\n", "print(\"P=\")\n", "pprint(P)\n", "print(\"L=\")\n", "pprint(L)\n", "print(\"U=\")\n", "pprint(U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これは,下三角行列(Lower Triangle Matrix)と上三角行列(Upper Triangle Matrix)に分解(decompose)するコマンドです.この操作はLU分解と呼ばれます.$P$行列は置換(permutation)行列を意味します.luの出力は,前進消去が終わっただけの状態です.後退代入(back substitution)して得られる,reduced row echelon form(rref)にする方法は問題があるとして,numpyでは関数を用意してないようです.\n", "\n", "rrefはsympyには用意されています." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Matrix([\n", "[2, 5, 7],\n", "[4, 1, 5]])\n" ] }, { "data": { "text/plain": [ "(Matrix([\n", " [1, 0, 1],\n", " [0, 1, 1]]), [0, 1])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import Matrix\n", "\n", "Aex = Matrix([[2,5,7],[4,1,5]])\n", "pprint(Aex)\n", "Aex.rref()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 写像\n", "\n", "## 一点からの写像\n", "\n", "次に,先ほどの行列による点の移動\n", "$$\n", "\\left(\n", "\\begin{array}{c} 1 \\\\ 1 \\end{array}\n", "\\right)\n", "\\xrightarrow{f:A}\n", "\\left(\n", "\\begin{array}{c} 5 \\\\ 7 \\end{array}\n", "\\right)\n", "$$\n", "を2次元上のグラフで見てみましょう.\n", "\n", "draw_projcetion_line_pointsは座標(x,y)を受け取り,\n", "1. 位置p0(x,y)を作り,\n", "1. 行列(aa)によって写像される位置p1を作ります.\n", "1. p0に丸を赤色r(ed)で描き,\n", "1. 同じように位置p1に青色b(lue)で丸を描きます.\n", "1. もう一つ,p0からp1をつなぐlineを引きます.\n", "\n", "さらに,表示範囲を0..7,0..5として軸をdraw_axesで書いています.\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[2, 5],\n", " [4, 1]])\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "def draw_projcetion_line_points(x,y):\n", " p0 = np.array([x,y])\n", " p1 = np.dot(aa,p0)\n", "\n", " plt.plot(p0[0],p0[1],'o',color='r')\n", " plt.plot(p1[0],p1[1],'o',color='b')\n", " plt.plot([p0[0],p1[0]],[p0[1],p1[1]],\n", " color='k', linestyle='-', linewidth=1)\n", "\n", "def draw_axes(x_min,x_max,y_min,y_max):\n", " plt.hlines(0, x_min, x_max, color='k', linestyle='-',\n", " linewidth=1)\n", " plt.vlines(0, y_min, y_max, color='k', linestyle='-',\n", " linewidth=1)\n", "\n", "aa = np.array([[2,5], [4,1]])\n", "pprint(aa)\n", "draw_projcetion_line_points(1,1)\n", "\n", "draw_axes(0,7,0,5)\n", "\n", "plt.axes().set_aspect('equal', 'datalim')\n", "plt.grid(b=None, which='major', axis='both')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "逆行列は" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[-0.05555556, 0.27777778],\n", " [ 0.22222222, -0.11111111]])\n" ] } ], "source": [ "inv_aa = linalg.inv(aa)\n", "pprint(inv_aa)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "です.先ほどと逆に青から赤へたどる変換になっています.これが,連立方程式を解く様子をグラフで示しています.つまり,行列Aで示される変換によって求まる青点で示したベクトルb(7,5)を指す元の赤点を捜すというものです.答えは(1,1)となります." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 写像のポンチ絵の正体\n", "\n", "では,元の赤点をもう少しいろいろ取って,行列Aでどのような点へ写されるかを見てみましょう.\n", "\n", "1. n=32で分割した円周上の点(x0,y0)を求めて,\n", "1. draw_projcetion_line_pointsでそれぞれの点の写像\n", "\n", "します.\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "aa = np.array([[2,5], [4,1]])\n", "\n", "div = 32\n", "for i in range(0,div):\n", " theta = 2*np.pi/div*i\n", " x0 = np.sin(theta)\n", " y0 = np.cos(theta)\n", " # print('%10.5f-%10.5f' % (x,y))\n", " draw_projcetion_line_points(x0,y0)\n", "\n", "draw_axes(-7,7,-5,5)\n", "\n", "plt.axes().set_aspect('equal', 'datalim')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "できあがりの図を見てください.何やっているか分かります? 中心の赤点で示される円が,青点で示される楕円へ写されていることが分かるでしょうか.\n", "\n", "線形代数の講義で,写像を示すときによく使われるポンチ絵を現実の空間で示すとこのようになります.ポンチ絵では,赤で示した$V$空間が青で示した$W$空間へ行列$A$によって写像され,それぞれの要素$v$が$w$へ移されると意図しています.\n", "\n", "![la_fundamentals.001.png](figs/la_fundamentals.001.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 固有ベクトルの幾何学的意味\n", "\n", "では,ここでクイズです.固有ベクトルは上のグラフの何処に対応するか? ヒントは,\n", "> 行列Aの固有値,固有ベクトルを$\\lambda, x_0$とすると,\n", "> $$\n", " A \\,x_0 = \\lambda \\, x_0\n", " $$\n", "> が成立する\n", "\n", "です." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 解答 \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "固有値$\\lambda$,固有ベクトル$x_0$の関係式\n", "\n", "$$\n", "A \\,x_0 = \\lambda \\, x_0\n", "$$\n", "を言葉で言い直すと,\n", ">固有ベクトル$x_0$は変換行列$A$によって,自分の固有値倍のベクトル$\\lambda x_0$に写されるベクトル\n", "となります.つまり変換の図で言うと,\n", ">変換しても方向が変わらない赤点(の方向)\n", "となります.\n", "\n", "固有値と固有ベクトルはpythonでは以下のeigコマンドで求まります." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[2, 5],\n", " [4, 1]])\n", "array([ 6., -3.])\n", "array([[ 0.781, -0.707],\n", " [ 0.625, 0.707]])\n" ] } ], "source": [ "import numpy as np\n", "from pprint import pprint\n", "import scipy.linalg as linalg\n", "\n", "np.set_printoptions(precision=3, suppress=True)\n", "\n", "aa = np.array([[2,5], [4,1]])\n", "pprint(aa)\n", "#a = np.array([[3,2/3], [2/3,2]])\n", "l,P = np.linalg.eig(aa)\n", "pprint(l)\n", "pprint(P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ここではeigで戻り値をl ($\\lambda$(lambdaと書きます)),と$P$に代入しています.この後ろ側にある行列$P$の1列目で構成されるベクトルが固有値6に対応する固有ベクトル,2列目のベクトルが固有値-3に対応する固有ベクトルです.\n", "\n", "これを取り出すのは次のようにします." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([ 0.781, 0.625])\n", "array([-0.707, 0.707])\n" ] } ], "source": [ "v0 = P[:,0]\n", "v1 = P[:,1]\n", "pprint(v0)\n", "pprint(v1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これを書き加えた図を示します.ちゃんと固有ベクトルになってるでしょう." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "def draw_eigen_vector(v, t):\n", " plt.plot([-t*v[0],t*v[0]], [-t*v[1],t*v[1]], \n", " color='g', linestyle='-', linewidth=2)\n", "\n", "div = 32\n", "for i in range(0,div):\n", " theta = 2*np.pi/div*i\n", " x0 = np.sin(theta)\n", " y0 = np.cos(theta)\n", " # print('%10.5f-%10.5f' % (x,y))\n", " draw_projcetion_line_points(x0,y0)\n", "\n", "draw_axes(-7,7,-5,5)\n", "\n", "draw_eigen_vector(v0, 7)\n", "draw_eigen_vector(v1, 5)\n", "\n", "plt.axes().set_aspect('equal', 'datalim')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "おまけですが,行列の対角化は次のようにしてできます.\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 6., 0.],\n", " [ 0., -3.]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(np.dot(np.linalg.inv(P),aa),P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 行列式の幾何学的意味\n", "\n", "\n", "行列Aの行列式(determinant, $\\left|A\\right|$あるいはdet$A$と表記)はdetで求まります." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-17.999999999999996" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.det(aa)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "では次のクイズ.先ほど求めた,行列Aの行列式は,どこに対応するでしょう?\n", "以下の(1,0),(0,1)の点を変換した点に原点からベクトルを結んでその意味を説明してください.さらに,そのマイナスの意味は?." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[2, 5],\n", " [4, 1]])\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "a = np.array([[2,5], [4,1]])\n", "pprint(a)\n", "draw_projcetion_line_points(1,0)\n", "draw_projcetion_line_points(0,1)\n", "\n", "\n", "draw_axes(0,8,0,8)\n", "\n", "plt.axes().set_aspect('equal', 'datalim')\n", "plt.grid(b=None, which='major', axis='both')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 行列式が0の写像\n", "\n", "では,行列式が0になるというのはどういう状態でしょう? 次のような行列を考えてみましょう.\n", "$$\n", "\\left[ \\begin {array}{cc} 2&1\\\\ 4&2\n", "\\end {array} \\right]\n", "$$\n", "\n", "この行列の行列式は" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "aa = np.array([[2,1],[4,2]])\n", "np.linalg.det(aa)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "です.この変換行列で,上と同じように写像の様子を表示させてみましょう." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "aa = np.array([[2,1], [4,2]])\n", "\n", "div = 32\n", "for i in range(0,div):\n", " theta = 2*np.pi/div*i\n", " x0 = np.sin(theta)\n", " y0 = np.cos(theta)\n", " # print('%10.5f-%10.5f' % (x,y))\n", " draw_projcetion_line_points(x0,y0)\n", "\n", "draw_axes(-7,7,-5,5)\n", "\n", "plt.axes().set_aspect('equal', 'datalim')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "今回の移動先の青点は直線となっています.つまり,determinantが0ということは,変換すると面積がつぶれるという事を意味しています.平面がひとつ次元を落として線になるということです." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次に,この行列の表わす写像によって原点(0,0)に写される元の座標を求めてみます.連立方程式に戻してみると\n", "$$\n", "\\left[ \\begin {array}{c} 2\\,x+y\\\\ 4\\,x+2\\,y\\end {array} \\right] = \\left[ \\begin {array}{c} 0\\\\ 0\\end {array} \\right]\n", "$$\n", "となります.とよく見ると,1行目も2行目もおなじ式になっています.2次元正方行列で,行列式が0の時には必ずこういう形になり,直線の式となります.これを表示すると\n", "\n", "![LAFundamentalsKernelImage.png](figs/LAFundamentalsKernelImage.png)\n", "\n", "左図の赤線となります.この直線上の全ての点が[0,0]へ写されることを確認してください.また,緑の線上の点は全て[1,2]へ写されることが確認できます." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "こうしてすべて調べていけば,左の平面上のすべて点は右の青の直線上へ写されることが分かります.今まで見てきた円と楕円とはまったく違った写像が,行列式が0の行列では起こっていることが分かると思います.右の青線を行列Aによる像(Image, Im$A$と表記),左の赤線,つまり写像によって[0,0]へ写される集合を核(Kernel, Ker$A$と表記)と呼びます.\n", "\n", "これをポンチ絵で描くと,次の通りです.\n", "\n", "\n", "|像(Image) | 核(Kernel) |\n", "|:----|:----|\n", "|![la_fundamentals.002.png](figs/la_fundamentals.002.png)\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 全単射\n", "\n", "行列$A$による写像を$f$として,赤点に限らず元の点の集合を$V$, 移った先の点の集合を$W$とすると,\n", "\n", "$$\n", "f: V \\rightarrow W\n", "$$\n", "と表記されます.$v,w$を$V,W$の要素としたとき,異なる$v$が異なる$w$に写されることを単射,全ての$w$に対応する$v$がある写像を全射と言います.全単射,つまり全射でかつ単射,だと要素は一対一に対応します.先ほどのAは全射でもなく,単射でもない例です.\n", "\n", "行列式が0の場合の写像は単射ではありません.このとき,逆写像が作れそうにありません.これを連立方程式に戻して考えましょう.もともと,\n", "\n", "$$\n", "v = A^{-1} w\n", "$$\n", "の解$v$は点$w$が写像$A$によってどこから写されてきたかという意味を持ちます.逆写像が作れない場合は,連立方程式の解はパラメータをひとつ持った複数の解(直線)となります.これが係数行列の行列式が0の場合に,連立方程式の解が不定となる,あるいは像がつぶれるという関係です." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "行列の次元が高い場合には,いろいろなつぶれかたをします.行列の階数(rank)と次元(dimension)は" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "(2, 2)\n" ] } ], "source": [ "print(np.linalg.matrix_rank(aa))\n", "print(aa.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "で求まります.\n", "\n", "Aをm行n列の行列とするとき,\n", ">Rank(A) = Dimension (Im A)\n", "\n", ">Dimension (Ker A) = n - Rank(A) \n", "\n", "が成立し,これを次元定理といいます.\n", "全射と単射の関係は,下の表のような一変数の方程式での解の性質の拡張と捉えることができます." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "|呼び名|条件|意味|\n", "|:----|:----|:----|\n", "|一意|$a<>0$ |解は$x=b/a$のみ|\n", "|不定|$a=0, b=0$ |解は無数 |\n", "|不能|$a=0, b<>0$ |解は存在しない|\n", "Table: 代数方程式$a x =b$の解の存在性." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "|m x n行列A|全射でない(Im $A < m$), 値域上にあるときのみ解が存在|全射(Im $A =m$), 解は必ず存在|\n", "|:----|:----|:----|\n", "|単射でない(Ker $A <> 0$), 解は複数 |![004-1](figs/la_fundamentals.004-1.png)|![004-2](figs/la_fundamentals.004-2.png)\n", "|単射(Ker $A = 0$), 解はひとつ|![004-3](figs/la_fundamentals.004-3.png)|![004-4](figs/la_fundamentals.004-4.png)\n", "\n", "Table: 全射と単射を示すポンチ絵." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 課題\n", "\n", "\n", "下の図は\n", "$$A\\, = \\, \\left[ \\begin {array}{cc} 6 & 2\\\\ 2& 4\\end {array} \\right]$$\n", "\n", "を用いて変換される像を表わしている.この絵をpythonで描画せよ.また,この行列の固有値,行列式が何処に対応するか説明せよ.また,固有ベクトルの方向を記せ.(2007年度期末試験改)\n", "\n", "![la_fund_ex1.png](figs/la_fund_ex1.png)\n" ] }, { "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_position": { "height": "581px", "left": "0px", "right": "auto", "top": "105px", "width": "212px" }, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 2 }