ベクトル外積は内積とともに重要な概念なので、いくつかの覚えておいたほうがいいポイントについてこの記事で書いてみました。

この記事はこんな人におすすめ。
- ベクトル外積について知りたい
- ベクトルの外積をPythonの3Dで描画したい。
- ベクトルの外積を使って面積を求めたい。
ベクトルの外積で覚えたい二つのポイント
ベクトルの外積には覚えて欲しいポイントが二つあります。
文系プログラマーのためのpythonで学び直す高校数学から引用すると、
- 外積は2つのベクトルに垂直なベクトルになる
- そのベクトルの大きさは、2つのベクトルが作る平行四辺形の面積と等しい
この二つのポイントをPythonで実装してみますが、その前にベクトルの外積の計算方法を見てみます。
ベクトルの外積とは
3次元空間のベクトル
の時、ベクトルの外積を
のように計算します。
見た目難しそうですが、ベクトル同士を掛け合わせると、つまり外積の結果は結局ベクトルになることを覚えておく必要があります。
そして3次元の外積はベクトルで表されるますが、2次元ベクトルの外積はスカラー値で表されること覚えておくと便利です。
参考記事:
ベクトルの外積の計算
では実際にPythonでベクトルの外積を実装してみましょう。
ベクトルの外積計算には、numpy モジュールの np.cross()関数を使います。
では次のベクトルの外積を求めてみます。
,
import numpy as np a = np.array([0,1,2]) # ベクトル a の成分 b = np.array([2,0,0]) # ベクトル b の成分 np.cross(a, b) # 外積を求める関数 array([ 0, 4, -2]) # 外積の結果
では、2次元ベクトルの外積はどうなるのかも計算してみます。
a = np.array([0,1]) # ベクトル a の成分 b = np.array([2,0]) # ベクトル b の成分 np.cross(a, b) # 外積を求める関数 array(-2) # 外積の結果
2次元ベクトルの外積は-2 というスカラー値で表されました。
ベクトルの外積を求め描画する
次にベクトルの外積を求め、さらに描画をしていきます。
このコードの中の、coordinate_3d() 関数と visual_vector_3d()関数は、Python 数値計算入門さんを参考にさせていただきました。
必要なライブラリをインポートし実行してみます。
from scipy.linalg import norm # ベクトルの大きさを計算するモジュール import matplotlib.pyplot as plt # 描画ライブラリ # coordinate_3d()を実装 # 3D座標設定関数 def coordinate_3d(axes, range_x, range_y, range_z, grid = True): axes.set_xlabel("x", fontsize = 16) axes.set_ylabel("y", fontsize = 16) axes.set_zlabel("z", fontsize = 16) axes.set_xlim(range_x[0], range_x[1]) axes.set_ylim(range_y[0], range_y[1]) axes.set_zlim(range_z[0], range_z[1]) if grid == True: axes.grid() # visual_vector_3d()を実装 # 3Dベクトル描画関数 def visual_vector_3d(axes, loc, vector, color = "red"): axes.quiver(loc[0], loc[1], loc[2], vector[0], vector[1], vector[2], color = color, length = 1, arrow_length_ratio = 0.2) fig = plt.figure(figsize = (6,6)) ax = fig.add_subplot(111, projection = '3d') # 3D 座標を設定 coordinate_3d(ax, [-2, 2], [0, 3], [-3, 2], grid = True) # 始点を設定 loc = [0,0,0] # ベクトル a, b を定義 a = [0,1,2] b = [2,0,0] # a と b のベクトル積 c c = np.cross(a, b) # c の大きさ (ノルム) を計算 c_norm = norm(c) # ベクトル a, b, c を配置 visual_vector_3d(ax, loc, a, 'r') visual_vector_3d(ax, loc, b, 'b') visual_vector_3d(ax, loc, c, 'g') print("c (ベクトルの外積): {}".format(c)) print("|c| (ベクトルの長さ): {:.3f}".format(c_norm)) c (ベクトルの外積): [ 0 4 -2] |c| (ベクトルの長さ): 4.472
プログラムを実行した結果、ベクトルの外積は [0, 4, -2]、ベクトル a とベクトル b の外積で得られたベクトル c の長さは 4.472 となります。
そして以下に3 次元ベクトルの外積の描画結果を出力しています。
ベクトルの外積から面積を求める
次にベクトルの外積から面積を求めてみます。
ベクトルの外積ので押さえておくべき重要なポイントの一つとして「ベクトルの大きさは、2つのベクトルが作る平行四辺形の面積と等しい」があります。
つまり以下のような場合の面積を求めてみましょう。
Python で面積を求める実装
以下のコードでベクトルの外積から面積を求める実装を行ってみます。
# 必要なライブラリのインポート import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.family'] = 'MS Gothic' # プロットの設定 fig, ax = plt.subplots() ax.set_xlim(0,6) ax.set_ylim(0,6) ax.set_title("ベクトルの外積") # ベクトル始点、終点 x, y = [0,0], [0,0] u, v = [2,3], [4,1] # ベクトルの描画 ax.quiver(x,y,u,v, color = ['red', 'green'], angles = 'xy', scale_units = 'xy', scale= 1) plt.grid() plt.plot([2,3 ], [4, 1],linestyle = "dotted",color="green") plt.plot([2,5 ], [4, 5],linestyle = "dotted",color="green") plt.plot([3,5 ], [1, 5],linestyle = "dotted",color="green") xs = [0, 3, 2, 0] xy = [0, 1, 4, 0] plt.fill(xs, xy) ax.text(2,4, "[2,4]",color = "red", size = 15) ax.text(3,1,"b:[3,1]", color = "green", size = 15) # ベクトルの要素 a = np.array([2,4]) b = np.array([3,1]) # ベクトルの外積を求める cross_ab = np.cross(a, b) # ベクトルの大きさを求める(平行四辺形の面積) s = np.linalg.norm(cross_ab) # 三角形の面積 s/2 # 結果 5.0
関連記事↓↓↓


コメント