【解析数学 1.1】ヤコビ行列 -導入編-

前書き

 こないだ僕のTwitterアカウントに対してフォロワーさんからDMでヤコビ行列に関するご質問を頂きました。その質問の内容を大まかに一言で言うと「ヤコビ行列の定義を教えてください」と言ったものだったのですが、ヤコビ行列については僕もあまり積極的に扱ったことが無かったので、ちょいちょいと調べた上で得られた見解をお答えするという形で返信しました。その結果、質問者の方から称賛の言葉を頂いた上に、こちらとしても色々と調べていく中でかなり勉強になった点がいくつかあったので、それらについて(主に工学者向けに)アウトプットしてみたいと思います。

 ただ、これらについて自分なりに分かりやすく解説しようとすると、結構な文量と時間を持ってかれたので、この記事ではヤコビ行列の定義およびそれに関わるキーワードの解説について記述し、本題については後日から分けて書こうと思います。

 また、レベルとしては大学1年目辺りで線形代数微分積分を習ったよって人を対象にしました。もっと具体的に言いますと

この2点を満たしておくと良いでしょう。もし、この記事をこれから読もうとする方で、その辺を全くやった事が無い・不安な人が居たら、以下の記事がオススメです。

zendjp.com

qiita.com


目次


ポイント

 今回の記事のポイントはこちらです。分からなくても良いので、とりあえずサラサラっと読んでみてください! 

ヤコビ行列は多変数ベクトル値関数の局所的な傾きを表した行列であり、
多変数ベクトル値関数 \boldsymbol{f}(\boldsymbol{x}) \boldsymbol{f}(\boldsymbol{x}) =  \boldsymbol{f}(x_1, x_2, \cdots, x_n) = 
\left[
\begin{array}{c}
f_1(x_1, \cdots, x_n) \\
f_2(x_1, \cdots, x_n) \\
\vdots \\
f_m(x_1, \cdots, x_n)
\end{array}
\right]


とすると、ヤコビ行列 \boldsymbol{J_f}(\boldsymbol{x}) 
\boldsymbol{J_f}(\boldsymbol{x}) = D_x\boldsymbol{f} = 
\frac{\text{d}f}{\text{d}\boldsymbol{x}}

= 

\left[
\begin{array}{c}
\frac{\text{d}f_1}{\text{d}\boldsymbol{x}} \\
\vdots \\
\frac{\text{d}f_m}{\text{d}\boldsymbol{x}}
\end{array}
\right]

=

\begin{bmatrix}
\frac{\text{d}f_1}{\text{d}x_1} & \cdots & \frac{\text{d}f_1}{\text{d}x_n} \\
\vdots & \ddots & \vdots \\
\frac{\text{d}f_m}{\text{d}x_1} & \cdots & \frac{\text{d}f_m}{\text{d}x_n}
\end{bmatrix}


と表される。

 上記の意味が分からなかった人の中には「数式に入る前から意味分からん!」ってなった人も居るかと思われます。ですので、この次の節では文中で出てきた用語の意味について解説し、その後でどうしてヤコビ行列がこの形で表されるかというのを解説したいと思います。


用語の整理

 この記事で整理しなければいけない用語は、ポイントの文の最初に出てきた

ヤコビ行列は多変数ベクトル値関数の局所的な傾きを表した行列

の内の多変数ベクトル値関数局所的な傾きの2点でしょう。なのでこの導入編ではこの2点について解説したいと思います。

局所的な傾き

f:id:SzShow:20190926000713j:plain
曲った線や面も細かく見れば真っ直ぐ! そして、微分はそのまっすぐな線の傾き!

 これについては手っ取り早く答えから言ってしまうと、微分の事です。正直、「変な言い換えとかせずに最初から微分って言った方がよくない?」と考えた事もあったのですが、微分値が関数のその点での傾き(または変化量)を示すものであるという事を強調した方が今後の説明も直感的に理解できそうかなと考えたので、敢えてここではあっさりとした説明で済ませます。

 その上で早速ポイント1を見直してみると、ヤコビ行列というのは、多変数ベクトル値関数というよく分からん関数の微分と言い換えることができそうです。しかしそうなると新たな疑問として「なんで関数を微分したのに微分が行列になるんだ?」と考える人も居ると思うので、その疑問を解消するためにも次は多変数ベクトル値関数が何なのかを調べてみましょう。

多変数ベクトル値関数

