Python でベクトルの外積を求め、描画する

ベクトル

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

この記事はこんな人におすすめ。

  • ベクトル外積について知りたい
  • ベクトルの外積を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
上記のコードによって、下記のようにベクトルで得られた三角形の部分の面積を求めることができました。

 

プログラミング無料体験はこちら↓↓↓


関連記事↓↓↓

Python でベクトルの足し算や引き算の結果を描画してみる
プログラミングの数学でかなり重要なベクトルについて勉強したので、その内容を復習を兼ねてまとめてみました。 この記事はこんな人におすすめ。 ベクトルを描画したい ベクトルの足し算と引き算の結果を描画し...
Python を使ったベクトルの内積の求め方2種
ベクトルの内積と言っても「何の話?」という感じですが、一応高校の数学過程で習うものです。 しかし使わなければ覚えているわけはないですよね。 そこでpython の練習もかねて、プログラミングには欠かせないベクトルの内積について、...

コメント

タイトルとURLをコピーしました