Chapter 10

微積分 超入門

mebiusbox
mebiusbox
2021.02.24に更新

コンピュータグラフィックスにおいて,特に3DCGでは光源から放出された光子(フォトン)が様々な物体に反射・吸収・散乱されて,カメラに入射してくる光子をシミュレーションして画像を生成します.これをレンダリングといいます.このシミュレーションで必要になってくるのが微積分です.ここでは,微積分とシミュレーションの関係に焦点をおいて,初歩から説明してみたいと思います.数式が出てきますが,簡単なものですので,1つ1つ確認しながら読み進んでみてください.

最初に断っておきますが,この内容はあくまで私の主観で書いています.人それぞれ解釈の仕方が異なりますし,絶対とは言い切れませんので参考程度として読んでください.

📌 数列

例えば,1,2,3,4,\ldots のように,ある規則によって並べられた数の列を 数列 といいます.数列のおのおのの数を といい,特にはじめの項を 初項 といいます.一般に数列 a_1,a_2,a_3,\ldots,a_n (初項はa_1)を

\{a_n\} \tag{1.1}

と書きます.次に 1,4,7,10,13,\ldots の数列では,初項 1 に次々と 3 を加えています.このように初項に一定の数を加えて得られる数列を 等差数列 といい,この一定の数を 公差 といいます.よって,等差数列を表すには初項と公差が必要です.初項を a,公差を d としたとき,各項は

a_1 = a, \quad a_2 = a+d, \quad a_3 = a+2d, \quad \cdots \tag{1.2}

で求めることができます.数列の各項を表す式を 一般項 といい,等差数列の一般項は

a_n = a + (n-1)d \tag{1.3}

となります.また,隣り合う2項間の関係,つまりある項 a_n と次の項 a_{n+1} の関係を式で表すと

a_{n+1} = a_n + d \tag{1.4}

となり,これを 漸化式 といいます.

次に初項に対して次々に一定の値を掛けていくことを考えます.例えば,初項を 5,一定の値を 2 とした場合の数列は

5, 10, 20, 40, 80, 160, \ldots \tag{1.5}

となります.このような数列を 等比数列 といいます.その掛ける一定の値のことを 公比 といい,初項 a と公比 r から等比数列の一般項は

a_n = a\cdot r^{n-1} \tag{1.6}

となります.また,等比数列の漸化式は

a_{n+1} = r\cdot a_n \tag{1.7}

となります.ここで,少し戻って等差数列の公差 d について考えてみましょう.公差 dr\cdot a_n とすると,等差数列の漸化式は

a_{n+1} = a_n + r\cdot a_n \tag{1.8}

となります.ここで R=1+r とおくと,式(1.8)は

a_{n+1} = R \cdot a_n \tag{1.9}

となって,等比数列の漸化式になります.つまり,等比数列は公差 d が変動する等差数列であるということがわかります.

次に,項が限りなく続く数列 a_1,a_2,a_3,\ldots,a_n,\ldots を考えます.このような数列を 無限数列 といいます.もし,数列 \{a_n\} において,nを無限,つまり n\to\infty にしたときに,a_n の値が \alpha に近づくなら,数列 \{a_n\}\alpha収束 するといい,

\lim_{n\to\infty}a_n = \alpha \tag{1.10}

と表します.このとき \alpha を数列 \{a_n\}極限値 といいます.また,一定の値に収束しない場合は正,または負の無限大に 発散 するものがあります.

\lim_{n\to\infty}a_n = \infty, \qquad \lim_{n\to\infty}a_n = -\infty \tag{1.11}

その他に,収束・発散しないこともあり,その場合は値が 振動 していることになります.

例えば,無限等比数列 \{r^n\} の場合,r>1 のときは発散,

\lim_{n\to\infty}r^n=\infty \quad(r>1) \tag{1.12}

r=1 または |r|<1 のときは収束,

\lim_{n\to\infty}r^n = 1 \quad(r=1), \quad \lim_{n\to\infty}r^n = 0 \quad(|r|<1) \tag{1.13}

r \leq -1 のときは振動します(極限がない).

