カテゴリー: 社会

  • 微分方程式に関するここまでのまとめ/中高数学駆け込み寺 第 4 回

    こちらに PDF があります.
    サイトでは見づらい方, コンテンツを手元に置いておきたい方は
    ダウンロードしてご覧ください.

    次回からもう少し数学的に詳しく踏み込んでいきます.
    その前にここまでの話を簡単にまとめておきましょう.

    微分方程式全般

    • 微分方程式というのがあって理工系の大学生は必ず勉強する.
    • 自然法則は微分方程式で表現されることが多い.
    • テレビでもよく見かける洪水のシミュレーションや震源予測でも微分方程式が使われている.
    • テレビゲームのリアルな CG でも使われる.
    • 数学と縁遠そうな生物や文系の経済でも使われる.

    中高数学とシミュレーション

    ここでは微分方程式をそのまま扱うよりも差分で近似してシミュレーションで遊ぶことを目的にしています.
    そしてそのシミュレーションための差分計算で中高の数学を総動員するのでした.
    いくつか箇条書きでまとめておきましょう.

    • 微分方程式は差分でよく近似できる.
    • 差分にすれば四則演算しか使わない.
    • 微分方程式を差分で近似すると数列の漸化式が出てくる.
    • シミュレーションで本当の解 (厳密解) をかなりよく近似できる.
    • 本当の解として指数関数や指数関数が入った分数関数が出てくる.

    後で出す微分方程式の厳密解やその解を導く間に三角関数や対数関数も出てきます.
    当然これの微分積分も必要です.
    シミュレーションの気持ちを知るためにはベクトルが役に立ちますし,
    連立 1 次方程式を解くのに行列を知っていると便利です.
    微分方程式の厳密解を出すのに複素数が使えると便利な場面も多いし,
    実際に大学だとよく使いますね.
    電気回路の理論をやると必ず出てきます.
    ちなみに理工系で実験やろうと思うと必ずどこかしらに電気回路が出てきますから,
    理工系なら複素数使えないとまずいというのも思い知らされます.

    複素数と行列は高校の課程に入ったり入らなかったりするので,
    あなたが高校生ならなおのことどちらかまたは両方を知らないかもしれません.
    この中高数学駆け込み寺でも,
    全体像を知ってモチベーションを上げてもらうという目的があるのであまり深入りはしません.
    興味がある方のために最後に参考文献も含めて今後の勉強の指針をお伝えします.
    それまで少しの間待っていてください.

    次回からは個別の数学

    次回からは数学に関して少しずつ踏み込んでいきます.
    メインの微分や微分方程式の前にベクトルからはじめます.
    シミュレーションを考えるときにも大事なんです.

    アンケートをお願いします.

    今回もアンケートがあります.
    ぜひ回答をお願いします.

    ではまた次回をお楽しみに!

  • 経済や生物で使う微分方程式/中高数学駆け込み寺 第 3 回

    こちらに PDF が置いてあります.
    サイトでは見づらい方は PDF をご覧ください.

    マルサスの『人口論』と微分方程式

    あなたが高校生以上なら社会の授業で次のような言葉を聞いたことがあるかもしれません.

    人口は制限されなければ幾何級数的に増加するが生活資源は算術級数的にしか増加しないので生活資源は必ず不足する.

    これは有名なマルサスの『人口論』で議論された話です.
    幾何級数はいわゆる等比数列の和で,
    算術級数は等差数列の和です.
    マルサスは経済学者なので経済の話です.
    経済の話でこういう数学ネタが出てくるわけですね.

    ちなみに大学の経済学だと経済の話で微分積分が本当に出てきます.
    ときどき経済学部の入試で数学が受験科目に入っていることがあります.
    実際に大学に入ってから使うからです.
    それも高校の理系のレベルを越えた数学です.
    統計データをいろいろいじらないといけないので統計学が必要で,
    そっちでも割といろいろ数学が必要です.

    話を元に戻しましょう.
    マルサスの人口論に合わせて人口の増え方を考えます.
    ここではもっと一般的に生物の集団だと思いましょう.
    まずは生物の種類が 1 種類だとして考えていきます.
    生物っぽく人の数というよりも一般に個体数と呼ぶことにして,
    時刻 $t$ での個体数を $x(t)$ とします1.
    個体数の増加率を出生率の死亡率の差として定義します.
    微分方程式的にいうとこれは $x'(t) / x(t)$ です.
    増加率が一定値 $\alpha$ に等しいとすると $x'(t) / x(t) = \alpha$ だから次の微分方程式が出てきます.

    \begin{align}
    \frac{d x(t)}{dt}
    =
    \alpha x(t).
    \end{align}

    この微分方程式をマルサスモデルと言います.
    これを解くと $x(t) = x(0) e^{\alpha t}$ です.
    これで指数関数が出てきました.
    等比数列は一般項が $a_n = 2^{n}$ のように指数関数で書けている数列だから,
    これを足し上げていけばまさに幾何級数になりますね.
    放射性物質の崩壊とは指数の肩の符号が変わっているだけで,
    それ以外は同じ式です.
    放射性物質の崩壊と生物の個体数の変化を追う方程式が同じ形をしているわけです.

    シミュレーション

    シミュレーションの結果は放射性物質の崩壊のときと基本的に同じです.
    いちおうきちんとやっておきましょうか.
    まず微分方程式を次のように近似します.

    \begin{align}\label{math_refuge00005}
    \frac{x_{n+1} – x_{n}}{h}
    =
    \alpha x_n, \quad
    x_{n+1}
    =
    \alpha x_n + h x_n.
    \end{align}

    これにしたがって解いてみましょう.
    プログラムと結果の図はこのページの後半を確認してください.


    少し現実的な設定にしてみる

    もう少し現実的な設定にしてみます.
    個体数 $x(t)$ が大きくなると食物が足りなかったり,
    衛生状態の悪化で病気にかかりやすくなったりして増加率が減るはずです.
    そこで増加率 $\alpha$ を $\alpha – \beta x$ ($\alpha$, $\beta > 0$) に変えてみます.
    \begin{align}
    \frac{dx}{dt}
    =
    (\alpha – \beta x) x.
    \end{align}
    これにはロジスティック方程式という名前がついています.
    悪化を $\beta x$ と書くことに必然性はありません.
    とりあえずやってみただけです.

    ロジスティック方程式の厳密解

    解き方はさておき解は次のようになります.
    あなたがもしこの関数を微分できるなら,
    厳密解になることを計算して確認してみてください.
    \begin{align}
    x(t)
    =
    \frac{\alpha}{\beta} \frac{1}{1 + e^{- \alpha t}}.
    \end{align}

    これを近似すると次のようになります.
    \begin{align}
    \frac{x_{n+1} – x_{n}}{h}
    =
    (\alpha – \beta x_{n}) x_{n}, \quad
    x_{n+1}
    =
    x_n + h (\alpha – \beta x_{n}) x_{n}.
    \end{align}

    これも厳密解と比較しながら計算してみます.
    プログラムや図はこの記事の後半を参照してください.

    近似の精度が気になります

    これもよく近似できていることは認めてもらえるんじゃないでしょうか?
    でもうるさい人は「近似の精度はどう決めるの?」みたいなことを考えているはずです.

    もちろんいたって真っ当な指摘です.
    ただけっこう難しい問題がたくさんあって,
    なかなかスカっと綺麗に回答できません.
    あとで少し考えることにしてここではこのまま進みます.

    生物学として正しいの?

    あなたは数値計算の精度とかそれ以前の問題として,
    次のように思っているかもしれません.

    • この微分方程式で実際の生物の増減にあてはめられるの?
    • もっと現実的なことを考える必要があるんじゃないか?

    もちろんこれも正しい指摘です.

    例えばマルサスモデルでもロジスティック方程式でも右辺が気になります.
    実際には成長しないと子作りできないですからね.
    その成長が必要だという情報が方程式に盛り込まれていません.

    生物で考えるなら食物連鎖があるわけで食べられて個体数が減ることだってあります.
    天敵が増えたらその個体の数はあおりを受けて激減するはずです.

    もちろんこんなことは折り込み済みで,
    例えば遅延型微分方程式,
    ロトカ-ボルテラ方程式と呼ばれる方程式が対応しています.
    これを調べるのも面白いんですが,
    今回はこのくらいにしておきましょう.

    今回のポイント

    簡単にまとめると,
    今回は近似の精度が気になるあなたのために,
    実際どのくらいよく本当の解を近似できているのかを調べました.
    経済学や生物のようにあんまり数学との関係がなさそうな分野と数学の関係も紹介しています.

    数学的ポイント: 数列と漸化式

    長くなってきましたが最後にちょっと大事な話.
    式 \eqref{math_refuge00005} で $\alpha = 1$, $h = 1$ とすると $x_{n+1} = 2 x_n$ になります.
    この漸化式は高校でも出てくるやつで, もちろん公比 $2$ の等比数列の漸化式です.
    底が $2$ か $e$ かの違いはあっても指数関数で書けることは同じです.
    これはたまたまではなくて数学的に意味があることです.

    $x_{n+1} – x_{n}$ のように数列の隣の項の差を差分と言うことがあります.
    もちろん微分との関係を強く意識した言葉です.
    数列の問題, もっと言えば漸化式の問題は微分方程式とも深い関係があります2.
    あまり深入りはしませんが数学や物理に興味があるなら覚えておくといろいろ楽しいことがあります.

    アンケート

    今回もアンケートがあります.
    改善に繋げたいのでぜひ積極的に回答をお願いします.

    ではまた次回をお楽しみに!

    プログラミングパート

    マルサスモデル

    基本は放射性物質の崩壊と同じだからあっさり行こう.

    \begin{align}
    \frac{dx}{dt}
    =
    \alpha u.
    \end{align}
    厳密解は $x(t) = C_0 e^{\alpha t}$ だ.
    初期値を設定すれば $C_0$ はそこから決まる.

    微分を単純に離散化すると次のようになる.

    \begin{align}
    \frac{x_{n+1} – x_{n}}{h}
    =
    \alpha x_{n}.
    \end{align}

    整理すると次の通り.

    \begin{align}
    x_{n+1}
    =
    x_{n} + \alpha h x_{n}.
    \end{align}

    オイラー法でコードに落とそう.

    マルサスモデルの近似解プログラム

    
    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    
    def malthus_euler(nt, init = 10):
        dt = 2 / (nt - 1)
        # 初期条件設定
        x = np.zeros(nt)
        x[0] = init
    
        for i in range(1, nt):
            x[i] = x[i-1] + c * dt * x[i-1]
    
        return x
    
    
    c = 1
    init = 1
    nt = 101
    x_approx = malthus_euler(nt, init)
    plt.plot(np.linspace(0, 2, nt), x_approx)
    
    
    t = np.linspace(0, 2, nt)
    x_exact = init * np.exp(c * t)
    plt.plot(t, x_exact)
    
    
    plt.legend(['approximation', 'exact'])
    
    plt.show()
    

    RESULT

    放射性物質の崩壊の時との違い

    t が大きくなると厳密解の方が少し大きくなる.
    指数の肩の符号が違うだけなので,
    放射性物質の崩壊で形式的に時間を負の方に伸ばせば同じようにズレが出てくるはずだ.
    私の今の感覚だとこのズレが今回のように大きくなるように出るのかどうかまではわからない.

    何はともあれ区間の分割数 nt を大きくしてみたのが次の結果:
    具体的には 101 から 1001 にした.

    パラメータを修正して再計算

    ライブラリが読み込まれていたり関数 malthus_euler が定義されている前提のコード片なので,
    これだけで実行できるわけではない.
    IPython か Jupyter なら順にセルを読み込んでいけばそのまま実行できる.

    
    
    c = 1
    init = 1
    nt = 1001
    x_approx = malthus_euler(nt, init)
    plt.plot(np.linspace(0, 2, nt), x_approx)
    
    
    t = np.linspace(0, 2, nt)
    x_exact = init * np.exp(c * t)
    plt.plot(t, x_exact)
    
    
    plt.legend(['approximation', 'exact'])
    
    plt.show()
    

    RESULT

    注意

    $nt = 101$ よりも近似の精度が良くなった.
    この辺は単純に振る舞ってくれるようだ.

    調和振動子だとオイラー法自体がうまく動かないから注意したい.

    ロジスティック方程式

    方程式は次の通り.

    \begin{align}
    \frac{dx}{dt}
    =
    (\alpha – \beta x) x.
    \end{align}

    厳密解は次の通り.

    \begin{align}
    x(t)
    =
    \frac{\alpha}{\beta} \frac{1}{1 + e^{- \alpha t}}.
    \end{align}

    近似すると次の通り.

    \begin{align}
    \frac{x_{n+1} – x_{n}}{h}
    =
    (\alpha – \beta x_{n}) x_{n}, \quad
    x_{n+1}
    =
    x_n + h (\alpha – \beta x_{n}) x_{n}.
    \end{align}

    では数値的に解いてみよう.
    とりあえず $\alpha = 2$, $\beta = 1$ で計算している.

    ロジスティック方程式の近似解プログラム

    
    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    
    def logistics_euler(nt, init = 10):
        dt = T / (nt - 1)
        # 初期条件設定
        x = np.zeros(nt)
        x[0] = init
    
        # ベクトル計算で一気に計算したい
        for i in range(1, nt):
            x[i] = x[i-1] + dt * (alpha - beta * x[i-1]) * x[i-1]
    
        return x
    
    
    alpha = 2
    beta = 1
    init = 1
    nt = 101
    T = 5 # 時間変化を見る最大値
    x_approx = logistics_euler(nt, init)
    plt.plot(np.linspace(0, T, nt), x_approx)
    
    
    t = np.linspace(0, T, nt)
    x_exact = (alpha / beta) / (1 + np.exp(- alpha * t))
    plt.plot(t, x_exact)
    
    
    plt.legend(['approximation', 'exact'])
    
    plt.show()
    

    RESULT

    時間の刻みを変えてみる

    近似解と厳密解にちょっとズレが見える.
    そこで nt = 101 から nt = 1001 にしてみた.

    パラメータを修正して再計算

    
    
    alpha = 2
    beta = 1
    init = 1
    nt = 1001
    T = 5 # 時間変化を見る最大値
    x_approx = logistics_euler(nt, init)
    plt.plot(np.linspace(0, T, nt), x_approx)
    
    
    t = np.linspace(0, T, nt)
    x_exact = (alpha / beta) / (1 + np.exp(- alpha * t))
    plt.plot(t, x_exact)
    
    
    plt.legend(['approximation', 'exact'])
    
    plt.show()
    

    RESULT


    1. 本当は $x(t)$ は整数なんですがここではいったん実数だと思っておきます.
      この辺の処理は物理や化学でもよく出てきます.
      実はこの近似というか合理化もきちんとやっておかないといけません.
      ここではとてもやりきれませんけど.
      本当は時間についてもいろいろ議論があります. 
    2. もっと広く力学系と呼ばれる分野にまで広がります.
      力学系まで行くととんでもなく難しくなるのでとてもここで紹介はできません.
      でも幾何学とも関係してきたり整数論とも関係してきたり,
      射程範囲は広いです. 
  • 2016-12-04 経済や生物で使う微分方程式/中高数学駆け込み寺

    次の URL から PDF をダウンロードしてください.

    今回は経済や生物のように,
    数学とあまりご縁がなさそうな分野で
    出てくる微分方程式を紹介します.

    高校の教科書でも出てくる有名な
    マルサスの人口論の話です.

    今回もシミュレーションの結果を
    プログラムにして計算させています.
    そっちもぜひ見てみてください.

    今回のアンケートはこちらです.

    ここまで出したコンテンツは次の通りです。

    サイトにも上げてあるので
    必要ならそこからも辿ってみてください.
    数学や物理をはじめとした
    専門的な情報もいろいろ載っています.

    プログラムについては次のページにまとめてあります.
    追加もしていくのでぜひ確認してください.

    各回ごとにアンケートもあります.
    ぜひそちらの回答もお願いします.
    今回のアンケートはこちらです.

    全体的に作り上げたら整理して
    まとめ直して最初から配信し直そうと思います.
    復習も兼ねてぜひそちらもしっかり見てください.

    この文章はサイトにも上げているのでそちらを見た方へ

    次のページから登録すればメールで
    コンテンツをお届けしていきます.
    いちいちサイトをチェックするのが面倒でしたら
    ぜひこちらから登録しておいてください.

    気に入ったならぜひご友人にも紹介してください.

    ではまたメールします.