f:id:SzShow:20191019172013j:plain
多変数ベクトル関数は、変数が2つ以上、取る値がベクトルの関数! まずは多変数関数とベクトル値関数から覚えよう!

 導入編におけるメイントピックです。まず名前からして小難しいなので、まずはそのベースとなっている多変数関数とベクトル値関数を分けて説明するのですが、その2つはどちらも奥深く、工学や物理学の双方でとても重要な役目を果たすことも多いので、具体例と併せて確認してくださればと思います。

多変数関数

 今までの関数は一つの値(要因)の変化によって出力値(結果)が大きく変わっていました。ただ、実際にモノがぶつかったときに掛かる力はスピードだけでなく、その重さにも変化するなど、複数の要因で結果が変わる現象もあります。そういった複数の要因によって効果が変動するような現象の数理モデル化にとても有用なのが多変数関数です。では、実際に定義と例を見てみましょう。

変数を2個以上持つ関数。例えば、

1.  x-y平面上のある地点での高さ hの分布関数(標高を示した地図など)
 h = f(x, y)

2. 物理で言う運動量 p. ただし、 mは重さで vは速度を表す。
 p = f(m, v) = mv

3. 一般的な記述( {\boldsymbol x} = \left[x_1, x_2, \cdots, x_n\right]はベクトルである事に注意)
 y = f({\boldsymbol x}) = f(x_1, x_2, ..., x_n)

 この例だけでも実際の数値が伴っていないので、まだまだ抽象的すぎると感じる人が居るかと思われます。なので、具体例1より h = f(x, y) = -x^{2}-y^{2}+1としたものをPythonよりグラフ描画したものを以下に用意しました。今までの1変数のみの関数は平面上の線として描く事ができましたが、2変数の関数となると3次元空間上の曲面として描く必要がある事に注目してください。

f:id:SzShow:20191019214349j:plain
今までの関数だと二次元平面上に曲線を書いていたのが、2変数関数だと3次元空間上にある曲面となっている事に注目

ベクトル値関数

 高校や大学受験などで物理をやった人の中には放物直線運動の問題を解く際に x座標と y座標を分けて書くのが面倒だと感じた人もいるかも知れません。しかし、 x座標と y座標の位置が別々に考えられることを利用すれば、(有用なのかは分かりませんが)ベクトルを利用して一括で数式をまとめて書くこともできそうです。ここで紹介したいのが、時間などの1つの要因によって x上の位置と y上の位置という複数の結果をモデル化するのに有用となるベクトル値関数です。

 早速、以下より定義を見てみましょう。

出力がベクトルである関数。例えば

1. 時間経過によって x-y平面上を動く点の座標を示す関数
 (x, y) = f(t)

2. 普通の(ベクトルでない)数値 xに対して、ベクトル {\boldsymbol y} = \left[y_1, y_2, \cdots, y_n\right]を返す関数
 (y_1, y_2, ..., y_n) = f(x)

3. 出力ベクトルの各要素にそれぞれ別の関数が設定されているという見方
 {\boldsymbol f}(x) = 
\left[
\begin{array}{c}
 f_1(x) \\ f_2(x) \\ \vdots \\ f_n(x)
\end{array}
\right]

 ベクトル値関数の例として、3次元空間上を x=\cos{2\pi0.2t}, y=\sin{2\pi0.2t}, z=tで動く点 \boldsymbol{p} = (p_x, p_y, p_z)、つまり

 
\boldsymbol{p} = \boldsymbol{f}(t) = 

\left[
\begin{array}{c}
 p_x(t) \\ p_y(t) \\ p_z(t)
\end{array}
\right]

=

\left[
\begin{array}{c}
 \cos{2\pi0.2t} \\ \sin{2\pi0.2t} \\ t
\end{array}
\right]

 0 \leq t \leq 10における軌跡を以下にグラフ描画しました。(時間によって位置が変化することを強調するために (t)を追記してます)

f:id:SzShow:20191019173311g:plain
ベクトル値関数の例。時間が経過するに連れて、螺旋を描きながら上へと上がっている事に注目

多変数ベクトル値関数

 お待たせしました。勘の良い人なら以上2つの説明を聞いた時に「多分、二つとも組み合わせたものが多変数ベクトル値関数なんだな」と考えたと思いますが、それで正解です。

 では、多変数ベクトル値関数の定義を例も併せて見てみましょう。

変数が2個以上かつ、出力がベクトルである関数。例えば、

1. 極座標 (r, \theta)から直交座標 (x, y)への変数変換
 (x, y) = f(r, \theta) = (r\cos{\theta}, r\sin{\theta}) 