数列の最後として,2つの収束する数列 \{a_n\}, \{b_n\} と任意の数列 \{c_n\}a_n \leq c_n \leq b_n の関係であるとき,

\lim_{n\to\infty}a_n = \lim_{n\to\infty}b_n = \alpha \tag{1.14}

ならば

\lim_{n\to\infty}c_n = \alpha \tag{1.15}

となります.これを はさみうちの原理 といいます.

📌 関数

関数というのは簡単に言うと,任意の数 x を決めると,それに応じた数 y がただ1つに決まるものです.これを式で表すと

y = f(x) \tag{2.1}

となります.任意の数は何個にでも拡張することができます.

y = f(x_1,x_2,\ldots) \tag{2.2}

ここで重要なのは数列が n=1,2,3,4,\ldots と正の整数に対して,関数は x0.1-0.2 といった有理数も渡せることです.これによって,関数の値は 連続 になります(ただし,必ずしも連続しているとは限りません).そして,関数も数列と同じように極限を考えることができます.例えば,x の値が a に近づくとき,f(x) の値が \alpha に限りなく近づくことを x\to a のとき,f(x)\alpha に収束するといい,

\lim_{x\to a}f(x) = \alpha \tag{2.3}

と表します.もちろん,発散したり振動したり,また,はさみうちの原理も成立します.

📌 微分

いよいよ本題です.よく微分は接線の傾きであると耳にタコができるくらい聞いたり,または教わってきた方も多いのではないでしょうか.もちろん,それは正しいのですが,それは微分というものの概念の1つの捉え方に過ぎません.どういうことかというと,関数をグラフに表したとき,つまり幾何学的に微分を見たら傾きとして見えるということです.微分は2回,3回と何度もすることがあります.それでは2回微分のとき,傾きの傾きを求めているということになりますが,それって直感的に想像つくでしょうか? また,傾きの傾きっていったい何なのか説明することはできるでしょうか.微分=傾きとして覚えてしまうと,高校数学の世界から飛び出したときに泥沼にハマってしまう気がしてしまいます.

ということで,微分を幾何学的ではなく物理学的に見ていきたいと思います.冒頭に述べた光子のシミュレーションは物理学(光学)です.ちょっと別の視点で捉えてみましょう.

数学はもちろん「数」を扱っていますが,物理では「量」を扱います.ここでは,関数 y=f(t) は距離を計算し,t を時間とします.この関数は任意の時間 t を渡すと,その時間で進んだ距離を計算します.t の変化量を \Delta t ,そして \Delta t の変化に対応した y の変化量を \Delta y としたとき,

\frac{\Delta y}{\Delta t} \tag{3.1}

変化率 といいます.\Delta yy の変化量なので

\frac{\Delta y}{\Delta t} = \frac{f(t+\Delta t) - f(t)}{\Delta t} \tag{3.2}

と表せます.ある距離 y の変化率を表す関数を g(t) とすれば

\frac{\Delta y}{\Delta t} = \frac{f(t+\Delta t) - f(t)}{\Delta t} = g(t). \tag{3.3}

ここで f(t)=u_nf(t+\Delta t)=u_{n+1} とします.そうすると

\frac{u_{n+1}-u_n}{\Delta t} = g(t) \tag{3.4}

整理して

u_{n+1} = u_n + \Delta t \cdot g(t) \tag{3.5}

となりました.ここで d = \Delta t\cdot g(t) とおくと

u_{n+1} = u_n + d \tag{3.6}

となり,等差数列の漸化式と一致しました.公差 d は変化量 \Delta t と変化率 g(t) をかけ合わせたものです.この式が表しているものは何でしょうか.u_{n+1}f(t+\Delta t) ,つまり \Delta t 後の距離です.もちろん u_nt 時の距離です.これは d を計算して前の結果に足していけば,次の距離がわかるということになり,この計算を繰り返すことでシミュレーションを行うということです.

それでは変化率の関数 g(t) を考察してみましょう.\Delta t = 1 とすると

g(t) = \frac{u_{n+1}-u_n}{\Delta t} = u_{n+1} - u_n \tag{3.7}

となって, 差分 を意味します.公差 d を計算するときも \Delta t を乗算するので

