微積分と物理​/微分2

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

<注意:このページの書いてある事はかなり好き勝手にやってます>
適当に思考実験で以下で色々式をこねまわしていますが、こんなやりかたで漸化式を作っている例がみつかりません・・・
色々調べているのですが、たぶん、無茶苦茶なやりかたなのだと思います。ただ漸化式は作れているので、数式の書き方が数学の文法にのっとってないのだと思います
常識的に変な書き方をしてしまっていると思いますので、今後調べて正しい書き方に直す予定です。ここに書いてある事を真面目に受け取らないようにお願いします

memo:常微分方程式
http://ja.wikipedia.org/wiki/漸化式
http://ja.wikipedia.org/wiki/常微分方程式
http://ja.wikipedia.org/wiki/オイラー法

微分を利用して漸化式を作る例 anchor.png

ここでは微分連立方程式を利用して望む値を求める漸化式を作る方法を考えてみる

Page Top

4乗根の実数値を求める漸化式を作る anchor.png

\({ x }^{ 4 }-C\)のような4次方程式の関数のグラフは以下のようになる。このグラフの\(C\)には\(10\)を代入している。この式のグラフは2次方程式の放物線のグラフと似ているが若干頂点付近の曲線が潰れたような形になっている
srqt4_2.png

グラフのY軸\(0\)のヨコ線と、この4次方程式の描くグラフの交点が\(\sqrt [ 4 ]{ C }\)、つまり\({ C }^{ \frac { 1 }{ 4 } }\)となる

