【Pythonで学ぶ線形代数学講座(9)】ベクトル積の定義と計算手順
今回の講座では外積(ベクトル積)について学びます。内積 は計算結果がスカラー(実数)でしたが、外積は計算結果がベクトルとなる演算として定義されます。
ベクトル積(外積)
3 次元空間のベクトル
\[\boldsymbol{u}=\begin{bmatrix}u_1 \\ u_2 \\ u_3\end{bmatrix},\quad\boldsymbol{v}=\begin{bmatrix}v_1 \\ v_2 \\ v_3\end{bmatrix}\]
に対して ベクトル積(外積)を
\[\boldsymbol{u}\times\boldsymbol{v}=\begin{bmatrix}u_2v_3-u_3v_2 \\ u_3v_1-u_1v_3 \\ u_1v_2-u_2v_1\end{bmatrix}\tag{1}\]
のように定義します。英語では vector product または cross product とよばれます。後述するように、NumPy には numpy.cross() という名称でベクトル積関数が実装されています。簡単な形で $n$ 次元に一般化できない(その次元で乗法が定義できるかなど難しい条件が付く)ので、線形代数の理論構築にベクトル積が登場する機会は少ないですが、モーメントや磁場の中における荷電粒子の運動の記述に用いるなど、物理学や工学の分野ではベクトル積が頻繁に登場します。
ベクトル積の計算方法
内積 $\boldsymbol{u}\cdot\boldsymbol{v}$ が 2 本のベクトルからスカラーを生成する演算であったのに対して、ベクトル積 $\boldsymbol{u}\times\boldsymbol{v}$ は 2 本のベクトルから新しいベクトルを生成する演算です。上の定義式では覚えにくいですが、次のように各成分を交差させると、簡単にベクトル積をつくることができます。
ベクトル積は行列式の形で
\[\boldsymbol{u}\times\boldsymbol{v}=\begin{vmatrix}\boldsymbol{i} & \boldsymbol{j} & \boldsymbol{k}\\u_1 & u_2 & u_3\\v_1 & v_2 & v_3\end{vmatrix}\tag{2}\]
と表すこともできます。ここで $\boldsymbol{i},\ \boldsymbol{j},\ \boldsymbol{k}$ は、それぞれ
\[\boldsymbol{i}=\begin{bmatrix}1\\0\\0\end{bmatrix},\ \quad\boldsymbol{j}=\begin{bmatrix}0\\1\\0\end{bmatrix},\ \quad\boldsymbol{k}=\begin{bmatrix}0\\0\\1\end{bmatrix}\]
によって定義される単位ベクトルです。(2) を展開して
\[\boldsymbol{u}\times\boldsymbol{v}=\boldsymbol{i}\begin{vmatrix}u_2 & u_3 \\ v_2 & v_3\end{vmatrix}+\boldsymbol{j}\begin{vmatrix}u_1 & u_3 \\ v_1 & v_3\end{vmatrix}+\boldsymbol{k}\begin{vmatrix}u_1 & u_2 \\ v_1 & v_2\end{vmatrix}\]
のようにしてベクトル積を求めることができます。
$\boldsymbol{u}\times\boldsymbol{v}$ は $\boldsymbol{u}$ と $\boldsymbol{v}$ の両方に対して垂直です。すなわち、 $\boldsymbol{u}$ と $\boldsymbol{v}$ が張る平面に対して垂直です。これは $\boldsymbol{u}$ もしくは $\boldsymbol{v}$ と $\boldsymbol{u}\times\boldsymbol{v}$ の内積をとって確認できます。
\[\boldsymbol{u}\cdot(\boldsymbol{u}\times\boldsymbol{v})=u_1(u_2v_3-u_3v_2)+u_2(u_3v_1-u_1v_3)+u_3(u_1v_2-u_2v_1)=0\]
同様の計算で $\boldsymbol{v}\cdot(\boldsymbol{u}\times\boldsymbol{v})=0$ となります。2 本のベクトルが張る平面に垂直な方向は 2 通りありますが、以下に示すようにベクトルの大きさを調べることによって確定できます。
証明は省略しますが、ベクトル積 $\boldsymbol{u}\times\boldsymbol{v}$ の大きさ(ノルム)は、$\boldsymbol{u}$ と $\boldsymbol{v}$ がつくる平行四辺形の面積に等しいことが知られています。すなわち、2 本のベクトルのなす角度を $\theta$ とすると、ベクトル積の大きさは
\[\parallel \boldsymbol{u} \times \boldsymbol{v} \parallel=\parallel \boldsymbol{u} \parallel \parallel \boldsymbol{v} \parallel \sin \theta \tag{3}\]
で与えられます。
$\sin\theta$ の符号を考慮すると、$\boldsymbol{u}\times\boldsymbol{v}$ の方向は、$\boldsymbol{u}$ を(少ないほうの角度で)回転させて $\boldsymbol{v}$ に重ねるときに右ネジの進む方向に一致します。
numpy.cross()
ベクトル積(外積)は numpy.cross() を使って求めることができます。コードライブラリ にある coordinate_3d() と visual_vector_3d() を使って、3 次元座標にベクトル積を表示してみます。
# python_vector_cross # In[1] import numpy as np from scipy.linalg import norm import matplotlib.pyplot as plt # ここにcoordinate_3d()を実装 # ここにvisual_vector_3d()を実装 # FigureとAxes fig = plt.figure(figsize = (6, 6)) ax = fig.add_subplot(111, projection='3d') # 3D座標を設定 coordinate_3d(ax, [-5, 5], [-5, 5], [-5, 10], grid = True) # 始点を設定 loc = [0, 0, 0] # ベクトルu,vを定義 u = [3, 1, 0] v = [2, 5, 1] # uとvのベクトル積w w = np.cross(u, v) # wの大きさ(ノルム)を計算 w_norm = norm(w) # ベクトルu,v,wを配置 visual_vector_3d(ax, loc, u, "red") visual_vector_3d(ax, loc, v, "blue") visual_vector_3d(ax, loc, w, "green") print("w : {}".format(w)) print("|w| : {:.3f}".format(w_norm)) # w : [ 1 -3 13] # |w| : 13.379
コメント
numpy.crossの使い方をChatGPTが解説します
生徒: 先生、ベクトルの外積を計算するために、PythonのNumPyライブラリにはどのような機能がありますか?具体的には、numpy.crossという関数があると聞きましたが、どのように使うのか教えていただけますか?
先生: そうですね、NumPyライブラリにはnumpy.cross関数があります。これは、ベクトルの外積を計算するための便利な関数です。numpy.cross関数を使うことで、ベクトルの外積を簡単に計算することができます。
生徒: それは便利ですね。numpy.cross関数の具体的な使い方を教えてください。
先生: numpy.cross関数は以下のように使います。まず、外積を計算したい二つのベクトルをNumPyの配列として用意します。それから、numpy.cross関数にそれらのベクトルを引数として渡します。
◆◆◆◆◆
import numpy as np
vector1 = np.array([x1, y1, z1])
vector2 = np.array([x2, y2, z2])
cross_product = np.cross(vector1, vector2)
◆◆◆◆◆
生徒: 分かりました。vector1とvector2がそれぞれ外積を計算したいベクトルで、cross_productが計算結果のベクトルですね。
先生: その通りです。cross_productには外積の結果が格納されます。numpy.cross関数は渡されたベクトルの次元に応じて計算を行います。つまり、2次元の場合は外積を計算せずにゼロベクトルが返されます。