\usepackagecancel

Return to ベクトルの演算

参考:SymPy でベクトルの演算

必要なモジュールの import

In [1]:
from sympy.abc import *
from sympy import *

init_printing()

SymPy におけるベクトルの表記

Matrix() を使ってベクトルを表記します。

In [2]:
# ベクトルの成分
var('a1:4, b1:4, c1:4');
In [3]:
a = Matrix([a1, a2, a3])
b = Matrix([b1, b2, b3])
c = Matrix([c1, c2, c3])

ベクトルの演算

足算,引き算

ベクトルの足算引き算をしてみると,成分同士の足算引き算になっていることがわかります。

In [4]:
a + b
Out[4]:
[a1+b1a2+b2a3+b3]
In [5]:
a - b
Out[5]:
[a1b1a2b2a3b3]

ベクトルの定数倍

ベクトルの定数倍は,各成分をそれぞれ定数倍したものになっています。

In [6]:
C * a
Out[6]:
[Ca1Ca2Ca3]

ベクトルの内積

ベクトルの内積は ab=a.dot(b) です。

In [7]:
a.dot(b)
Out[7]:
a1b1+a2b2+a3b3

ベクトルの大きさ

ベクトル a の大きさ |a| は自分自身との内積の平方根として定義されます。
|a|aa

ベクトルの大きさを返す関数 norm() を以下のように定義します。

In [8]:
def norm(v):
    return sqrt(v.dot(v))

今定義した norm() を使って,ベクトル a の大きさ |a| を計算してみます。

In [9]:
norm(a)
Out[9]:
a12+a22+a32

ベクトルの外積

ベクトルの外積は a×b=a.cross(b) です。

In [10]:
a.cross(b)
Out[10]:
[a2b3a3b2a1b3+a3b1a1b2a2b1]

外積は「反交換」

a×bb×a であること,具体的には以下のように「反交換」であることを確認します。
a×b=b×a

a×b+b×a=0 となることを示せばいいです。

In [11]:
a.cross(b) + b.cross(a)
Out[11]:
[000]

ベクトルの三重積

スカラー三重積

3つのベクトル a,b,c によるスカラー三重積は a(b×c) であり,これは結局はスカラーとなります。スカラー三重積には,以下のような公式があります。

a(b×c)=b(c×a)=c(a×b)

a(b×c)=b(c×a) つまり,
a(b×c)b(c×a)=0 を示してみます。

In [12]:
a.dot(b.cross(c)) - b.dot(c.cross(a))
# カッコをはずして展開する
expand(_)
Out[12]:
[000]

同様にして,b(c×a)c(a×b)=0 を示してみます。

In [13]:
b.dot(c.cross(a)) - c.dot(a.cross(b))
Out[13]:
b1(a2c3+a3c2)+b2(a1c3a3c1)+b3(a1c2+a2c1)c1(a2b3a3b2)c2(a1b3+a3b1)c3(a1b2a2b1)
In [14]:
expand(_)
Out[14]:
0

ベクトル三重積

3つのベクトル a,b,c によるベクトル三重積は a×(b×c) であり,これは結局はベクトルをつくります。ベクトル三重積には,以下のような公式があります。

a×(b×c)=(ac)b(ab)c

一挙に証明するには,

In [15]:
a.cross(b.cross(c)) - (a.dot(c) * b - a.dot(b) * c)
Out[15]:
[a2(b1c2b2c1)a3(b1c3+b3c1)b1(a1c1+a2c2+a3c3)+c1(a1b1+a2b2+a3b3)a1(b1c2b2c1)+a3(b2c3b3c2)b2(a1c1+a2c2+a3c3)+c2(a1b1+a2b2+a3b3)a1(b1c3+b3c1)a2(b2c3b3c2)b3(a1c1+a2c2+a3c3)+c3(a1b1+a2b2+a3b3)]
In [16]:
expand(_)
Out[16]:
[000]