d = \Delta t \cdot g(t) = \Delta t \cdot \frac{u_{n+1}-u_n}{\Delta t} = u_{n+1} - u_n \tag{3.8}

となることもわかります.この \Delta t0 に限りなく近いとても小さい値にすると,f(t)f(t+\Delta t) の正確な差分を求めることができます.つまり

g(t) = \lim_{\Delta t\to 0}\frac{f(t+\Delta t)-f(t)}{\Delta t} \tag{3.9}

ここで,関数 f(t) の変化率の極限は

f'(t), \quad \frac{df}{dt}, \quad \frac{df(t)}{dt}, \quad \frac{d}{dt}f(t) \tag{3.10}

で表すことができます.どれでも意味は同じです.そしてこれを 導関数 と呼びます.よって式(3.9)は

\frac{df}{dt} = \lim_{\Delta t\to 0}\frac{f(t+\Delta t)-f(t)}{\Delta t} \tag{3.11}

と表せます.g(t) は導関数だったということになります.関数を微分するということは,この導関数を求めることになります.そして,導関数に値を渡して得られた値を 微分係数 といいます.これは

d = \Delta t \cdot g(t) \tag{3.12}

で,g(t) が微分係数ということです.

まとめると,物理学の「量」において,微分は 変化率 ,大雑把に言えば 差分 を求めるものだと言いたい訳です.微分のはじめの方で傾きの傾きとは,という話をしましたが,差分のその差分としたほうが想像しやすい気がします.どうでしょうか.

余談: ddx, ddy

シェーダプログラミングで ddxddy 関数があります.これらは偏微分を行って勾配,つまり傾きを求める関数です.実際は左右上下の隣り合うピクセルの差分を計算した結果です.これはつまり \Delta t = 1 と考えれば差分であると容易に想像できます.

📌 積分

微分と積分は対になっている関係です.ある関数 f(t) を微分し得られた導関数 f'(t) があるとします.この導関数 f'(t) を積分すると元の f(t) が得られるということです.シミュレーションは積分を計算することに他なりません.そして,すでに積分の計算は出てきました.大体想像つくかと思いますが,他でもない等差数列の漸化式を計算したものになります.

積分はよく面積と説明されますが,もちろんそれも幾何学的な捉え方です.関数は連続していますが,微分をすると差分が得られます.この差分は 離散 です.この差分を足し合わせることが積分です.つまり,微分は関数を離散化し,積分は離散化したものを連続に戻すと考えることができます.

📌 シミュレーション

ということで,これまでの内容をもとに1つシミュレーションしてみます.とっても簡単なものです.単純に組み込み関数の \sin 関数を使って

x = Math.sin(time);

とすれば振動した動きになります.これを微積分を使ってシミュレーションします.まず,\sin 関数を微分すると \cos 関数,\cos 関数を微分すると -\sin 関数になることがわかっています.逆に -\sin 関数を積分すれば \cos 関数,\cos 関数を積分すれば \sin 関数に戻ります.積分するには等差数列の漸化式を計算すればよかったわけです.

u_{n+1} = u_n + d

導関数 g(t) を使った式は

u_{n+1} = u_n + \Delta t \cdot g(t).

まず,\sin 関数を計算するには \cos 関数を積分します.

c = Math.cos(time);
x = x + deltaTime * c;

次に \cos 関数は -\sin 関数を積分します.

s = -Math.sin(time);
c = c + deltaTime * s;
x = x + deltaTime * c;

ここで x は計算した \sin 関数が格納されています.ということは…

c = c + deltaTime * -x;
x = x + deltaTime * c;

これで \sin 関数をシミュレーションすることができます.注意なのは x を振幅で初期化しておいてください.

サンプルを用意しました.赤い四角は積分によるシミュレーション,緑の四角は三角関数を使って計算しています.

http://mebiusbox.github.io/contents/cg_calculus_sim/

📌 微積分と単位の関係

