線形システム入門 の履歴(No.3)

更新


目次

線形システムって何?

線形性

あるシステムに入力と出力があるとします。

  &uml( skinparam handwritten true skinparam componentStyle rectangle 入力 -> [システム] [システム]-right-> 出力 );

xx を入れると XX が出て、

  &uml( skinparam handwritten true skinparam componentStyle rectangle () "<i>x</i>" as IN () "<i>X</i>" as OUT IN -> [システム] [システム]-right-> OUT );

yy を入れると YY が出るとき、

  &uml( skinparam handwritten true skinparam componentStyle rectangle () "<i>y</i>" as IN () "<i>Y</i>" as OUT IN -> [システム] [システム]-right-> OUT );

(1) x+yx+y を入れれば必ず X+YX+Y が出る

  &uml( 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) kxkx つまり xxkk 倍を入れると必ず kXkX が出る

  &uml( skinparam handwritten true skinparam componentStyle rectangle () "<i>kx</i>" as IN () "<i>kX</i>" as OUT IN -> [システム] [システム]-right-> OUT );

の両方を満たすシステムを「線形なシステム」と言い、そのような性質を「線形性」と呼びます。

どうして「線形」と呼ぶの?

上記のシステムに 11 を入れた時の出力を DD とすると、
線形性により任意の入力 x=x1x=x\cdot 1 に対する出力は xDxD になります。

つまり、このシステムは入力に、11 に対する出力である DD を単に掛け算して出力するだけの単純なシステムであることが分かります。

これ、入力を横軸に、出力を縦軸に取ると比例のグラフ = 原点を通る直線のグラフになるので、「まあ確かに線形だねぇ」と納得できるはずです。

linear-system.png

え、それだけ?

ということで、入力が1つ、出力が1つしかない線形システムは「単なる定数倍」しかありえなくて、その「定数」は 11 を入力したときの出力である、ということで、これだけで話は終わりになってしまいます。

でも、入力がたくさん、出力がたくさんあると途端に話が複雑かつ面白くなり、さらにとても幅広く応用の効く内容が現れます。線形システムを扱う数学は線形代数と呼ばれます。

&uml( skinparam handwritten true skinparam componentStyle rectangle () "‥‥" as IN () "‥‥" as OUT 入力1 -> [システム] 入力2 -> [システム] IN -> [システム] 入力n -> [システム] [システム]-right-> 出力1 [システム]-right-> 出力2 [システム]-right-> OUT [システム]-right-> 出力m );

多入出力システムの線形性

上記の nn 入力 mm 出力のシステムが線形である、というのは次の性質を持つことを言います。

ii 番目の入力値が xix_i であるときに、ii 番目の出力が XiX_i であるとし、

  &uml( 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 );

ii 番目の入力値が yiy_i であるときに、ii 番目の出力が YiY_i であるとします。

  &uml( 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) ii 番目の入力が xi+yix_i+y_i であれば ii 番目の出力は Xi+YiX_i+Y_i である

  &uml( 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) ii 番目の入力が kxikx_i であれば ii 番目の出力は kXikX_i である

  &uml( skinparam handwritten true skinparam componentStyle rectangle () "<i>ka</i><sub>1</sub>" as IN1 () "<i>ka</i><sub>2</sub>" as IN2 () "‥‥" as IN () "<i>ka</i><sub>n</sub>" as INn () "<i>kA</i><sub>1</sub>" as OUT1 () "<i>kA</i><sub>2</sub>" as OUT2 () "‥‥" as OUT () "<i>kA</i><sub>m</sub>" as OUTm IN1 -> [システム] IN2 -> [システム] IN -> [システム] INn -> [システム] [システム]-right-> OUTm [システム]-right-> OUT [システム]-right-> OUT2 [システム]-right-> OUT1 );

1入力1出力の場合と比べると数が多い分だけ複雑そうに見えますが、

システムを通す前に足したり定数倍するのと、

システムを通した後に足したり定数倍するのと、

結果が同じになる

という性質は変わっておらず、これが線形性のキモになっています。

線形性 = 重ね合わせの原理

線形性は、分野によっては重ね合わせの原理、とも呼ばれます。

aa に対する出力 AA と、
bb に対する出力 BB と、が分かっていれば、
これらを重ね合わせた a+ba+b に対する出力は、
a,ba,b それぞれが単独であるときの出力 A,BA,B を重ね合わせた A+BA+B になる、ということです。

どんなところに線形システムが現れる?

もうほとんどありとあらゆるところに線形システムが現れます。

電気回路をはじめとした信号処理、光や音などの波動、量子力学で中心的な役割を果たしますし、 本来は非線形なシステムに対しても、入力を少しだけ変えた際の応答を線形と見なす「線形近似」を用いた解析が行われることが多く、そこでは線形代数が大活躍します。

行列やベクトルとの関係

線形代数を数学として学ぶと、多くの教科書では まず行列やベクトルが出てきて、 使い道が良く分からないままその足し算、掛け算、逆行列、ランク、固有値問題などを学んでいくことになりますが、 ここでは線形システムを考える際に自然に「行列」が必要になることを見ておきます。

入力、出力をベクトルを使って表す

毎回上記のような絵を描くのは大変なので、 数式を使って書くことを考えます。

nn 個の入力 x1,x2,,xnx_1,x_2,\dots,x_n や、mm 個の出力 X1,X2,,XmX_1,X_2,\dots,X_m をカッコで括ってひとまとめに書くことにします。

(x1x2xn),  (X1X2Xm) \begin{pmatrix} x_1\\x_2\\\vdots\\x_n \end{pmatrix}, \ \ \begin{pmatrix} X_1\\X_2\\\vdots\\X_m \end{pmatrix}

このように数値を縦に並べてカッコで括ったものを数ベクトルと呼びます。

数値を横に並べてカッコで括った、

(x1x2xn) \begin{pmatrix} x_1&x_2&\dots&x_n \end{pmatrix}

のようなものも数ベクトルと呼ばれます。

両者を呼び分ける際には「縦数ベクトル」や「横数ベクトル」と言います。

nn 個の数値を並べたベクトルのことを nn 次元数ベクトルと呼びます。

ベクトルの足し算、定数倍

ベクトル同士の足し算や、ベクトルの定数倍は、上記の線形性を念頭に

(a1a2an)+(b1b2bn)=(a1+b1a2+b2an+bn) \begin{pmatrix}a_1\\a_2\\\vdots\\a_n\end{pmatrix}+ \begin{pmatrix}b_1\\b_2\\\vdots\\b_n\end{pmatrix}= \begin{pmatrix}a_1+b_1\\a_2+b_2\\\vdots\\a_n+b_n\end{pmatrix}

および、

k(a1a2an)=(ka1ka2kan) k\begin{pmatrix}a_1\\a_2\\\vdots\\a_n\end{pmatrix}= \begin{pmatrix}ka_1\\ka_2\\\vdots\\ka_n\end{pmatrix}

と定義します。

この定義から明らかなように、異なる次元のベクトル同士にはベクトルの和は定義されません。

ベクトルを表す文字は太文字で書く

ベクトルを表す変数はよく太文字で書かれます。

a=(x1x2xn) \bm a=\begin{pmatrix} x_1\\x_2\\\vdots\\x_n \end{pmatrix}

のような感じ。

「システム」はベクトルの関数

上記のような「システム」は、入力 x\bm x を与えると出力 X\bm X を返すような関数

X=f(x)\bm X=f(\bm x)

と同一視できます。

1 を入力したときの出力

1入力1出力のときには、11 を入力したときの出力 DD さえ求まれば、 任意の入力に対する出力を求めることができました。

同様に、入力 nn 個のシステムの場合にも (100)\begin{pmatrix}1\\0\\\vdots\\0\end{pmatrix} に対する出力が F1\bm F_1 であるなら、

(x00)=x(100)\begin{pmatrix}x\\0\\\vdots\\0\end{pmatrix}=x\begin{pmatrix}1\\0\\\vdots\\0\end{pmatrix} に対する出力は xF1x\bm F_1 であることが分かります。

基本ベクトル

この考え方を進めるため、nn 次元数ベクトルの基本ベクトルというものを定義します。

ii 番目の基本ベクトル ei\bm e_i は、ii 番目の要素だけが 11 で、その他が 00 であるようなベクトルです。

ei=(00100)i\bm e_i= \begin{pmatrix}0\\\vdots\\0\\1\\0\\\vdots\\0\end{pmatrix} \begin{matrix}\\ \\ \\\leftarrow i\\ \\ \\ \end{matrix}

基本ベクトルに対する出力が分かればすべて分かる

基本ベクトル ei\bm e_i に対する出力を Fi\bm F_i としましょう。

Fi=f(ei) \bm F_i = f(\bm e_i)

任意のベクトルは基本ベクトルを使って、

a=(a1a2an)=1i=naiei \bm a=\begin{pmatrix}a_1\\a_2\\\vdots\\a_n\end{pmatrix}= \sum_1^{i=n} a_i\bm e_i

のように展開できるので、ff が線形なら

f(a)=f(1i=naiei)=1i=nf(aiei)=1i=naif(ei)=1i=naiFi f(\bm a)=f\Big(\sum_1^{i=n} a_i\bm e_i\Big)=\sum_1^{i=n} f(a_i\bm e_i)=\sum_1^{i=n} a_i f(\bm e_i)=\sum_1^{i=n}a_i\bm F_i

として求められます。

すなわち、基本ベクトルに対する出力が分かれば任意の入力に対する出力が分かるわけです。

行列


Counter: 2770 (from 2010/06/03), today: 2, yesterday: 4