線形システム入門 の履歴(No.5)
更新目次†
読者としては、線形代数をすでに学んだ人、あるいは学んでいる途中の人を想定しています。
線形システムって何?†
線形性†
あるシステム(ブラックボックス)に入力と出力があるとします。
¨( skinparam handwritten true skinparam componentStyle rectangle 入力 -> [システム] [システム]-right-> 出力 );
$x$ を入れると $X$ が出て、
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>x</i>" as IN () "<i>X</i>" as OUT IN -> [システム] [システム]-right-> OUT );
$y$ を入れると $Y$ が出るとき、
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>y</i>" as IN () "<i>Y</i>" as OUT IN -> [システム] [システム]-right-> OUT );
(1) $x+y$ を入れれば必ず $X+Y$ が出る
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>x</i>+<i>y</i>" as IN () "<i>X</i>+<i>Y</i>" as OUT IN -> [システム] [システム]-right-> OUT );
と、
(2) $kx$ つまり $x$ の $k$ 倍を入れると必ず $kX$ が出る
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>kx</i>" as IN () "<i>kX</i>" as OUT IN -> [システム] [システム]-right-> OUT );
の両方を満たすシステムを「線形なシステム」と言い、そのような性質を「線形性」と呼びます。
線形性は、
- 足してからシステムに入れるのと、システムに入れてから足すのは同じ
- 定数倍してからシステムに入れるのと、システムに入れてから足すのは同じ
とか、
- 和や定数倍と、システムを通す操作を入れ替え可能
とも言い換えられます。
線形性 = 重ね合わせの原理†
線形性は、分野によっては重ね合わせの原理、とも呼ばれます。
$a$ に対する出力 $A$ と、
$b$ に対する出力 $B$ と、が分かっていれば、
これらを重ね合わせた $a+b$ に対する出力は、
$a,b$ それぞれが単独であるときの出力 $A,B$ を重ね合わせた $A+B$ になる、
ということです。
どうして「線形」と呼ぶの?†
上記のシステムに $1$ を入れた時の出力を $F$ としましょう。
すると線形性により、任意の入力 $x=x\cdot 1$ に対する出力が $xF$ となることが分かります。
つまり、このシステムは入力に単に $F$ を掛け算して出力するだけの単純なシステムであることが分かるわけです。
これ、入力を横軸に、出力を縦軸に取ると比例のグラフ = 原点を通る直線のグラフになるので、「まあ確かに線形だねぇ」と納得できるはずです。
え、それだけ?†
ということで、入力が1つ、出力が1つしかない線形システムは「単なる定数倍」しかありえなくて、その「定数」は $1$ を入力したときの出力である、ということで、これだけで話は終わりになってしまいます。
でも、入力がたくさん、出力がたくさんあると途端に話が複雑かつ面白くなり、さらにとても幅広く応用の効く内容が現れます。線形システムを扱う数学は線形代数と呼ばれます。
¨( skinparam handwritten true skinparam componentStyle rectangle () "‥‥" as IN () "‥‥" as OUT 入力1 -> [システム] 入力2 -> [システム] IN -> [システム] 入力n -> [システム] [システム]-right-> 出力1 [システム]-right-> 出力2 [システム]-right-> OUT [システム]-right-> 出力m );
多入出力システムの線形性†
上記の $n$ 入力 $m$ 出力のシステムが線形である、というのは次の性質を持つことを言います。
$i$ 番目の入力値が $x_i$ であるときに、$i$ 番目の出力が $X_i$ であるとし、
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>x</i><sub>1</sub>" as IN1 () "<i>x</i><sub>2</sub>" as IN2 () "‥‥" as IN () "<i>x</i><sub>n</sub>" as INn () "<i>X</i><sub>1</sub>" as OUT1 () "<i>X</i><sub>2</sub>" as OUT2 () "‥‥" as OUT () "<i>X</i><sub>m</sub>" as OUTm IN1 -> [システム] IN2 -> [システム] IN -> [システム] INn -> [システム] [システム]-right-> OUTm [システム]-right-> OUT [システム]-right-> OUT2 [システム]-right-> OUT1 );
$i$ 番目の入力値が $y_i$ であるときに、$i$ 番目の出力が $Y_i$ であるとします。
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>y</i><sub>1</sub>" as IN1 () "<i>y</i><sub>2</sub>" as IN2 () "‥‥" as IN () "<i>y</i><sub>n</sub>" as INn () "<i>Y</i><sub>1</sub>" as OUT1 () "<i>Y</i><sub>2</sub>" as OUT2 () "‥‥" as OUT () "<i>Y</i><sub>m</sub>" as OUTm IN1 -> [システム] IN2 -> [システム] IN -> [システム] INn -> [システム] [システム]-right-> OUTm [システム]-right-> OUT [システム]-right-> OUT2 [システム]-right-> OUT1 );
システムが線形であれば、以下の両方が満たされる。
(1) $i$ 番目の入力が $x_i+y_i$ であれば $i$ 番目の出力は $X_i+Y_i$ である
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>x</i><sub>1</sub>\n+\n<i>y</i><sub>1</sub>" as IN1 () "<i>x</i><sub>2</sub>\n+\n<i>y</i><sub>2</sub>" as IN2 () "\n‥‥" as IN () "<i>x</i><sub>n</sub>\n+\n<i>y</i><sub>n</sub>" as INn () "<i>X</i><sub>1</sub>\n+\n<i>Y</i><sub>1</sub>" as OUT1 () "<i>X</i><sub>2</sub>\n+\n<i>Y</i><sub>2</sub>" as OUT2 () "\n‥‥" as OUT () "<i>X</i><sub>m</sub>\n+\n<i>Y</i><sub>m</sub>" as OUTm IN1 -> [システム] IN2 -> [システム] IN -> [システム] INn -> [システム] [システム]-right-> OUTm [システム]-right-> OUT [システム]-right-> OUT2 [システム]-right-> OUT1 );
(2) $i$ 番目の入力が $kx_i$ であれば $i$ 番目の出力は $kX_i$ である
¨( skinparam handwritten true skinparam componentStyle rectangle () "<i>kx</i><sub>1</sub>" as IN1 () "<i>kx</i><sub>2</sub>" as IN2 () "‥‥" as IN () "<i>kx</i><sub>n</sub>" as INn () "<i>kX</i><sub>1</sub>" as OUT1 () "<i>kX</i><sub>2</sub>" as OUT2 () "‥‥" as OUT () "<i>kX</i><sub>m</sub>" as OUTm IN1 -> [システム] IN2 -> [システム] IN -> [システム] INn -> [システム] [システム]-right-> OUTm [システム]-right-> OUT [システム]-right-> OUT2 [システム]-right-> OUT1 );
1入力1出力の場合と比べると数が多い分だけ複雑に見えますが、
システムを通す前に足したり定数倍するのと、
システムを通した後に足したり定数倍するのと、
結果が同じになる
という性質は変わっておらず、これが線形性のキモになっています。
どんなところに線形システムが現れる?†
ありとあらゆるところに線形システムが現れます。
電気回路をはじめとした信号処理、光や音などの波動、量子力学で中心的な役割を果たしますし、 本来は非線形なシステムに対しても、入力を少しだけ変えた際の応答を線形と見なす「線形近似」を用いた解析が行われることが多く、そこでは線形代数が大活躍します。
微分や積分演算、
$$ \frac{d}{dx}\Big( f(x)+g(x) \Big)=f'(x) + g'(x) $$
$$ \int_a^b\big[ f(x)+g(x)\big] dx=\int_a^b f(x) dx+\int_a^b g(x) dx $$
他の関数との掛け算、
$$ h(x)\Big(f(x)+g(x)\Big)=h(x)f(x)+h(x)g(x) $$
入力の平行移動
$$ \Big(f(x)+g(x)\Big)\Big|_{x\to x+c}=f(x)|_{x\to x+c}+g(x)|_{x\to x+c}=f(x+c)+g(x+c) $$
などが線形な演算で、これら線形演算の合成演算もすべて線形になるため、非常に複雑に見えるシステムでも当然のように重ね合わせの原理が使えたりします。
行列やベクトルとの関係†
線形代数を数学として学ぶと、多くの教科書では まず行列やベクトルが出てきて、 使い道が良く分からないままその足し算、掛け算、逆行列、ランク、固有値問題などを学んでいくことになりますが、 ここでは線形システムを考える際に自然に「行列」が出てくることを見ておきます。
入力、出力をベクトルを使って表す†
毎回上記のような絵を描くのは大変なので、 数式を使って書くことを考えます。
ひとまず $n$ 個の入力 $x_1,x_2,\dots,x_n$ や、$m$ 個の出力 $X_1,X_2,\dots,X_m$ がすべて数値である場合を考え、それらをカッコで括ってひとまとめに書きましょう。
$$ \begin{pmatrix} x_1\\x_2\\\vdots\\x_n \end{pmatrix}, \ \ \begin{pmatrix} X_1\\X_2\\\vdots\\X_m \end{pmatrix} $$
このように数値を縦に並べてカッコで括ったものを数ベクトルと呼びます。
特に、$n$ 個の数値を並べたベクトルのことを $n$ 次元数ベクトルと呼びます。
ベクトルの足し算、定数倍†
ベクトル同士の足し算や、ベクトルの定数倍は、上記の線形性を念頭に
$$ \begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix}+ \begin{pmatrix}y_1\\y_2\\\vdots\\y_n\end{pmatrix}= \begin{pmatrix}x_1+y_1\\x_2+y_2\\\vdots\\x_n+y_n\end{pmatrix} $$
および、
$$ k\begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix}= \begin{pmatrix}kx_1\\kx_2\\\vdots\\kx_n\end{pmatrix} $$
と定義します。
ベクトルを表す文字は太文字で書く†
ベクトルを表す変数はよく太文字で書かれます。
$$ \bm x=\begin{pmatrix} x_1\\x_2\\\vdots\\x_n \end{pmatrix} $$
のような感じ。
「システム」はベクトルの関数†
上記のような「システム」は、入力にベクトル $\bm x$ を与えると出力にベクトル $\bm X$ を返すような関数
$$\bm X=f(\bm x)$$
と同一視できます。
このとき線形性は次のように書けます。
$$f(\bm x+\bm y)=f(\bm x)+f(\bm y)$$
$$f(k\bm x)=kf(\bm x)$$
1 を入力したときの出力†
1入力1出力のときには、$1$ を入力したときの出力 $F$ さえ求まれば、 任意の入力 $x$ に対する出力 $X$ を $X=Fx$ として求めることができました。
同様に、入力が $n$ 個のシステムの場合にも、例えば
$\begin{pmatrix}1\\0\\\vdots\\0\end{pmatrix}$ に対する出力が $\bm F_1$ であるなら、
$\begin{pmatrix}x\\0\\\vdots\\0\end{pmatrix}=x\begin{pmatrix}1\\0\\\vdots\\0\end{pmatrix}$ に対する出力は $x\bm F_1$ であることが分かります。
基本ベクトル†
この考え方を進めるため、$n$ 次元数ベクトルの「基本ベクトル」というものを定義します。
「$i$ 番目の基本ベクトル $\bm e_i$ 」とは、$i$ 番目の要素だけが $1$ で、その他が $0$ であるようなベクトルです。
$\bm e_i= \begin{pmatrix}0\\\vdots\\0\\1\\0\\\vdots\\0\end{pmatrix} \begin{matrix}\\ \\ \\\leftarrow i\\ \\ \\ \end{matrix}$
基本ベクトルに対する出力が分かればすべて分かる†
任意の $n$ 次元ベクトルを $n$ 次元基本ベクトル $\bm e_i$ を使って、
$$ \bm x=\begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix}= x_1\begin{pmatrix}1\\0\\\vdots\\0\end{pmatrix}+ x_2\begin{pmatrix}0\\1\\\vdots\\0\end{pmatrix}+\dots+ x_n\begin{pmatrix}0\\0\\\vdots\\1\end{pmatrix}= \sum_{i=1}^n x_i\bm e_i $$
のように展開できることが重要になります。
線形なシステム $f$ に対して、基本ベクトル $\bm e_i$ に対する出力を $\bm F_i$ としましょう。
$$ \bm F_i = f(\bm e_i) $$
このとき、任意の入力ベクトル $\bm x$ に対する出力は、線形性を使って式変形することで、
$$ f(\bm x)=f\Big(\sum_{i=1}^n x_i\bm e_i\Big)=\sum_{i=1}^n f(x_i\bm e_i)=\sum_{i=1}^n x_i f(\bm e_i)=\sum_{i=1}^nx_i\bm F_i $$
のように表せます。
つまり、ベクトル $\bm x$ の $n$ 個の成分 $x_i$ に、対応する基本ベクトルに対する出力 $\bm F_i$ を掛けて足し合わせれば求められることになります。
行列†
上記の $n$ 本の $m$ 次元ベクトル $\bm F_i$ のそれぞれの成分を、
$$ \bm F_i=\begin{pmatrix}F_{i1}\\F_{i2}\\\vdots\\F_{im}\end{pmatrix} $$
と書くことにすると、上の式を成分まで書き表せて、
$$ f(\bm x) = \sum_{i=1}^n x_i\bm F_i =\begin{pmatrix} \sum_{i=1}^n x_i F_{i1} \\ \sum_{i=1}^n x_i F_{i2} \\ \vdots \\ \sum_{i=1}^n x_i F_{im} \\ \end{pmatrix} =\begin{pmatrix} x_1 F_{11} + x_2 F_{21} +\dots+x_n F_{n1} \\ x_1 F_{12} + x_2 F_{22} +\dots+x_n F_{n2} \\ \vdots \\ x_1 F_{1m} + x_2 F_{2m} +\dots+x_n F_{nm} \\ \end{pmatrix} $$
となります。
そこで、このシステム $f$ の特性すべてを表す $n\times m$ 個の数値 $F_{ij}$ を縦横に並べた次の $F$ のようなものを「行列」と呼び、
$$ F=\begin{pmatrix} F_{11}&F_{12}&\dots&F_{1n}\\ F_{21}&F_{22}&\dots&F_{2n}\\ \vdots&\vdots&\ddots&\vdots\\ F_{m1}&F_{m2}&\dots&F_{mn}\\ \end{pmatrix} $$
行列とベクトルとの掛け算を、
$$ F\bm x= \begin{pmatrix} F_{11}&F_{12}&\dots&F_{1n}\\ F_{21}&F_{22}&\dots&F_{2n}\\ \vdots&\vdots&\ddots&\vdots\\ F_{m1}&F_{m2}&\dots&F_{mn}\\ \end{pmatrix} \begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix} = \begin{pmatrix} F_{11} x_1 + F_{21} x_2 +\dots+F_{n1} x_n \\ F_{12} x_1 + F_{22} x_2 +\dots+F_{n2} x_n \\ \vdots \\ F_{1m} x_1 + F_{2m} x_2 +\dots+F_{nm} x_n \\ \end{pmatrix} $$
と定義すると、
入力となる $n$ 次元ベクトル $\bm x$ と、
システムの特性を表す $m\times n$ 行列 $F$ を用いて、
出力となる $m$ 次元ベクトル $\bm X=f(\bm x)$ は、
$$ \bm X=f(\bm x)=F\bm x $$
のように簡単に書けます。
1入力1出力の線形システムが、ある数値 $F$ を用いて $f(x)=F x$ と書ける形に限られたのと、
$n$ 入力 $m$ 出力の線形システムが、ある行列 $F$ を用いて $f(\bm x)=F\bm x$ と書ける形に限られたのと、
そっくりな形になっていますね。
ベクトルのベクトルとしての行列†
上記の行列 $F$ は $n$ 本のベクトル $\bm F_i$ を横に並べた
$$ F=\Big(\bm F_1\ \ \ \bm F_2\ \ \ \dots\ \ \ \bm F_n\Big) $$
と同一視でき、これとベクトルとの掛け算を $1\times n$ 行列と $n$ 次元ベクトルとの掛け算と同じように計算できます。
$$ F\bm x=\Big(\bm F_1\ \ \ \bm F_2\ \ \ \dots\ \ \ \bm F_n\Big) \begin{pmatrix}x_1\\x_2\\\dots\\x_n\end{pmatrix}= x_1\bm F_1 + x_2\bm F_2+ \dots+ x_n\bm F_n $$
線形性†
行列の掛け算を導入すると、システム $f(\bm x)=F\bm x$ の線形性 $f(\bm x+\bm y)=f(\bm x)+f(\bm y)$ は、
$$ f(\bm x+\bm y)=\underbrace{F(\bm x+\bm y)=F\bm x+F\bm y}_\text{分配法則}=f(\bm x)+f(\bm y) $$
のように「行列とベクトルとの積に分配法則が成り立つこと」 に対応し、
$f(k\bm x)=kf(\bm x)$ は、
$$ f(k\bm x)=\underbrace{F(k\bm x)=kF\bm x}_\text{交換法則}=k\bm X $$
のように「行列とベクトルとの積と、普通の数値との積を交換できること」に対応することが分かります。
「線形システムを通す」という「演算」は、「掛け算」と非常に似た性質を持っていて、 「行列 $F$ を掛ける」という操作で表す上記の表記法ととても相性が良い、 という点を理解できると思います。
行列同士の掛け算†
2つの線形システム $f(\bm x)=F\bm x$ と $g(\bm X)=G\bm X$ とを直列につないだ複合システム $g\circ f$ は、
$$g\circ f(\bm x)=g(f(\bm x))=G f(\bm x)=GF\bm x$$
¨( skinparam handwritten true skinparam componentStyle rectangle package "システム f◦g" { [システムf]-right->[システムg] } x -up-> [システムf] [システムg]-right-> GFx );