最後に微積分の関係を,もうちょっと違った見方で捉えてみようと思います.乗算と除算,指数と対数が対の関係であるように,微分と積分も対の関係であることを説明しました.乗算と除算,指数と対数は 実数 で掛けたり割ったりしています.では微積分はどうでしょうか.微積分も「何か」で掛けたり割ったりしていると考えられないでしょうか.それは 単位 です.

ここで距離 d,時間 t から平均速度 v を求めると

v = \frac{d}{t}

です.平均速度 v をさらに時間で割ると瞬間速度,つまり加速度 a が求まります.

a = \frac{v}{t}

これらの変化量を考えると,距離はある物体の位置として考え,物体が運動して位置が変わった時の変化量を「変位」といい,速度は単位時間当たりの変位の変化量,加速度は単位時間当たりの速度の変化量です.変位を微分すると速度,速度を微分すると加速度になります.逆に,加速度を積分すると速度,速度を積分すると変位になります.

ここでそれぞれの単位に注目します.国際単位系 SI に準拠し,変位の単位は m,速度の単位は m/s,加速度の単位は m/s^2 です.

微分を除算と考えます.変位(m)を微分する,つまり時間(s)という単位で除算すると m/s で速度の単位と一致します.さらに速度(m/s)を時間(s)で微分すると m/s^2 となって,加速度の単位と一致します.積分も同じように考えることができます.加速度(m/s^2)を時間(s)で積分すると速度(m/s)に,速度(m/s)を時間(s)で積分すると変位(m)になります.

これを踏まえると,次の導関数の表記

\frac{df}{dt}

では,時間という単位で距離を割っていると考えることもできます.そう考えると,この表記方法の方がわかりやすい気がするかもしれません.この式は,単位時間当たりの距離を表しています.

光の世界へ

ここは興味のある人だけ読んでください.もし読む場合は,単位に注目してみてください.

光の物理量の最小単位は 光子 (フォトン)です.光子の集まりを 放射エネルギー といい Q で表します.この単位は J(ジュール)です.

単位時間当たりの放射エネルギーを 放射束 \Phi といいます.

\Phi = \frac{dQ}{dt}

単位は W(ワット)です.また,J/s もしくは J\cdot s^{-1} とも言えます.

単位立体角当たりの放射束を 放射強度 I といいます.

I = \frac{d\Phi}{d\omega}

この単位は W/sr(ワット/ステラジアン)です.

次に,単位面積当たりの放射束を 放射照度 E といいます.

E = \frac{d\Phi}{dA}

単位は W/m^2(ワット/平方メートル)です.

単位立体角当たり,単位投影面積当たりの放射束を 放射輝度 L といいます.

L = \frac{1}{\cos\theta}\frac{d}{dA}\frac{d\Phi}{d\omega} = \frac{1}{\cos\theta}\frac{d^2\Phi}{dAd\omega}

この単位は W/m^2sr です.

放射輝度を単位面積で積分すると,放射強度になります.

I = \int_{A} L\cos\theta dA = \int_{A}\frac{1}{\cos\theta}\frac{d}{dA}\frac{d\Phi}{d\omega}\cos\theta dA = \frac{d\Phi}{d\omega}

放射輝度の単位は W/m^2sr.単位面積 m^2 で積分したので,単位は W/sr となり,放射強度の単位と一致します.

放射輝度を単位立体角で半球積分すると,放射照度 B になります.

B = \int_{\Omega} L\cos\theta d\omega = \int_{\Omega}\frac{1}{\cos\theta}\frac{d}{dA}\frac{d\Phi}{d\omega}\cos\theta d\omega = \frac{d\Phi}{dA}

放射輝度の単位は W/m^2sr.単位立体角 sr で積分したので W/m^2 となります.

このように物理学では量を扱う際に「単位」があるので,単位と微積分の関係も面白いのではないでしょうか.

📌 さいごに

いかがでしたでしょうか.いや,極限のところでせっかくはさみうちの原理も書いたのに結局使わなかったよ.微分や積分では大変便利な公式があるので,それを覚えるのが早いのですが,必ず導出することをお勧めします.はさみうちの原理は三角関数を微分するときに使います.本当はそれも書こうと思っていたのですが,やめました.ネット等でググってください.
参考になれば幸いです.

📌 参考文献