少し前の日記で、微分積分は役立つよー と書いたのだけど、話の腰を折るのであまり具体例に踏み込まなかった。
これ、自分の中で気になっていて、もう少し説明したいと思っていた。
僕はプログラマーなので、これから書くのはコンピュータープログラムとしての微分積分の話だ。
そして、プログラムとしての微分積分というのは、高校で習ったアレは何だったのかと気が抜けるほど簡単だ。
まぁ、高校で習ったことはちゃんと意味があるので、そのフォローは最後にやる。
▼積分の概念
というわけで、微分積分の「考え方」から説明しよう。
微分積分、と言っているとややこしいので、まずは積分に話を絞る。
前提知識として、足し算は理解しているものとする。
足し算がわからない人には、さすがに説明ができない。
では、[ 3, 3, 3, 3 ] …3 が4つあるのだけど、全部足してみて欲しい。
答えは 12 だ。3 + 3 + 3 + 3 でいいのだけど、3 × 4 と考えるとすぐに答えが出る。
次に、[ 3, 4, 5, 6 ] を全部足してみて欲しい。
今度は掛け算は使えないので、地道に足し算をするしかない。
3 + 4 + 5 + 6 で、答えは 18だ。
概念的には、後者が積分にあたる。
たくさんの数をまとめて足す方法が積分。
そのうち、数が「たまたま全部同じだった」という特殊な場合が掛け算だ。
ここに書いた例では、4つの数を足しただけだった。
これが、数万という数があると考えて欲しい。とても手計算で足し合わせることはできない。
でも、それらの数に何らかの法則があって、数式で表せたとしよう。
こうなると話が変わってくる。足したい数の概要を数式として示せたので、これをもとに「全部足した結果」の数式を作り出す。
すると、数万件の足し算をする必要がなくなり、すぐに答えが出る。
これが、高校で習う積分だ。
ただ、数式で表すとなると、整数だけが相手というわけにはいかない。
式を変形するための前提条件などもいろいろと付き、話が複雑になっていく。
結果として「難しい」と思われてしまうのだけど、やりたいことは「全部足す」なのだ。
さて、そこでコンピューターが開発された。
最初は、「ひたすら足し算」しかできない機械だった。
でも、足し算さえできれば積分計算ができる。それで十分だ。
今のコンピューターもその延長上にあるので、プログラムのいたる所に積分が顔を出す。
多分、多くのプログラマーが、積分だとも思わないまま使っているのだけど。
▼積分の具体例
具体例をあげよう。
最近の家庭用テレビゲーム機では、コントローラーを振って操作することができる。
3Dのゲームで、コントローラーを左右にふることで、左右を見ることができたりね。
これ、コントローラーには「向き」を知るための仕組みは入っていない。
入っているのは、加速度センサーだ。
加速度、というのが馴染みが薄いかもしれないのだけど、単純に力のことだ。
加速度センサーは、コントローラーにかかる力を知ることができる。
そして、速度に加える、という名前の通り、足し算を続けると…つまり、ここまでに説明したように「積分」すると、現在の速度が得られる。
さらに、速度を積分すると、今度は現在の位置が得られる。
自分の体を中心としたコントローラーの位置と考えると、「向き」と近似のものだ。
こうして、加速度センサーから得られる値を、2回積分することで、コントローラーからは直接得られない「向き」を算出しているんだ。
積分を行うと、値のもつ「意味」を変えることができる。
ここでは、加速度を速度に、速度を位置に、変えることができた。
長さを面積に、更に体積に変えることもできる。
掛け算でも同じだけど、先に書いたように、掛け算は積分の特殊な場合だから。
プログラムしていて、欲しい値が手に入らない、ということはよくある。
そうした場合でも、手元にある値を積分することで、欲しい値を作り出す事ができる。
プログラマーなら、こうしたプログラムの経験はいくらでもあるだろう。
積分というのは特別なことではなく、ごく当たり前に使われるものなのだ。
また別の例を上げる。
積分を使うと、複雑なものを単純化できる。
物を投げたときの位置は、それほど難しくない数式で示すことができる。
いわゆる放物線だ。
まぁ、人がボールを投げるくらいなら放物線の式で問題ない。
でも、高速で動く場合は空気抵抗が問題になり始める。
そこまで考慮して位置を示す式を作ろうとしても、複雑すぎて作ることができない。
そこで積分を使う。
いきなり位置を表す式を作るのではなく、まず速度の式を作るのだ。
空気抵抗は速度によって変わるので、速度をもとに空気抵抗を求め、その空気抵抗で速度が変わるようにする。
そして、その速度を積分して位置を求める。
ここで言う積分は、もちろんコンピューターの計算力で足し算を繰り返すことだ。
このように、複数の段階に分けることで、複雑すぎて手に負えない計算も行うことができる。
こちらも、プログラマーにとってはそれほど特別なことではないね。
ゲームを作る人なら、いろいろな条件で途中から動きが変わったりする、つまり「加速度」を持つプログラムは当たり前に組むだろう。
▼微分
積分の話を2つほど挙げたが、続いて微分のことを書こう。
微分は積分の逆の操作だ、と思ってだいたい間違いはない。
微分して積分したらもとに戻る。
積分がすべて足すのに対して、微分は直近の値を引く。
これによって、直近から値がどのように変わったのか、その「差」を調べることができる。
積分例として、ゲームコントローラーの話を書いた。
コントローラーには加速度センサーしか入っていないが、積分すれば位置がわかる。
逆の話として、スマホのタッチパネルのことを書こう。
タッチパネルに指を触れると、その位置がわかる。でも、位置以外はわからない。
しかし、タッチパネル操作でスクロールを行うとき、「フリック」すると、その時の速度でスクロールが続く。
ここでは、指の位置情報を微分することで、速度を求めているんだ。
フリックとは、指を動かしている最中に、急にタッチパネルから離す動作。
指が離れた直前の速度がある程度あった場合、そのままスクロールを続けるようにする。
そして、徐々にスクロールが止まるのは、速度を変化させる、逆向きの加速度を設定している。
これらの動作は、積分を行っている。
微分すると、変化がわかる。
これを多用しているのが、写真などの加工アプリだ。
ある点に注目したときに、すぐ隣の点との差を出す。
これを画像のすべての点について行い、その結果を新たな画像とする。
これが「画像を微分する」ということなのだけど、この結果得られるのは、色の変化するところを拾い出したような画像だ。
いわゆる「輪郭抽出フィルタ」だと思っていい。表示の方法によっては、レリーフ化フィルタになる。
この輪郭に対してもう一度微分すると、輪郭のすぐ隣の点を際立たせるデータが得られる。
これを元の画像に重ねると、輪郭がくっきりとする。
「シャープフィルタ」とか「ピンぼけ補正フィルタ」と呼ばれるものだ。
ここに書いたのは単純な原理だけで、実際の画像処理ではもっと工夫された処理が使われている。
しかし、微分の応用範囲の広さはわかってもらえると思う。
▼微分積分とは
これ以上書いても同じような話ばかりになりそうなので、少し話を変えよう。
微分積分というのは難しいものだ、と思っている人は多そうだ。
でも、コンピューターで計算するときは、ただの足し算引き算だ。
特に難しい処理ではない。
じゃぁ、なんで高校ではあんなにややこしい教え方するのさ、という話。
これにはもちろん意味がある。
微分積分学は19世紀に大きく発展したのだけど、コンピューターの登場は 20世紀なのだ。
だから、学問としてはコンピューターのほうが新しく、難しい。
高校でやるのは積分の「基礎」で、コンピューターを使うのは「応用」なのだ。
今回書いた話も、概念としては「微分積分」なのだけど、数学的な妥当性はちょっと怪しい。
わざと簡単な話だけやっていて、ややこしい話は避けたからね。
真面目に書こうとすると、高校レベルの数学では収まらない話になる。
でも、今回僕が示したかったのは、数学的な妥当性ではない。
難しいと思って避けている人が多い「微分積分」が、案外身近に使われているし、考え方自体は簡単なものだと知ってほしかったのだ。
▼最後に
微分積分の話、もっと書きたいことはたくさんある。
でも、何でもかんでも盛り込むと話が横道にそれ過ぎて、わかりづらくなる。
今回も、これでも泣く泣く削った話が多数あるのだ。
諦めきれないネタを2つ、概要だけ示す。
説明は長くなるからしない。書きたいから書きっぱなしにする、というだけ。
・太陽の位置と季節の話
12月の冬至と6月の夏至が「昼と夜の長さ」のピークなのに、寒さと暑さのピークは2月と8月だ。
なんでピークがずれるのか気になったことはないだろうか?
太陽の運動を正弦波、太陽エネルギーを気温に変えるのに積分が必要だと考えると、大体理解できる。
・フーリエ変換
異世界転移の魔法。
ネイピア数を虚数乗することで複素空間に円形の魔法陣を描き、そこに波動をぶつけて積分すると「周波数空間」という異世界に転移できる。
もちろん、異世界に行ったら無双できるのがお約束。
…と、与太話を書いてから真面目に解説したかったのだけど、そもそもこの与太話がフーリエ変換を理解していないとわからないし、解説もすげー長くなるからやめた。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
17年 タネンバウム教授(1944) ストールマン(1953) 誕生日
申し訳ありませんが、現在意見投稿をできない状態にしています。 |