『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

直線の線形変換

【Pythonで学ぶ線形代数学講座(18)】直線の線形変換

直線の方程式と線形変換

下図のように、平面上に 2 点 $P,\ Q$ があって、それぞれの位置ベクトルを $\boldsymbol{p},\ \boldsymbol{q}$ とします。
 
ベクトルで表された直線方程式
このとき、$P$ を始点、$Q$ を終点とするベクトルは $\boldsymbol{q}-\boldsymbol{p}$ なので、$P$ と $Q$ を結ぶ直線上の位置ベクトルは、任意のスカラー $t$ によって、
 \[\boldsymbol{r}=\boldsymbol{p}+t(\boldsymbol{q}-\boldsymbol{p})\]
と表せます ($\boldsymbol{q}-\boldsymbol{p}$ の延長線上に $\boldsymbol{r}$ があります)。この式を少し整理すると
 \[\boldsymbol{r}=(1-t)\boldsymbol{p}+t\boldsymbol{q}\tag{1}\]
となります。これが ベクトルで表された直線の方程式 です。

直線の線形変換

位置ベクトル $\boldsymbol{p}$ と $\boldsymbol{q}$ が線形変換 $f$ によって、それぞれ $f(\boldsymbol{p})$ と $f(\boldsymbol{q})$ に写され、かつ $\boldsymbol{p}\neq \boldsymbol{q}$ であるとき、方程式 (1) で表される直線 $\boldsymbol{r}$ を $f$ で変換すると、
 \[f(\boldsymbol{r})=(1-t)f(\boldsymbol{p})+tf(\boldsymbol{q})\tag{2}\]
となり、$f(\boldsymbol{p})$ と $f(\boldsymbol{q})$ を結ぶ直線に写されることがわかります。
 
直線の線形変換(一次変換)
例として方程式
 \[5x-3y=2\tag{3}\]
で表される直線を行列 $A=\begin{bmatrix}1&-1\\3&2\end{bmatrix}$ で変換してみましょう。2通りの方法で解いてみます。

[1] 2点を変換する方法

まず直線上の 2 点を見つけます。
$(x,y)=(1,1)$ が (3) を満たすことは明らかです。適当な $x$ を (3) に放り込んで、もう1つの点を見つけることもできますが、$y$ が分数になると面倒なので、ちょっとしたテクニックを使って整数解を得ておきましょう。(3) を
 \[3y=5x-2\]
のように書き直して、右辺を強引に $5$ で括って
 \[3y=5(x-1)+3\]
とします。$3$ を左辺に移項すれば、
 \[3(y-1)=5(x-1)\tag{4}\]
となります。$k$ を任意の実数として、
 \[y-1=5k,\quad x-1=3k\tag{5}\]
で表される点はすべて (4) を満たします。$k=1$ とすれば $(x,y)=(4,6)$ が得られます。$(1,1)$ と $(4,6)$ を行列 $A$ によって変換すると
 \[\begin{align*}&\begin{bmatrix}1&-1\\3&2 \end{bmatrix}\begin{bmatrix}1\\1 \end{bmatrix}=\begin{bmatrix}0\\5 \end{bmatrix}\\[6pt]&\begin{bmatrix}1&-1\\3&2 \end{bmatrix}\begin{bmatrix}4\\6 \end{bmatrix}=\begin{bmatrix}-2\\24\end{bmatrix}\end{align*}\]
が得られます。$(0,5)$ と $(-2,24)$ を結ぶ直線の傾き $m$ を求めると、
 \[m=\frac{5-24}{0-(-2)}=-\frac{19}{2}\tag{6}\]
したがって、求める直線の方程式は
 \[y=-\frac{19}{2}x+5\]
となります。分母を払って整理すると
 \[19x+2y=10\tag{7}\]
が得られます。

[2] 逆行列を用いる方法

直線 $5x-3y=2$ の上にある点を $(x,y)$ とし、行列 $A=\begin{bmatrix}1&-1\\3&2\end{bmatrix}$ によって点 $(X,Y)$ に写されたとします。
 \[A\begin{bmatrix}x\\y \end{bmatrix}=\begin{bmatrix}X\\Y \end{bmatrix}\tag{8}\]
$A$ の逆行列を計算すると
 \[A^{-1}=\frac{1}{5}\begin{bmatrix}2&1\\-3&1\end{bmatrix}\tag{9}\]
となるので、これを (8) の両辺に左側から掛けて、
 \[\begin{bmatrix}x\\y\end{bmatrix}=\frac{1}{5}\begin{bmatrix}2&1\\-3&1\end{bmatrix}\begin{bmatrix}X\\Y \end{bmatrix}=\frac{1}{5}\begin{bmatrix}2X+Y\\-3X+Y\end{bmatrix}\tag{10}\]
$(x,y)$ を元の方程式 $5x-3y=2$ に代入して整理すると、
 \[19X+2Y=10\tag{11}\]
が得られます。

Pythonによる直線の線形変換

Python で直線を変換してみましょう。
以下のコードを実行するためには、コードライブラリ の coordinate() が必要です。

# python_linear_transformation_line

# In[1]

import numpy as np
import matplotlib.pyplot as plt

# FigureとAxes
fig, ax = plt.subplots(1, 1, figsize=(6, 6))

# 座標を設定
coordinate(ax, [-6, 6], [-6, 6])

# 直線5x-3y=2上の点
x = np.linspace(-6, 6, 65)
y = (5*x - 2)/3

# xとyを縦軸方向に連結
p = np.vstack((x, y))

# 変換行列aを定義
a = np.array([[1, -1],
              [3, 2]])

# 直線5x-3y=2を行列aで変換
ap = np.dot(a, p)

# 直線を表示
ax.plot(x, y, color = "blue", label = "5x-3y=2")
ax.plot(ap[0], ap[1], color = "red", label = "19x+2y=10")
ax.legend()

Pythonによる直線の線形変換 (line transform)

 

コメント

  1. HNaito より:

    (6)式の分子は 24-5 ではなく、5-24 だと思います。(11)式がどうしても 2Y+19X=10 にしかならず悩んでしまいましたが、プログラムの実行例の凡例も 19x+2y=10 となっていたのもう一度読み返して気づきました。
    なかなか内容が手ごわくて大変ですが、「線形代数」は何とか最後までやってみようと思いますので,よろしくお願いいたします。

    • あとりえこばと より:

      ご指摘の通りです。ご迷惑をおかけして申し訳ありません。
      記事は訂正しておきました。
      線形代数は学べば学ぶほど奥の深い学問ですし、習得すれば機械学習などプログラミングでやれることも大幅に広がります。ぜひ楽しみながら最後まで読んでいただけると嬉しいです。