{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\t
\n", "\t\tベクトルと行列の計算は、幅広い分野で使われています。\n", "\t\tSageを使ってベクトルと行列の特徴的な計算方法について見ていきましょう。\t\t\n", "\t
\n", "\t\n", "\t\n", "\tsageでベクトルを生成する関数は、vector関数です。vector関数の使い方を以下に示します。\n", "
\n", "vector(値のリスト)\n", "または、\n", "vector(環, 値のリスト)\n", "\n", "\t\n", "\t\n", "\t
\n", "\t\tベクトルの生成例として、$v=(2, 1, 3), w=(1, 1,-4)$の例を以下に示します。環については後ほど紹介します。\t\t\n", "\t
\n", "" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# jupyter用のdisplayメソッド\n", "from IPython.display import display, Latex, HTML, Math, JSON" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 1, 3)" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ベクトルと行列\n", "v = vector([2,1,3]); v" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(1, 1, -4)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = vector([1,1,-4]); w" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(3, 2, -1)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ベクトルの和\n", "v+w" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t\n", "\t\tSageではベクトルの和と差は通常の変数と同じように+, -記号で表すこととができます。\n", "\t
\n", "\t\n", "\t\tベクトルのスカラー倍は、ベクトルの各要素にスカラを掛けた形になります。\n", "\t
\n", "\t\n", "\t\tベクトルの絶対値は、ベクトル用各要素の自乗の和を平方根となり、ベクトルの距離は2つのベクトルの差の絶対値となります。\n", "\t
\n", "\t\n", "\t\tこのようにSageではベクトルに対して、変数と同じように計算ができる点が特徴です。\n", "\t
\n", "" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(a1 + b1, a2 + b2, a3 + b3)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "(a1*c, a2*c, a3*c)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "sqrt(a1^2 + a2^2 + a3^2)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "sqrt((a1 - b1)^2 + (a2 - b2)^2 + (a3 - b3)^2)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "var('a1 a2 a3 b1 b2 b3 c')\n", "A = vector([a1, a2, a3])\n", "B = vector([b1, b2, b3])\n", "show (A+B) # ベクトルの和\n", "show (c*A) # ベクトルのスカラー倍\n", "show (abs(A)) # ベクトルの絶対値\n", "show (abs(A-B)) # ベクトルの距離" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t\n", "\t\tベクトルには、内積と外積という特徴的な2つの演算があります。\n", "\t
\n", "\t\n", "\t\t内積は、2つのベクトルの各要素の積の和として、以下のように定義されます。\n", "$$\n", "\t\t\\mathbf{v}\\cdot\\mathbf{w} = \\Sigma_{i=1}^N v_i w_i\n", "$$\n", "\t
\n", "\t\n", "\t\t先に生成したベクトルA, Bに対して内積を取ると、定義どおりの結果が得られます。\n", "\t
\n", "" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "a1*b1 + a2*b2 + a3*b3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "AdB = A.dot_product(B)\n", "show(AdB)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t\n", "\t\t内積の大きな特徴に、2つのベクトルのなす角度$\\theta$との間に以下の関係があります。\n", "$$\n", "\t\t\\mathbf{v}\\cdot\\mathbf{w} = |\\mathbf{v}||\\mathbf{w}| cos \\theta\n", "$$\t\t\n", "\t\tこの性質を使って、ベクトルの類似を計算するのに、$cos(\\theta)$がよく使われます。\n", "\t
\n", "\t\n", "\t\tまた、2つのベクトルが直行する場合には、$cos \\theta = 0$から、\n", "\t\tベクトルの内積はベクトルの直交判定にもよく利用されます。\n", "\t
\n", "\t\n", "\t\t以下に、$v=(2, 1, 3), w=(1, 1,-4)$の内積の結果とベクトルv, wのなす角度$\\theta$を\n", "\t\t求めています。\n", "\t
\n", "" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-9" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.dot_product(w)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "124.537583786181\n" ] } ], "source": [ "deg = lambda x : N(x * 180/pi)\n", "# vとwからcos(th)を計算\n", "cos_th = v.dot_product(w)/(abs(v)*abs(w))\n", "th = arccos(cos_th)\n", "print deg(th)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t\n", "\t\t3次元プロットで、ベクトルv,wをプロットしたのが以下の図です。\n", "\t\t2つのベクトルのなす角度が約120度であることが、見て取れます。\n", "\t
\n", "" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "