2021年01月29日の日記です


微分積分いい気分  2021-01-29 17:56:48  コンピュータ

このタイトル、すでに分からない人の方が多そうだな




急に思い出話。

まだ僕が大学1年生だったころのこと。


PCルームがあって、放課後は入り浸っていた。

その場にいる人の多くは、僕も所属していたコンピューターサークルのメンバー。


でも、そうではない常連の人もいて、学科もサークルも違うのに知人、という人もいた。


そのうちの一人…同じく1年生で、簡単なプログラムは組めるが本格的なゲームなどは作れない、というくらいの知人が、ゲームによくある、ジャンプの動きを作ろうと頑張っていた。




その知人は「ジャンプは放物線なのだから」と、何かの二乗を使って書こうとしてたんだ。

(二乗のグラフとして描かれる線を、放物線と呼ぶ)


でも、そうじゃない。ゲームならジャンプは次のように書く。

(当時は BASIC を使っていたので、BASIC 風に)

10 X=X+1
20 IF INKEY$=" " THEN JUMP=1:Y1=-5
30 IF JUMP=1 THEN Y=Y+Y1:Y1=Y1+1
40 IF Y1>5 THEN JUMP=0
50 PUT SPRITE 0,(X,Y),8,0
60 GOTO 10


このプログラムはサンプルなので、初期設定を省いているので、雰囲気で読んで欲しい。

ともかく、こんな感じのプログラムを作って、こうやるんだよ、と見せてあげた。


そうしたら、返ってきた反応は、「なんかずるい」だったんだ。

動きを見ると放物線っぽく見えるけど、プログラム中には二乗どころか、掛け算もない。

それは放物線ではない、というのだ。


いや、別にずるくないよ、と言い返したが、その時の自分には「ずる」ではないという明確な根拠を示せなかった。




今なら明確に示せる。


これは、放物線の式に対し、一階微分した導関数を導き出し、その導関数を再び積分することで放物線を再構築しているんだ。


なぜ微分するかというと、ゲームは時間によって微分された世界で動いているから。

テレビ画面は、連続した「時間」を、1/60 秒ごとに区切って表示する。

このわずかな時間の動きは、時間で微分されている、ということになる。


そして、その微分したものを積み重ねていく。

テレビで言えば、一連の「コマ」を連続させて動かすことが、積分にあたる。


…厳密にいえば、微分ではなく差分だし、積分ではなく積算なのだけど。

これを言い出すと離散数学というややこしい数学の話になるので、今は微分積分という呼び名で話を進める。



僕のプログラムを見た知人は、「プログラム中に二乗がないので、放物線ではない」と言った。


しかし、プログラム上は微分したことで二乗が消えている。

そして、プログラムを動かすと時間変化によって積分され、正しい放物線が描かれる。


これを「ずる」だというのは、微分積分を理解していない残念な人間だというのを、自ら明かしたに過ぎない。

(もっとも、すぐに言い返せなかった自分も、その時には十分理解できていなかったわけだけど)




本当に足し算だけで二乗になるのか、まだ疑う人がいるかもしれないので、わかりやすい例を挙げよう。


まずは、単純なルールで作りだせる、次の数値の表を示そう。


 0 1 4 9162536496481
135791113151719

この表のルールはこうだ。

・上に書かれた数値は、その左側の列の上下の数値を足したもの。

・下に書かれた数値は、その左側の列の下の数値に、2を足したもの。


足し算しか使っていない、非常に単純なルールだ。

おかしいところがないか検算してもらってもよい。


ここで、上の数値は、もう一つの意味を持つ。

0,1,2…と続く数値の「二乗」になっているのだ。


日本人なら 9*9=81 まではわかるだろうから、上の表は 81 で止めてある。

でも、もっと長く続けても大丈夫。これも試してもらってよい。




「ずる」と言われたのが悔しくて、根拠を考えていたら、数日後にはこの答えに行きついた。

でも、サークルも違うし学科も違ったので会う機会はそれほどなく、言い返すタイミングは永久に失われた。


それを思い出して急にここに書いたのは、ネットで「微分積分なんて実生活でどう役に立つのか」なんていう…まぁ、よくありがちな学生の愚痴を見たから。


微分積分、生活で超役立つ。

上に書いたように、テレビゲームは微分積分の世界の中にある。

そもそもテレビが微分積分の世界だし、デジタルテレビなんかフーリエ変換(微分積分の親玉みたいなやつ)を駆使して作られている。


ただし、役立てられるかどうかは、自分次第。

ゲームやテレビの中に微分積分が駆使されている、なんていうのは知らない人は全く気付かない世界だ。

それでも生活はできるのだから、知らずに生活している限りは、高校で習った微分積分は「役立てられていない」。


役に立たないのではなく、役立てられないのだ。

なんでかといえば、勉強が浅かったから。「どうせ役立たない」なんて思ってるから。




世界最初のコンピューター、と呼ばれる ENIAC は、実のところ「ひたすら足し算する機械」にすぎない。

それでも、数学的に正しい…どころか、空気抵抗なども考慮した「弾道計算」ができた。


先に書いたように、足し算だけで数学的に正しい放物線は求まる。

しかし、それは空気抵抗や風などがない理想状態での弾道にすぎない。


ENIAC では時間で「微分」した方程式を使い、繰り返し計算して「積分」することで、弾の速度の関数となる空気抵抗や、風の影響なども考慮に入れ、物理現象としての「弾道」を描き出すことができた。


空気抵抗が弾の速度の関数になる、なんていうのは、瞬間ごとの速度を見ながら抵抗を導き、それによって速度を調整する、というのを繰り返しながら積分する方法でないと計算できない。


そうした計算が複雑すぎて人の手に負えないから、ENIAC を建造したわけだけど。



ともかく、ここで重要なのは、どんなに複雑な数式であっても、微分を繰り返せばただの足し算になるということだ。

そして、足し算をひたすら繰り返せば、元の複雑な数式の答えを導き出せる。

(ここでいう答えとは数値演算であり、式の変形ではない)


ENIAC は弾道計算よりももっと複雑な、水爆の内部圧力の計算なども行っている。

使われた計算は全部足し算のみだ。それが微分積分の威力だ。




今回、この話を書こうと思ってネットを調べていたら、以下のようなことを書いている人がいた。

(一連のツイートだが、特定人物を批判したいわけではないため、検索されないよう文面は変えている。)


・ファミコンで三角関数を使うと遅くなるので、スーパーマリオのジャンプは掛け算だけで作られている。

・掛け算だけなので本当は放物線ではないのだが、ゲームを作るうえでのうまいごまかし方だと言える


…まぁ、プログラマーでない人がうろ覚えの知識を披露しただけだと思う。

しかし、どこから突っ込んでよいかわからないほど違っている。



まず、ジャンプを表現する放物線に、三角関数は必要ない。掛け算だけでよい。

そして、ファミコンは掛け算すら遅いので、足し算だけで作られている。


さらにいえば、先に書いたように足し算だけで書いてもごまかしではなく、数学的に正しい放物線が描ける。


ただ、スーパーマリオのジャンプは、放物線ですらない。

放物線にすると、操作が難しくてゲームにならないから。


それでも放物線っぽく感じられるようにしている。

これが「うまいごまかし方」だというのは同意だが、計算できなかったからではなく、ゲームを面白くするためだ。

背景が全く違う。





同じテーマの日記(最近の一覧)

コンピュータ

別年同日の日記

05年 外構チラシ

09年 ジョウビタキ

10年 加湿器

15年 「デフォルト」という言葉の意味

15年 プログラム言語における「デフォルト動作」

16年 【追悼】マービン・ミンスキー

16年 AI囲碁

18年 テクニカルサポート


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -