HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

フーリエ変換と線形システム【振動解析への応用】

 

 

follow us in feedly

https://cdn.blog.st-hatena.com/images/theme/og-image-1500.png

はじめに

工学の場で非常に多く現れるのが「振動」という現象です。 地震のように、人が肌身で実感できるような振動も世の中にはありますが、世の中に存在する振動の多くは人間には実感できない場所にひっそりと存在していたりします。そして、その振動の原理を知らないがために作ったものが共振現象によって、壊れたり、異音を発したり、ということが起こってしまいます。

今回は振動現象を数理を持って簡単に把握するためのテクニックを紹介します。

線形システム

入力 $a$ 倍で出力も $a$ 倍

今回は「線形システム」なる概念から始めます。線形システムとは、入力を $a$ 倍にしたら出力も $a$ 倍になるようなシステムのことを言います。ここで入力と読んでいるものに関しては $u(t)$ で表し、時間波形のようなものを想定しましょう(一般的には時間波形=時間の関数でなくても良いが、今回は振動を想定しているので時間波形を例題に使う)。

つまり線形システムというものを $\rm LinearSystem(\cdot)$ で表すことにしておくと、線形システムが $u(t)$ という波形を入力された場合に$x(t)$ を出力するとします。つまりちゃんと書き表しておけば下記のようになります。

$$ x(t) = {\rm LinearSystem}(u(t)) $$

では、今度は元々の波形 $u(t)$ を $a$ 倍した(単に振幅だけが大きくなった)波形である $a u(t)$ を線形システムに入力したらどうなるでしょうか。一般のシステムであればシステムの数理を明らかにして「計算をする」しか方法がありません。しかし、線形システムの場合は入力が $a$ 倍されたら、出力も $a$ 倍という規則があるので、迷わずに

$$ ax(t) = {\rm LinearSystem}(au(t)) $$

と書くことができます。つまり波形 $u(t)$ を入力した場合のシステムの振る舞いを把握しておけば、その $a$ 倍が入力された場合の全てを把握できたことになるのです。これは線形システムならではの便利さです。

後で足しても先に足しても同じ

さて、線形システムのもう1つの重要な振る舞いを示しておきましょう。 波形 $u_1(t)$ を入れたときの $\rm LinearSystem (\cdot)$ の出力を $x_1(t)$ とします。更に $u_2(t)$ を入れたときの出力は $x_1(t)$ であるとします。すなわち数式でこれを記述しておくならば下記のようになります。

$$ \begin{align} x_1(t) = {\rm LinearSystem}(u_1(t)) \\ x_2(t) = {\rm LinearSystem}(u_2(t)) \end{align} $$

さて、このような場合に $u_1(t)$ と $u_2(t)$ を同時に入力したら、どんな波形が出力されるでしょうか。答えをさっさと書いてしまえば、下記が成り立ちます。

$$ x_1(t) + x_2(t) = {\rm LinearSystem}(u_1(t) + u_2(t)) $$

これが何を表しているかというと、$u_1(t)$ を入力したときの振る舞いを把握しておき、更に $u_2(t)$ を入れたときの振る舞いも把握しておけば、$u_1(t) + u_2(t)$ という足し合わせた波形に対する振る舞いも把握できたことになるということを表しています。これは何か驚くべきことのなのか、パッとは理解できないように思うかもしれません。しかし、次のまとめでそれを実感しましょう。

線形システムのまとめ

上記2つの性質をまとめると線形システム $\rm LinearSystem(\cdot)$ (長ったらしいので $\rm LS$ と略記します)は下記を満たします。

$$ {\rm LS}(au_1(t) + bu_2(t)) = a{\rm LS}(u_1(t)) + b{\rm LS}(u_2(t)) $$

これはすなわち、入力波形の線形結合をおこなってから ${\rm LS}(\cdot)$ の出力を見るのも、入力波形1つ1つの出力を見てから線形結合するのも全く同じということです。これは極めて便利な性質です。なぜなら、一見デタラメに見える一般の波形 $u(t)$ に関して、実はこれがもっと単純な波形 $u_n(t)$ を足し合わせたものである、すなわち

$u(t) = a_0 + a_1u_1(t) + a_2u_2(t) + \cdots$

であると言えたならば、$\rm LS(\cdot)$ の振る舞いを調べる上では、左辺を入力に取ろうが右辺を入力に取ろうが、やりやすい方を選べばいいからです。そして、「なんかよく分からん $u(t)$ という波形を簡単な波形 $u_n(t)$ の足し合わせで表しましょう」という場合に、「簡単な波形 $u_n(t)$ としてどんなものを使うのか」を約束しておけば、線形システムに関しては、人類はいつでもその簡単な波形 $u_i(t)$ の振る舞いだけを把握しておけば良いということになります(いつでも、その簡単な波形の振る舞いを後から足せば良いのだから!)。

我々人類は、その簡単な波形 $u_n(t)$ として下記の波形を選ぶことにしました。

$$ u_n(t) = \exp(2\pi i f_0 n t ) $$

ここに $f_0$ は基本周波数と呼ばれるもので、$i$ は虚数単位です。ここで $f_0$ をどう選ぶんですか?という問題がありますが、解析したい波形 $u(t)$ と周期(あるいは周波数)を見て決めます。

フーリエ級数展開とフーリエ変換

波形 $u(t)$ が周期的な波形であり、その周期が $T_0$ であるとき周波数は $f_0 = 1/T_0$ であります(これを基本周波数と呼ぶ)。 基本周波数が分かってしまえば、あとは周期波形波形 $u(t)$ は必ず下記のように分解できることが知られています。

$$ \begin{align} u(t) &= a_0 + a_1 \exp(2\pi i f_0 1 t ) + a_2 \exp(2\pi i f_0 2 t ) + \cdots \\ u(t) &= \sum_{n=0} ^{\infty} a_n \exp(2\pi i f_0 n t ) \end{align} $$

さて、線形システム $\rm LS(\cdot)$ の「入力を線形結合してから出力を得ても、出力を得てから線形結合しても一緒」という性質を思い出しましょう。私たちは何だかよくわからない周期波形 $u(t)$ を入力したときに、どんな出力が得られるのかをいちいち計算する必要などはありません。上記の式のいつでも右辺のように分解できることを知っているのですから。これをフーリエ級数展開と呼びます。

もしも周期波形でなかったら、上手に分解することができないのでしょうか…?実はできます。

$$ u(t) = \int_f a(f) \exp(2\pi i f t )df $$

とします。和が積分になっているだけですね。 基本周波数 $f_0$ を調べて、その $n$ 倍だけを扱っていたのが無限に細かい $df$ 毎に足し合わせていくというものに変わっただけです(これは非周期波形を、周期$T$が無限に長い周期波形であるとみなしたからである。周期が無限に長いので基本周波数は無限に小さくなります。その無限に小さな基本周波数を $df$ としてしまっていると考えれば、式の直感的な対応は得られるでしょう)。これをフーリエ逆変換と呼びます。

線形システムとフーリエ変換のストーリー

さあ、線形システムに $u(t)$ という波形を入力するとどうなるでしょうか。これを知るためには、$u(t)$ を簡単な波形の和に分解してしまい、簡単な波形の方に対する振る舞いだけを把握して後で足し合わせればいいというストーリーでした。そして、人類は簡単な波形としていつでも $\exp(2\pi f t)$ が選べると知っています。そうなれば、具体的に知っておくべきなのは、ある線形システム $\rm LS(\cdot)$ に波形$\exp(2\pi i f t)$ を入れたらどうなるのだろうか?ということだけです。$\exp(2\pi i ft)$に対する線形システムの振る舞い${\rm LS} (\exp(2\pi i ft))$さえ把握しておけば、いつでも後で、適当に足し合わせるだけでいいからです。

さあ、任意の波形 $u(t)$ の振る舞いを調べたいときは、こいつがフーリエ逆変換されたときに、すなわち

$$ u(t) = \int_f a(f) \exp(2\pi i f t )df $$

とした場合に $a(f)$ がどんな値になっているかということに興味があります。 $a(f)$ さえ分かってしまえば、私たちは ${\rm LS} (\exp(2\pi i ft))$の振る舞いは調べてあるので、あとは掛け算と足し算を細かく根気強く(コンピュータによって)計算するだけです。さて、ある波形 $u(t)$ があるときに、何かしら $\exp()$ で分解できることはわかったものの、 どのように重ね合わせが起こっているのか、 $a(f)$ をどのように知ることができるでしょうか。

これを求める操作をフーリエ変換と呼び、先程までに述べてきたフーリエ逆変換と対をなす変換でになります。フーリエ逆変換

$$ u(t) = \int_f a(f) \exp(2\pi i f t )df $$

に対してフーリエ変換は

$$ a_f = \int_t u(t) \exp(-2\pi i f t )dt $$

によって表されます。これはフーリエ変換とフーリエ逆変換を1回ずつ行ったら、もとに戻ってくるように定義がなされています。(おいおい、話が逆じゃないか?フーリエ変換を定義してからフーリエ逆変換が作られたんじゃないのか?と厳しいツッコミは勘弁です。上手い分解が無いかな?という視点で考えていった場合には、こちらの順序の説明のほうが好みなのです)。

もっと易しく知りたければ下記の記事が参考になるような気がします。

www.hellocybernetics.tech

www.hellocybernetics.tech

振動解析

工事中