\(\begin{cases} { y=f(x)=x }^{ 4 }-C \\ f'(a)=\lim _{ b\rightarrow a }{ \frac { f(b)-f(a) }{ b-a } } \\ f(a)=0 \end{cases}\)

この式を\(b={x}_{0}\)、\(a={x}_{1}\)として定数から変数にして連立させてまとめると

\(f'({ x }_{ 0 })=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ \frac { f({ x }_{ 0 })-0 }{ { x }_{ 0 }-{ x }_{ 1 } } } \)

となり、これに関数を適用すると

\(4{ x }_{ 0 }^{ 3 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ \frac { { x }_{ 0 }^{ 4 }-C-0 }{ { x }_{ 0 }-{ x }_{ 1 } } } \)

になる。この式を変形させて漸化式にしていく

\( \rightarrow \quad \quad 4{ x }_{ 0 }^{ 3 }({ x }_{ 0 }-{ x }_{ 1 })=\lim _{ { x }_{ 0 } \rightarrow { x }_{ 1 } }{ { x }_{ 0 }^{ 4 }-C } \\ \rightarrow \quad \quad 4{ x }_{ 0 }^{ 4 }-4{ x }_{ 0 }^{ 3 }\cdot { x }_{ 1 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ { x }_{ 0 }^{ 4 }-C } \\ \rightarrow \quad \quad -4{ x }_{ 0 }^{ 3 }\cdot { x }_{ 1 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ -3{ x }_{ 0 }^{ 4 }-C } \\ \rightarrow \quad \quad 4{ x }_{ 0 }^{ 3 }\cdot { x }_{ 1 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ 3{ x }_{ 0 }^{ 4 }+C } \\ \rightarrow \quad \quad 4{ x }_{ 1 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ \frac { 3{ x }_{ 0 }^{ 4 }+C }{ { x }_{ 0 }^{ 3 } } } \\ \rightarrow \quad \quad 4{ x }_{ 1 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ 3{ x }_{ 0 }+\frac { C }{ { x }_{ 0 }^{ 3 } } } \\ \rightarrow \quad \quad { x }_{ 1 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ \frac { 3 }{ 4 } { x }_{ 0 }+\frac { C }{ 4{ x }_{ 0 }^{ 3 } } } \\ \rightarrow \quad \quad { x }_{ 1 }=\lim _{ { x }_{ 0 }\rightarrow { x }_{ 1 } }{ \frac { 1 }{ 4 } \left( { 3x }_{ 0 }+\frac { C }{ { x }_{ 0 }^{ 3 } } \right) } \\ \rightarrow \quad \quad { x }_{ n+1 }=\frac { 1 }{ 4 } \left( { 3x }_{ n }+\frac { C }{ { x }_{ n }^{ 3 } } \right) \)

これをC#のコードにすると以下になる(このコードではCに10を代入して4乗根を計算している)

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
 
 
 
 
-
|
-
|
|
|
|
|
-
|
|
!
|
!
!
using UnityEngine;
using System.Collections;
 
public class Numbers5 : MonoBehaviour
{
    void Start ()
    {
        float x0 = 3f;
        float c = 10f;
 
        float x1 = 0;
 
        for (int i = 0; i < 7; i++) {
            x1 = (1f / 4f) * ((3f * x0) + (c / Mathf.Pow (x0, 3f)));
            x0 = x1;
        }
        print (x1);
    }
}

結果出力された値は 1.778279 となり、これは\(\sqrt [ 4 ]{ 10 } \simeq 1.778279\)を表しているので漸化式が正常に機能している事がわかる
\(1.778279\times 1.778279\times 1.778279\times 1.778279\simeq 10\)

memo:
ある特定の横x縦yのグラフがあったとして、ある関数が描くグラフのyの位置時のxの値を知りたい時に
導関数と微分の式で連立方程式を組んで逆算できる。つまりyになるであろうxを導関数から逆算して計算できる

本来、計算機で計算するなら元の関数(元の関数は導関数を積分したものだから)から逆算した方が早い
物理的に考えるなら位置の関数があって、位置の値から時間を求めたいなら位置の関数を利用する方が手っ取り早い
もし手元に速度の関数しかないなら、それを積分して位置の関数にして逆算する

微積分のメリットは例えるなら「速度の情報しかない時に位置を想定して時間を計算できる」という部分にある
そこに、このような漸化式は「有限回の直接計算をして無限、極限回計算の近似を計算する」という機能を加える
漸化式の計算は複数回繰り返す必要があるので重い処理となる

累乗根や対数など計算機に任せられる部分があるなら積分して位置の関数から値を計算する方が良い
・・もう少し具体的な例を考えてみる

Page Top

物理的な値を求める漸化式を作ってみる anchor.png

思考実験として物理的な値を求める漸化式を作る

<問題>
速度\(v=9.8t\) で移動する物体がある。この物体が700m先の位置を通過する時間を知りたい

この問題を解くため微分積分にあてはめると \(v=9.8t\) を形式的積分の式である \(a{ x }^{ n }\quad \mapsto \quad a\frac { 1 }{ n+1 } { x }^{ n+1 }\) に通すと
\(v=9.8{ t }^{ 1 }\quad \mapsto \quad y=9.8\frac { 1 }{ 1+1 } { t }^{ 1+1 }\quad \rightarrow \quad y=4.9{ t }^{ 2 }\) となる
\(y=4.9{t}^{2}\) は距離の関数なので\(y=700\)との連立方程式を解けばよい

\(\begin{cases} y=4.9{ t }^{ 2 } \\ y=700 \end{cases}\quad \rightarrow \quad 4.9{ t }^{ 2 }=700\quad \rightarrow \quad { t }=\sqrt { \frac { 700 }{ 4.9 } } =11.952...\)・・・①

11.952秒後に通り過ぎる。この計算をする時、電卓に\(\sqrt { }\)キーや\(\log { } \)キーがない。対数表も持ってない
微積分が無限、極限回数の計算を繰り返してたどり着く答えを得ている事を実感できない」時は以下のようにする

\(f'(a)=\lim _{ b\rightarrow a }{ \frac { f(b)-f(a) }{ b-a } } \quad \mapsto \quad 9.8{ t }_{ 0 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ \frac { 4.9{ t }_{ 0 }^{ 2 }-700 }{ { t }_{ 0 }-{ t }_{ 1 } } } \)

\(9.8{ t }_{ 0 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ \frac { 4.9{ t }_{ 0 }^{ 2 }-700 }{ { t }_{ 0 }-{ t }_{ 1 } } } \quad \rightarrow \quad 9.8{ t }_{ 0 }\left( { t }_{ 0 }-{ t }_{ 1 } \right) =\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ 4.9{ t }_{ 0 }^{ 2 }-700 } \quad \rightarrow \quad 9.8{ t }_{ 0 }^{ 2 }-9.8{ t }_{ 0 }\cdot { t }_{ 1 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ 4.9{ t }_{ 0 }^{ 2 }-700 } \\ \)

\(\rightarrow \quad -9.8{ t }_{ 0 }\cdot { t }_{ 1 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ -4.9{ t }_{ 0 }^{ 2 }-700 } \quad \rightarrow \quad 9.8{ t }_{ 0 }\cdot { t }_{ 1 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ 4.9{ t }_{ 0 }^{ 2 }+700 } \quad \rightarrow \quad { t }_{ 0 }\cdot { t }_{ 1 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ \frac { 4.9 }{ 9.8 } { t }_{ 0 }^{ 2 }+\frac { 700 }{ 9.8 } } \\ \)

\(\rightarrow \quad { t }_{ 1 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ \frac { 4.9 }{ 9.8 } { t }_{ 0 }+\frac { 700 }{ 9.8{ t }_{ 0 } } } \quad \rightarrow \quad { t }_{ 1 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ \frac { 1 }{ 2 } { t }_{ 0 }+\frac { 700 }{ 9.8{ t }_{ 0 } } } \quad \rightarrow \quad { t }_{ 1 }=\lim _{ { t }_{ 0 } \rightarrow { t }_{ 1 } }{ \frac { 1 }{ 2 } \left( { t }_{ 0 }+\frac { 700 }{ 4.9{ t }_{ 0 } } \right) } \\ \)

\(\rightarrow \quad { t }_{ n+1 }=\frac { 1 }{ 2 } \left( { t }_{ n }+\frac { 700 }{ 4.9{ t }_{ n } } \right) \\ \)・・・②

この最期の漸化式をコードにすると以下になる

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
 
 
 
 
-
|
-
|
|
|
|
|
-
|
|
!
|
!
!
using UnityEngine;
using System.Collections;
 
public class Numbers6 : MonoBehaviour
{
    void Start ()
    {
        float t0 = 15f;
        float c = 700f;
        
        float t1 = 0;
        
        for (int i = 0; i < 5000; i++) {
            t0 = (1f / 2f) * (t0 + (c / (4.9f * t0)));
            t1 = t0;
        }
        print (t0);
    }
}

t0の値はどんな値を入れても良い。このコードでは5000回計算を繰り返しているが、微分も積分も無限回数この計算を繰り返している事になる。その答えは必ず、\(11.952...\)へと収束する。微分積分はこの仕組みを利用してコンパクトに値を求めているらしい



添付ファイル:

トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Last-modified: 2015-07-09 (木) 21:57:02 (JST) (3219d) by osinko