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


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

- [高校数学の「ベクトルの内積」関連の問題をPythonで解く](https://qiita.com/code0327/items/b8614649757110c654b6)
- [高校数学の「高次方程式・恒等式」関連の問題をPythonで解く](https://qiita.com/code0327/items/66efb7ac56cdea5b0b0d)
- [高校数学の「2次関数グラフ」関連の問題をPythonで解く](https://qiita.com/code0327/items/83b87f3d490e740b2a95)
- [高校数学の「極限値」関連の問題をPythonで解く](https://qiita.com/code0327/items/1fd0df574c8c8357af5a)
- [高校数学の「微分」関連の問題をPythonで解く](https://qiita.com/code0327/items/97fcacc42ab44402eb35)


# 問題1

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

(1)

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

(2)

```math:
\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$ の範囲で解を返してくれます。

```math:
\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)`で求めることができます。

```Python:
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()` を途中にはさみます。

```Python:
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つベクトルが張る平行四辺形の面積を求めよ。

```math:
\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$ は、次式で求めることができます。

```math:
S=\sqrt{|\boldsymbol{a}|^2|\boldsymbol{b}|^2-\left(\boldsymbol{a}\cdot\boldsymbol{b}\right)^2}\quad
```

```Python:
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}$ を求めよ。

```math:
\boldsymbol{a}=\begin{pmatrix}
3\\
4
\end{pmatrix}
```
### 答え

```math:
\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$ が成立します。よって、以下の連立方程式を解きます。

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


```Python: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)$ を通る直線の方程式を求めよ。

```math:
\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)$ に平行は直線は次のようになります。

```math:
\frac{x-x_0}{c_1}=\frac{y-y_0}{c_2}
```

```Python: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
```