微積分と物理​/積分

Unity学習帳2冊目微積分と物理 / 積分

積分とは何か? anchor.png

積分とは? = 面積を求める計算

「積算」とは一般的に数値を次々と加えていく計算を指す。\(5+3+8+10=26\)   このような計算を「積算」と呼ぶ
積分は細かくいくつにも分割した領域の面積を積算する計算技術を指す

Page Top

区分求積法 anchor.png

区分求積法とは、読んで字の如く「区分」に分けた領域を「求める」「積算」です。この様な計算法を総称して積分と呼びます
区分求積法は積分の考えのベースになっています

面積を求める事によってどのような事が可能となるのでしょうか?
日常でも、ある目的地に向かって車でドライブする時、その目的地までの距離を想像する場合、無意識に面積の計算を我々はしています
たとえば車の平均時速が \(40\)km/h だったとして目的地が \(5\)h 時間かかる場所だったとすると
\(40\)km/h \(\times 5\)h\(=200\)km という長方形の面積の計算を無意識にしている事になります
グラフにすると以下のようになります
integral1.png
このように 速度と時間のグラフの面積を求める事で距離の値が得られる 事が判りました
では、もしこの速度のグラフが正方形ではなく自由な形、極端に言えば曲線で曲がっていたり、ぐにゃぐにゃとした線を描く関数のグラフだった場合
どのようにすれば、その面積(距離)が求められるでしょうか?そこで積分という計算テクニックが重要になってきます

例えばアクセルべた踏みで加速していく車があったとします。この車にはブレーキが無く永遠に加速していくとして
この加速する度合い、加速度\(a\)が \(9.8\) m/sだったとした時(\(a=9.8\))、速度\(v\)の関数式は、\(v=9.8t\) m/sとなります
この車の\(4\)秒後の位置を知る必要があるとして、これをグラフで図にすると以下になります
integral2.png
この赤い領域の面積を求めれば、この速度の関数から4秒後の車の位置が得られそうです。面積の形を見ると直角三角形なので簡単に求められます
4秒後の車の位置は\(\displaystyle \frac { 底辺\times 高さ }{ 2 } =\frac { 4\times 9.8\times 4 }{ 2 } =78.4\) mとなります

積分必要ないですね・・・今回はたまたま直角三角形の面積を求める事で解決できましたが、これが曲線が混じったグラフの場合、このやり方は通用しません
つまりグラフの形よって公式が変化してしまう(先ほどは長方形、今回は三角形でした)ので、どんな状況でも対応できる「一般的な数式」とは言えません
例えば以下のようなグラフの場合、途端に対応できなくなります
integral3.png
ここでより「一般的な数式」どんな状況でも対応できる「区分求積法」が必要になってきます
区分求積法とは、冒頭でも説明したように「区分」に分けた領域を「積算」して「求める」計算です
つまりグラフ図にするとこうなっています
integral4.png
この例では1秒毎に4秒まで4区分に分けて面積を計算し、それらを積算で足し合わせて総面積を求めています
わかりやすく今回は4区分にしていますが、この区分数は自由に増やす事が出来ます。区分数を増やしていくと・・・
はみ出した領域がどんどん小さくなります
integral5.png
すると区分数を増やすほど最初に三角形で求めた正確な面積の値に近づいていく事がわかります
この計算は性質的に近似を求める計算になるのですが、必要数、計算を増やせば精度を向上させる事が可能です

では、この区分求積法を人類の公用語である数学の数式にします
この一連の計算を数式として表す為に幾つか数学的な表記や文法を知る必要があります

①積分する対象を関数で表す「\(f(x)\)」
②微細な区分を表す「Δ(デルタ)」
③積算を表す「\(\sum\)(シグマ)」
④極限を表す「\(\lim\)」

この4つを利用して区分求積法を数式化します。まず分かりやすく①②③を適用して
unityにコーディング後、計算動作を確認してから④を導入して積分の数学的な性質を確認します

Page Top

関数 anchor.png

<数学の関数>
\(y\)が\(x\)において1通りに決まる時、\(y\)は\(x\)の関数 \(y=f(x)\) と表せる。引数と返値の関係は常に\(1:1\)
integral6.png
これを今までの速度の関数 \(v=9.8t\) に当てはめると、vはtの関数 \(v=f(t)=9.8t\) となります

C#において関数は汎用的に制御処理(ステートメント)が扱えるものになっていますが
それに比べて数学においての関数は非常に機能が制限されています(引数がひとつ、返値もひとつ、ステートメントは数式のみ)

このような仕組みを採用している理由は数学の関数が微積分によって導関数や原始関数に書き換える事が出来たり(後述)
あるルールに従って複数の関数を組み合わせ新しい関数を作ったり出来ることに起因しています

