高校数学の「ベクトルの内積」関連の問題をPythonで解く


概要

 ベクトルの内積関連の問題(高校数学)を Python/Sympy で解いていきます。練習問題と解答例の作成支援を目的としています(教員向けものです)。

問題1

次のベクトル $\boldsymbol{a}$、$\boldsymbol{b}$ の内積と、それらがなす角 $\theta$ $(0\le\theta\le\pi)$ を求めよ。

(1)

\boldsymbol{a}=\begin{pmatrix}
2\\
-3
\end{pmatrix},\quad
\boldsymbol{b}=\begin{pmatrix}
-4\\
6
\end{pmatrix}

(2)

\boldsymbol{a}=\begin{pmatrix}
1\\
1
\end{pmatrix},\quad
\boldsymbol{b}=\begin{pmatrix}
1-\sqrt{3}\\
1+\sqrt{3}
\end{pmatrix}

答え

(1) 内積 $\boldsymbol{a}\cdot\boldsymbol{b}=-26$、角度 $\theta = \pi$
(2) 内積 $\boldsymbol{a}\cdot\boldsymbol{b}=1/2$、角度 $\theta = \pi/3$

Pythonによる解決

 内積とノルムと角 $\theta$ には、次の関係があります。

$$\boldsymbol{a}\cdot\boldsymbol{b}=|\boldsymbol{a}||\boldsymbol{b}|\cos\theta $$

 これより、角度 $\theta$ は、次式により求められます。sympy.acos() は、$0$ から $\pi$ の範囲で解を返してくれます。

\theta=\cos^{-1}
\left(
\frac{\boldsymbol{a}\cdot\boldsymbol{b}}{|\boldsymbol{a}||\boldsymbol{b}|}
\right)

 ベクトル $\boldsymbol{a}$ のノルム(大きさ・絶対値)はa.norm()で、$\boldsymbol{a}$ と $\boldsymbol{b}$ の内積はa.dot(b)で求めることができます。

import sympy

a = sympy.Matrix([2, -3])
b = sympy.Matrix([-4, 6])
ab = a.dot(b)
theta = sympy.acos(a.dot(b)/(a.norm()*b.norm()))
print(f'(1)の解答  内積は {ab}、角度θは {theta}')

a = sympy.Matrix([1, 1])
b = sympy.Matrix([1-sympy.sqrt(3), 1+sympy.sqrt(3)])
ab = a.dot(b)
theta = sympy.acos(a.dot(b)/(a.norm()*b.norm()))
print(f'(2)の解答  内積は {ab}、角度θは {theta}')
実行結果
(1)の解答  内積は -26、角度θは pi
(2)の解答  内積は 2、角度θは acos(sqrt(2)/sqrt((-1 + sqrt(3))**2 + (1 + sqrt(3))**2))

 ん?(2)について、きれいな形になっていません。答えは、$\pi/3$ になるはずなのですが・・・。対応策として sympy.simplify() を途中にはさみます。

import sympy

a = sympy.Matrix([1, 1])
b = sympy.Matrix([1-sympy.sqrt(3), 1+sympy.sqrt(3)])
ab = a.dot(b)
theta = sympy.acos(sympy.simplify(a.dot(b)/(a.norm()*b.norm())))
print(f'(2)の解答  内積は {ab}、角度θは {theta}')
実行結果
(2)の解答  内積は 2、角度θは pi/3

 解決しました。

問題2

次の2つベクトルが張る平行四辺形の面積を求めよ。

\boldsymbol{a}=\begin{pmatrix}
1\\
1
\end{pmatrix},\quad
\boldsymbol{b}=\begin{pmatrix}
1-\sqrt{3}\\
1+\sqrt{3}
\end{pmatrix}

答え

平行四辺形の面積は $2\sqrt{3}$

Pythonによる解決

 平行四辺形の面積 $S$ は、次式で求めることができます。

S=\sqrt{|\boldsymbol{a}|^2|\boldsymbol{b}|^2-\left(\boldsymbol{a}\cdot\boldsymbol{b}\right)^2}\quad
import sympy

a = sympy.Matrix([1, 1])
b = sympy.Matrix([1-sympy.sqrt(3), 1+sympy.sqrt(3)])
S = sympy.sqrt(a.norm()**2 * b.norm()**2 - a.dot(b)**2)
S = sympy.simplify(S)
print(f'面積は {S}')
実行結果
面積は 2*sqrt(3)

 今回も sympy.simplify() が必要でした。

問題3

次のベクトル $\boldsymbol{a}$ に垂直な単位ベクトル $\boldsymbol{u}$ を求めよ。

\boldsymbol{a}=\begin{pmatrix}
3\\
4
\end{pmatrix}

答え

\boldsymbol{u}=\pm\frac{1}{5}\begin{pmatrix}
3\\
4
\end{pmatrix}

Pythonによる解決

 $\boldsymbol{a} \perp \boldsymbol{u}$ なので $\boldsymbol{a} \cdot \boldsymbol{u} = 0$ が成立します。また、$\boldsymbol{u}$ は単位ベクトルなので $|\boldsymbol{u}|=1$ が成立します。よって、以下の連立方程式を解きます。

\left\{
\begin{array}{l}
\boldsymbol{a} \cdot \boldsymbol{u} = 0 \\
|\boldsymbol{u}|=\sqrt{u_1^2+u_2^2} = 1
\end{array}
\right.
Python
import sympy

x, y = sympy.symbols('x y') 
a = sympy.Matrix([3, 4])
u = sympy.Matrix([x, y])
u_norm = sympy.sqrt(x**2+y**2)
sol = sympy.solve([a.dot(u),u_norm-1],[x,y])
print(sol)
実行結果
[(-4/5, 3/5), (4/5, -3/5)]

 当初、sol = sympy.solve([a.dot(u),u.norm()-1],[x,y]) のようにしたのですが、これはダメでした。

問題4

次のベクトル $\boldsymbol{a}$ を法線ベクトルして、点 $(3,2)$ を通る直線の方程式を求めよ。

\boldsymbol{a}=\begin{pmatrix}
3\\
4
\end{pmatrix}

答え

$3x+4y-17=0$

Pythonによる解決

 問題3のつづきになります。問題3で求めた単位ベクトルを方向ベクトル $\boldsymbol{c}$ として、点 $(3,2)$ を通る直線の式を求めます。点 $P(x_0,y_0)$ を通り、方向ベクトル $\boldsymbol{c}=(c_1, c_2)$ に平行は直線は次のようになります。

\frac{x-x_0}{c_1}=\frac{y-y_0}{c_2}
Python
import sympy

c1, c2 = sympy.symbols('c1 c2') 
a = sympy.Matrix([3, 4])
u = sympy.Matrix([c1, c2])
u_norm = sympy.sqrt(c1**2+c2**2)
sol = sympy.solve([a.dot(u),u_norm-1],[c1,c2])

c1 = sol[0][0]
c2 = sol[0][1]

x, y = sympy.symbols('x y') 
ans = sympy.solve((x-3)/c1 - (y-2)/c2, y)
print(f'直線の式は y = {ans[0]}')
実行結果
直線の式は y = -3*x/4 + 17/4