LoginSignup
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-25

概要

 ベクトルの内積関連の問題(高校数学)を 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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2