数学では計算操作によって関数のステートメント自体を状況や要求に合わせた形に変化させる事が可能になっています
式を変形させ整合性を保つには等号で結ばれた未知数を指す変数と値が1:1で対応している必要があります
(LINQ等で利用されている式木というものを使えばプログラムでも数式やステートメントを書き換える事ができますが今はちょっと置いておきます)
そういう意味でC#で扱う関数と数学の関数は同じ名前でも、少し違うものだと思っていて良いかもしれません

<補足>
ちなみに数学でもベクトルやマトリックスは複数要素持っていても、ひとつと数えます

Page Top

Δ(デルタ) anchor.png

「デルタ(Δ)」これは変化量を表現した記号。変数の前につけて、その変数の微小な変化や差分(difference)を表す
数学記号として「d」で表されることも多い。
たとえばA地点とB地点があって、その間の変化の量を表現する変数の先頭に付ける
17cabc1ac99783cb46b97843d047862f.jpeg
この変化は、どんな型であっても良い。例えば「時間」であっても良いし「距離」であっても良い
時間なら一般的に\(Δt\)(tはtimeの略) 、距離なら\(Δh\)や\(Δx\)(hはheight、xはx軸)、ラジアンなら\(Δ\theta\)(θはsinやcos関数などで利用できるラジアン)等がある
(もしくは数式内で、\(dt\)、\(dh\)、\(dx\)、\(d\theta\) 等と表されることもある)

unityにはTime.DeltaTimeという使用頻度の高いプロパティが存在しますが、この「Delta」は微小な変化量ですよ、という事を私たちに知らせている
もしコードを書くときに値に微小な変化量の意味を持たせたければ変数の名前の先頭にdやDeltaをつけると他人に理解しやすいコードになります

区分求積法ではグラフに対して区分数が多いほど精度が向上する事が判っています
最終的には、その一区分の"横軸の長さ"を究極的に小さくする事が求められます
例えば \(f(t)=9.8t\) の区分求積法の場合一つの区分の面積は以下の図のように求められます
integral7.png
グラフの横軸は時間 \(t\) によって定まりますが、\(Δt\) と書く事により読み手に(最終的には極限的な)微小な時間を対象としている事を伝えます
上記の図を例に考えると \(Δt=1\)、計算範囲を表す \(t=4\)。区分の総数は \(\frac { t }{ Δt } =\frac { 4 }{ 1 } =4\) 個となり
4番目の区分の面積は \(9.8\times Δt\times n\times Δt\quad \rightarrow \quad 9.8\times 1\times 4\times 1\quad =\quad 39.2\) となります

Page Top

Σ(シグマ:総和) anchor.png

変数 dt が細かく微細になればなるほど計算精度が向上していく事が以下のコードで確認できる。理想は値が極限である事

Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
 
 
 
 
-
|
-
|
|
!
|
|
-
|
|
|
-
|
!
|
!
|
|
-
|
!
|
|
-
|
!
!
using UnityEngine;
using System.Collections;
using System;
 
public class Sum2 : MonoBehaviour
{
        void Start ()
        {
                print (Integral (4f, 0.01f, Gravity));
                print (Integral (0.5f * Mathf.PI, 0.01f, Sin));
        }
 
        float Integral (float t, float dt, Func<float,float> f)
        {
                float parts = t / dt;
                float sum = 0;
 
                for (int n = 1; n <= parts; n++) {
                        sum += f (dt * n) * dt;
                }
                return sum;
        }
 
        float Gravity (float t)
        {
                return 9.8f * t;
        }
 
        float Sin (float t)
        {
                return Mathf.Sin (t);
        }
}
Page Top

極限 anchor.png

Page Top

"" anchor.png

\(\displaystyle\lim _{ \Delta t\rightarrow 0 }{ \int { 9.8 } t dt } \quad \quad \rightarrow \quad \quad \lim _{ \Delta t\rightarrow 0 }{ 9.8{ \left( \Delta t \right) }^{ 2 }\sum _{ n=1 }^{ \frac { t }{ \Delta t } }{ n } } \quad \quad \rightarrow \quad \quad \lim _{ \Delta t\rightarrow 0 }{ 9.8{ \left( \Delta t \right) }^{ 2 }\left\{ \frac { \left( 1+\frac { t }{ \Delta t } \right) \frac { t }{ \Delta t } }{ 2 } \right\} \quad } \)

\(\displaystyle \rightarrow \quad \quad \lim _{ \Delta t\rightarrow 0 }{ 4.9{ \left( \Delta t \right) }^{ 2 }\left( \frac { t }{ \Delta t } +\frac { { t }^{ 2 } }{ { \left( \Delta t \right) }^{ 2 } } \right) } \quad \quad \rightarrow \quad \quad \lim _{ \Delta t\rightarrow 0 }{ 4.9{ \Delta t\cdot t }+4.9{ t }^{ 2 } } \quad \quad \rightarrow \quad \quad 4.9{ t }^{ 2 }\)



添付ファイル:

トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Last-modified: 2015-04-26 (日) 00:36:29 (JST) (3291d) by osinko