ベクトルの内積と言っても「何の話?」という感じですが、一応高校の数学過程で習うものです。
しかし使わなければ覚えているわけはないですよね。
そこでpython の練習もかねて、プログラミングには欠かせないベクトルの内積について、勉強してみた記録を書いています。

この記事はこんな人におすすめ。
- ベクトルの内積について復習をしたい。
- Pythonを使った2種類のベクトルの内積の求め方を知りたい
ベクトルの内積について
ベクトルの内積は当然数学の領域です。
そのためいろいろなサイトを調べても、説明が数学的になってしまい文系にとっては今一つ何を言っているのか分からないのが正直なところです。
そこで、こちらの文系プログラマーのためのPythonで学び直す高校数学という本をもとに説明していきます。
で、この本によるとベクトルの内積とは、
「力の大きさ X 移動距離」で仕事の量を計算する方法
になります。
まだよくわからないので、具体例を見ていきましょう。
ベクトルの内積と仕事量
下の「仕事量は力の大きさ X 移動距離」の図を見ると緑の線 bは1から6までのベクトルになっていますが、例えばこの bの力が10だった場合移動距離は1から6。
つまり5になるので「力の大きさ(10) X 移動距離(5)」で「50の仕事をした」ということになります。
ベクトルb単独の場合、仕事の量は50になりますが、赤の線ベクトル a の力が加わった場合仕事の量はいくらになるのかを計算する方法が「ベクトルの内積」になり、以下の式で表すことができます。
この式の右辺を分解してみると、 は a の方向に引っ張った時に水平方向に動く力 F 、
はその方向に動いた距離になります。
Python による二つのベクトルの描画
参考までに「仕事量は力の大きさ X 移動距離」の描画コードを以下に載せておきます。
# 必要なライブラリのインポート 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, 7) ax.set_ylim(-1,8) ax.set_title("仕事量は力の大きさ X 移動距離") x, y = [1,1], [1,1] # ベクトルの始点 u, v = [3,5], [5,0] # ベクトルの始点からの距離 # ベクトルの描画 ax.quiver(x,y,u,v, color = ['red', 'green'], angles = 'xy', scale_units = 'xy', scale= 1) plt.grid() # その他詳細の設定 ax.annotate("F", xy = (4, -0.3), size = 15, xytext = (0.8, -0.5), color = "red", arrowprops = dict(arrowstyle = "|-|", color = "black")) ax.text(1.5,1.3,"θ", color = "blue", size = 15) plt.hlines(1.5, 3.8, 4, color='b', linestyles='solid') plt.vlines(3.8, 1, 1.5, color='b', linestyles='solid') plt.plot([4,4], [1, 6],linestyle = "dotted",color="green") ax.text(4,6, "a: [4,6]",color = "red", size = 15) ax.text(6,1,"b: [6,1]", color = "green", size = 15)
ベクトルの内積を実際に求めてみる
ベクトルの内積を求める方法には「大きさと角度を使って求める方法」と「ベクトルの成分が分かっているいる場合の計算方法」の二種類があります。
まず「仕事量は力の大きさ X 移動距離」プロットでは成分は分かっていますが θ、つまり角度が分かりません。
ベクトルの成分を用いて内積を求める
ベクトルの成分が分かっているが、角度が分からない場合に内積を求める公式が以下になります。
のとき
この公式を使って、以下のベクトルa と b の内積を求めてみることにしましょう。
以下コードになります。
# 必要なライブラリのインポート import math import numpy as np #ベクトル a とベクトル b の座標の定義 a = np.array([1,1]) b = np.array([4,6]) c = np.array([1,1]) d = np.array([6,1]) #ベクトルa とベクトルb の成分を求める va = b - a vb = d - c # ベクトルの大きさ(norm)を求める norm_a = np.linalg.norm(va) norm_b = np.linalg.norm(vb) # ベクトルの内積を求める dot_ab = np.dot(va, vb) # 角度 θ を求める cos_ab = dot_ab/(norm_a * norm_b) rad = math.acos(cos_th) # 弧度法(ラディアン) deg = math.degrees(rad) # 角度法 print("θ(角度法): " + str("{:.2f}".format(deg)+"度")) print("θ(弧度法): " + str("{:.2f}".format(rad)+"度")) print("コサイン cos: " + str("{:.2f}".format(cos_ab))) print("ベクトルaの大きさ: "+ str("{:.2f}".format(norm_a))) print("ベクトルbの大きさ: "+ str("{:.2f}".format(norm_b))) print("ベクトルの内積: "+ str("{:.2f}".format(dot_ab))) θ(角度法): 59.04度 θ(弧度法): 1.03度 コサイン cos: 0.51 ベクトルaの大きさ: 5.83 ベクトルbの大きさ: 5.00 ベクトルの内積: 15.00
コードを実行して得られたベクトルの内積は15.00。
ベクトルの角度と大きさを使って内積を求める
上記のコードでは成分を使ったベクトルの内積を求めると同時に θ、つまり角度とnorm_a、norm_bなどベクトルの大きさも同時に求めています。
そこで、角度を用いたベクトルの内積を求める公式を使って、内積が15になるかどうかを検証してみましょう。
ベクトルの大きさと角度を用いて内積を求める公式は、前述のとおり以下になります。
この公式を使って内積を求めてみましょう。
# 必要なライブラリのインポート import math ab = norm_a * norm_b * math.cos(rad) # ベクトルa とベクトルb の大きさを掛け合わせ、さらにcosθを掛け合わせる ab print("ベクトルの内積: "+ str("{:.2f}".format(ab))) ベクトルの内積: 15.00
ベクトルの大きさと角度を用いた公式を使っても、内積は15になります。
一つ補足すると、cosθで使われる角度は通常私たちが使っている角度法の角度ではなく、弧度法の角度を使う点に注意しましょう。
関連記事↓↓↓


コメント