概要
ベクトルの内積関連の問題(高校数学)を Python/Sympy で解いていきます。練習問題と解答例の作成支援を目的としています(教員向けものです)。
- 高校数学の「ベクトルの内積」関連の問題をPythonで解く
- 高校数学の「高次方程式・恒等式」関連の問題をPythonで解く
- 高校数学の「2次関数グラフ」関連の問題をPythonで解く
- 高校数学の「極限値」関連の問題をPythonで解く
- 高校数学の「微分」関連の問題をPythonで解く
問題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.
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}
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