2. 変数 {\boldsymbol x} = (x_1, x_2, \cdots, x_n)と出力 {\boldsymbol b} = (b_1, b_2, \cdots, b_m)の関係について
 係数行列 {\boldsymbol A}で示した線型方程式系(一次連立方程式)
 ( n \neq mの時は解が無い事に注意)
 \color{aqua}{{\boldsymbol b}} = f({\boldsymbol x}) = {\boldsymbol A}\color{red}{{\boldsymbol x}}
 
\left[
\begin{array}{c}
\color{aqua}{b_1} \\ 
\color{aqua}{b_2} \\
\color{aqua}{\vdots} \\ 
\color{aqua}{b_m}
\end{array}
\right]

=

\begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1n} \\
a_{21} & a_{22} & \cdots & a_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
a_{m1} & a_{m2} & \cdots & a_{mn} 
\end{bmatrix}

\left[
\begin{array}{c}
\color{red}{x_1} \\ 
\color{red}{x_2} \\
\color{red}{\vdots} \\ 
\color{red}{x_n}
\end{array}
\right]


3. 一般的な記述(変数の数を n、出力の要素数 mとした)
 {\boldsymbol f}({\boldsymbol x}) = 

\left[
\begin{array}{c}
f_1({\boldsymbol x}) \\
f_2({\boldsymbol x}) \\
\vdots \\
f_m({\boldsymbol x})
\end{array}
\right]

=

\left[
\begin{array}{c}
f_1(x_1, x_2, \cdots, x_n) \\
f_2(x_1, x_2, \cdots, x_n) \\
\vdots \\
f_m(x_1, x_2, \cdots, x_n)
\end{array}
\right]


また、1.の例を3.の書き方に倣って変形すると、


\left[
\begin{array}{c}
x \\ y
\end{array}
\right]

=

\left[
\begin{array}{c}
f_1(r, \theta) \\ f_2(r, \theta)
\end{array}
\right]

=

\left[
\begin{array}{c}
r\cos{\theta} \\ r\sin{\theta}
\end{array}
\right]


と書ける。

 多変数ベクトル値関数の具体例としては上記に挙げた通り座標変換や一次連立方程式などのベクトルを入力してベクトルを出力するもの挙げられ、例えば、3次元ベクトル \boldsymbol{v} = (v_x, v_y, v_z) x-y平面上のベクトル \boldsymbol{u} = (u_x, u_y)まで射影する関数 f: \mathbb{R}^{3} \rightarrow \mathbb{R}^{2}

 
\boldsymbol{u} = \boldsymbol{f}(\boldsymbol{v}) = 

\begin{bmatrix}
1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 
\end{bmatrix}

\left[
\begin{array}{c}
 v_x \\ v_y \\ v_z
\end{array}
\right]
=

\left[
\begin{array}{c}
 v_x \\ v_y \\ 0
\end{array}
\right]

が当てはまります。(下記参照)

f:id:SzShow:20191019193238g:plain
3次元空間のベクトル(青)を2次元空間へのベクトル(赤)まで射影したもの。射影の様子を分かりやすくするために入力ベクトルを回転してみました(色がちょっと変になっててスミマセン)

より身近な例で言うと、Google Earthなどで地球全体を見渡してから特定の地域の地図を見ると言った操作なども多変数ベクトル値関数が関係しています。(この辺りについて数式で説明するとまた難しくなっちゃうので、気になった人は以下の参考リンクなどから多様体という分野について調べてみてください)


ここまでのまとめ

 以上の説明よりとりあえず、局所的な傾きというのは微分であるという点と入力も出力も複数個あるのが多変数ベクトル値関数であるという点については伝わったかなと思います。これを踏まえて

ヤコビ行列は多変数ベクトル値関数の局所的な傾きを表した行列

を言い換えてみると、

ヤコビ行列は入力も出力も複数の値を持つ関数の微分を表した行列

と見なす事ができそうです。ただ、ここで一つ問題が出てきました。


入力も出力も複数持つ関数の微分はどうやるんだろう?


 入力が複数あるだけなら、微分積分で習った偏微分を使えば行けそうですし、出力が複数あるだけなら出力の要素をそれぞれ微分すれば行けそうですが、どっちも両方あった場合はちょっとよく分からない事になりそうです。

 これについて考える為に次回では多変数関数とベクトル値関数の微分についておさらいしてみましょう!


おまけ(グラフのソースコード

 需要があるかは分かりませんが、以下に多変数関数とベクトル値関数のグラフの描画に使ったPythonコードをシェアしておきます。Pythonでオリジナルのコードを書いたのはこれで初めてなのもあり、一部非効率な記述があると存じますが、少しでも理解の助けとなれば嬉しい限りです。

(上から順に『射影関数』『螺旋関数』『2変数関数』となっています)

Jacobian -Introduce-