はじめに
これは Math Advent Calendar 2017の12/4の回です. ちょっと書き足りないところもあるので適当なときに追記したいとは思っています.
当初はテキストも載せていたのですがWeb上では読みにくいため次のリンクにあるPDFだけにしました.
これは Math Advent Calendar 2017の12/4の回です. ちょっと書き足りないところもあるので適当なときに追記したいとは思っています.
当初はテキストも載せていたのですがWeb上では読みにくいため次のリンクにあるPDFだけにしました.
これは無料メール通信講座, 応用からの中高数学再入門 中高数学駆け込み寺の
読者アンケートを受けた記事内容だ.
一般的に大事そうだったのでサイトにも転記しておく.
以下メールの内容.
気になるところが 2 つありました.
- ある程度微分できても微分方程式の概念を掴むのは難しい, と感じました.
- 微分方程式の概念が掴めたら嬉しいですね
まず微分と微分方程式は原則として全く違う話なので,
微分への理解と微分方程式への理解も全然違う話ですね.
もっと本質的に気になったのは「ある程度微分できる」というところ.
微分できるというのが「具体的な関数の微分を計算できる」という意味なら,
微分の計算ができるだけで原則的に理解とは全く関係ない話です.
極端な話, 数式処理プログラムでさえきちんと設計・実装すれば微分の計算はできます.
つまり概念として微分を知らなくても計算はできます.
この方が「微分できる」と言ったときに何をイメージしたのか,
それをぜひ伺いたいですね.
そして後者の「微分方程式の概念を掴む」というところ.
これは何を意図しているのかが全然わかりません.
先日, 号外として次のようなタイトルのメールを出しました.
受け取っていない方もいるでしょうから,
サイトに記事として上げておきました.
微分方程式はたぶん微分とつくから鬱陶しいので,
方程式と思ってもらえればいいです.
これでわからないなら,
あなたはそもそも方程式を理解していないですね.
理解していないからダメとかそういう話ではなく,
単に事実認識の問題です.
方程式とは何か?
みたいなことも中高でほとんどまともにやらないので,
それも仕方のないことではあります.
いちおう簡単に言っておくと,
何らかの変数と関係式があり,
変数に適当な値を入れたときだけその関係式が
成り立つ場合にその関係式を方程式と言います.
いまは関係式に微分が使われているだけです.
中高では方程式というと代数方程式,
つまり $x^2 – 2 x + 1 = 0$ のような方程式を指します.
これは関係式を数の加減乗除で書いている方程式です.
数の加減乗除が関数の加減乗除に変わったのが
微分方程式であり, それ以上の意味はありませんし,
概念的にもそれだけです.
物理なり生物なり経済なりに使うときには
その分野に応じた意味づけはされますし,
数学内部であっても応用されるときには
その文脈に応じた意味があります.
しかし, 本当に純粋に概念的に何なのか,
と言われたら先程書いたような答えですね.
少し補足してもう一度書くと次の通りです.
何らかの変数と関係式があり,
変数に適当な値を入れたときだけその関係式が
成り立つ場合にその関係式.
特に関係式に微分が使われているとき
微分方程式と呼ぶ.
この極めて抽象的な表現で何か理解できるかと
言われたらそれは厳しいとは思いますし,
特にこれ以上の意味はありません.
ちなみに「数学ができる人」が
こういう概念レベル, 抽象論を理解できているかは別ですね.
先程書いたように「微分ができる」と言っても
具体的な計算ができること,
特に具体的な導関数の計算ができることと,
幾何的に見たときの導関数の気分を理解していることと,
微分そのものを概念的にどう理解するかということの間には
おそらくそれぞれ深いギャップがあります.
数学科で言うなら理解のレベルは
最後のところを要求しますし,
それも概念的にいろいろな捉え方があって,
各人の専門によってどうするかがまた変わります.
こうした認識の差を埋めることが
私が提供すべきコンテンツの内容になるべきなのだろう,
そんな感じがします.
その前に「概念的に理解」とか,
もっと強く「理解」という言葉の意味に対しても
共通認識を作る必要がありますね.
「概念的に理解」するというのが何を指しているのか,
いまだにさっぱりわからないです.
人によって意味するところも違うでしょうし.
まだ提供しているコンテンツと
求められているコンテンツに
ギャップがある気がしています.
何とかする気じたいは満々なので,
引き続きぜひコメント頂ければ,
と思います.
ではまたメールします.
これは無料メール通信講座, 応用からの中高数学再入門 中高数学駆け込み寺の
読者アンケートを受けた記事内容だ.
一般的に大事そうだったのでサイトにも転記しておく.
以下メールの内容.
気になるアンケートの回答があったので,
急ぎコメントしました.
アンケートの回答集の PDF を次の URL から
ダウンロードしてください.
その 7 と その 8 が追加分です.
詳しくは PDF のコメントを見てほしいのですが,
その 8 で「もうすこし専門用語を簡単かつ概念的に理解できる説明がほしい」
というコメントがありました.
以前次のような記事を書いたことがあります.
この記事の要約は最初に引用したツイートで尽きています.
引用すると次の通り.
『「数式を並べるんじゃなくて、
概念を説明してほしい」的なことを言われた経験がある』
は『「抽象化された数式は難しくて理解できないので、
具体例を上げて説明してほしい」という意味で』というのは
非常に深い洞察だと思った。
PDF の中でもコメントしたように,
「概念的に理解する」というのは
抽象的に理解するということで,
これは理解の究極的な形です.
「もう少し」とかいうレベルではありません.
いきなり究極レベルの理解を「もう少し」とか
いうので求められるのは驚きしかありません.
「概念的に理解」という異常なまでに
高いハードルを設定するのは
ただただ修羅の道です.
数学科でただただ数学と向き合おう,
というタイプの人でもない限り,
「概念的に理解」しようとすること自体
おすすめできません.
先程紹介した記事のように,
「概念的に理解」というのが
「具体的に説明してほしい」ということなら,
そのように正しく日本語を使ってほしいです.
意思疎通できなくて本当に困っています.
数学に限らず勉強していてよくあるのは,
言葉を雑に扱ったせいで勝手に混乱して
勝手に自滅して挫折することです.
本当によくあります.
言葉は大切に扱ってください.
余裕がある限りアンケートには
小まめにコメントしていくようにします.
それ以外にも何か質問があれば気軽にどうぞ.
余裕がある範囲で対応していきます.
ではまたメールします.
こちらに PDF があります.
サイトでは見づらい方, コンテンツを手元に置いておきたい方は
ダウンロードしてご覧ください.
前回で流れを一通り回収しました.
最初にとにかく微分方程式をシミュレーションしています.
物理, 経済, 生物といろいろな分野の現象が微分方程式で書けることを紹介し,
プログラムを書いて解いています.
そのあとベクトル, 関数, 数列, 微分とつなげてきました.
雑に「微分」と書きました.
数学的には微分というと微分 1-形式を想像したりもするので,
数学関係者からは怒られそうな書き方なんですがまあいいでしょう.
ちゃんというなら微分係数の定義,
そして導関数の定義です.
関数 $f(x)$ の導関数 $f'(x)$ は次のように定義するのでした.
\begin{align}
f'(x)
=
\lim_{h \to 0} \frac{f(x + h) – f(x)}{h}.
\end{align}
微分係数はよく関数の接線の傾きと言われますね?
それは確かに間違いないし,
そういう絵も描けて目に見えて「わかりやすい」のかもしれません.
でも「だから何なの」と思いませんか?
ふだん接線引く機会なんてないし,
それでどこが嬉しいのか, 何を説明したことになるのか,
まあ分からない.
これで何かを説明した気になられても, とずっと思っていました.
地球が球体とか楕円体だとかいう話,
ふだん実感することありますか?
あなたが山に住んでいるなら坂のアップダウンが激しかったり,
海辺に住んでいると地平線が見えてしまったりするので微妙なんですが,
まあ地面は平らと感じていることにしてください.
この感じを数学的に抜き出したのが微分という概念です.
要は曲がっているものでも拡大していけばまっすぐに感じるよね,
という話です.
具体的には地面を歩いていても目に見える範囲で地球の曲がりを感じることはありません.
まっすぐどこまでも続いているように感じます.
実際には地球の表面は曲がっているにも関わらず.
このとき地球の大きさに対して人間がものすごく小さいことに注意してください.
地球を球と思うとだいたい半径が 6000 km です.
$10^{7}$ という桁の違いがあれば曲がったものもまっすぐに感じるのをふだんから実感しているわけです.
シミュレーションでもこの事情を使って近似をしています.
「だって実際平らだって思ってるでしょ?」という感じ.
数学的な言葉に翻訳すると全体を見れば曲面であっても,
局所的に考えれば平面で近似できるということです.
3 次元空間内での平面は $ax + by + cz = d$ という一次式で書けます.
この幾何を背景にした一次近似が微分の気持ちです.
曲がっているものをまっすぐ見るのが微分と言いました.
1 変数というか 1 次元というか,
その世界でまっすぐなものは直線です.
曲線を直線または線分で近似していこうというのが微分なわけです.
それで接線の話につながるんですね.
具体的な図は第 5 回のベクトル回で紹介しています.
後半にプログラムと一緒に図をいくつか載せているのでその図を見てみてください.
アニメーションも合わせて載せているので,
曲がっているものはまっすぐなもので近似できるんだ,
というのが視覚的にわかると思います.
微分できない状況はいくつかあります.
気分的に言えば変な曲がり方をしているものなんていくらでもあるし,
いつでもまっすぐなもので単純に近似しようとしてもうまくいくわけないよね,
というただそれだけの話です.
ご都合主義は押し通せないというだけ.
個別具体的にはいろいろあって,
特異点論みたいな大事な話もあります.
そこまでいくとウルトラハードモードになるので,
こんなところで議論しきれません.
お住まいの地域によっては全く感じ取れないかもしれません.
「地面」の定義次第なんですが,
とりあえず地球が曲がっていると感じられる人はそんなにいないと思っています.
曲がったものでも十分近づけばまっすぐ感じるよね,
曲線だったら直線, もっと言えば接線で十分よく近似できるし,
曲面なら平面, もっと言えば接平面で十分よく近似できるよね,
そういう話です.
今回もアンケートがあります.
改善につなげるためぜひ回答をお願いします.
次回は今後の勉強の指針をお伝えしていきます.
\clearpage
こちらに PDF があります.
サイトでは見づらい方, コンテンツを手元に置いておきたい方は
ダウンロードしてご覧ください.
ベクトル, 関数, 数列ときて,
数列を決めるルールとしての漸化式に流れてきました.
最初の微分方程式のシミュレーションでは,
そもそもの話として微分方程式を近似して漸化式を出し,
その漸化式をもとに数値計算・シミュレーションをしていたのでした.
いい加減この 2 つをきちんと繋げましょう.
それが今回の目的です.
前回は小学校の算数の文章題を思い出していました.
ついでに高校の力学の話もちょっとやりました.
要は $a_{n+1} – a_{n} = \alpha_n$ と階差数列が定数ではなく数列になっているわけです.
そして一般的にその数列がわからないから手も足も出ない, と.
一般論は諦めましょう.
階差 $a_{n+1} – a_{n}$ が数列であったとしてもどうにかなる場合はあります.
それは高校でもいくつか具体例は見ています.
一番暴力的に単純なのは $a_{n+1} – a_{n} = \alpha a_{n}$ のように,
階差が直接 $a_{n}$ で, それも $a_n$ の一次式で書ける場合です.
これは特に $a_{n+1} = (1 + \alpha) a_n$ なので等比数列です.
あなたは「そんな都合のいいやつだけ考えて意味あるの?」と思うかもしれません.
微分方程式を考えるなら十二分に意味があります.
それを見てみましょう.
まずは関数の微分係数を定義します.
ある点 $a$ での関数の微分係数 $f'(a)$ は次のように定義します.
\begin{align}
f'(a)
=
\lim_{h \to 0} \frac{f(a + h) – f(a)}{h}.
\end{align}
$\lim_{h \to 0}$ はあとで簡単に説明することにして,
まずは言葉を定義します.
次は導関数ですね.
いま微分係数の定義では点 $a$ を固定していました.
それを動かして一般の点 $x$ にすれば新しく数と数の対応が作れます.
つまり関数が定義できます.
その関数を導関数と呼びます.
元の関数から導出される関数だから導関数なんだと思ってください.
そもそも $\lim_{h \to 0}$ って何なのかと.
厳密な話は別のところでやっているので省略します.
ちゃんとやるの大変だし,
そもそも数学科でもない限り必要ない議論なので.
$\lim_{h \to 0}$ は $h \to 0$ の見た目の通り $h$ を $0$ に近づけていくという意味です.
$h$ を限りなく $0$ に近づけると言ったりもしますね.
つまり $\lim_{h \to 0} \frac{f(x + h) – f(x)}{h}$ は比 $\frac{f(x + h) – f(x)}{h}$ を考え,
$h$ をどんどん小さくしていった究極の姿を取り出せ, という命令です.
前回, 漸化式で数列 {$a_n$} の $n$ はステップだと言いました.
1 分後とか 1 秒後とかそういう意味です.
極限の記号 $\lim_{h \to 0}$ で出てくる $h$ が何を制御しているかというと,
まさにこのステップの刻みです.
$h$ が分なり秒なりの適当な意味で $1$ だとすると,
$f(x + h)$ は $a_{n+1}$, $f(x)$ は $a_n$ だとみなせます.
大雑把に言えば数列の $n$ 番目, $n$ ステップ目 $a_{n}$ を
$x$ 番目と思ったのが $f(x)$ です.
極限はステップの刻みをどんどん小さくしていきますよ,
と言っているだけです.
小さくしていった究極の姿が導関数または微分係数 $f'(x)$ なので,
$h$ が小さければ $f'(x) \fallingdotseq \frac{f(x + h) – f(h)}{h}$ です.
極限という面倒な概念操作をはさむので $f'(x)$ はどうしてもわかりづらいですが,
右辺でよく近似できます.
ここでごく単純に $f'(x) = \alpha f(x)$ としてみましょう.
$f'(x)$ は $df(x) / dx$ とも書けます.
最初にやった微分方程式と揃えるため,
変数は $x$ から $t$ にして関数は $f$ ではなく $u$ と書くことにすると
$\frac{du}{dt} = \alpha u$ ですね.
これは最初にやった放射性物質の崩壊の微分方程式です.
次にさっきやった近似を使います.
$\frac{du}{dt} = \frac{u (t + h) – u(t)}{h}$ なのでした.
上の 2 式をまとめると次の式が出ます.
\begin{align}
\frac{u (t + h) – u(t)}{h}
=
\alpha u(t).
\end{align}
もちろん次のようにも書けます.
\begin{align}
u(t + h) – u(t)
=
\alpha h u(t).
\end{align}
$t$ や $h$ で書き変わっているものの,
$t$ が変数で $h$ が固定のステップの刻みなんだと思えば,
$a_{n + 1} – a_{n} = \alpha’ a_{n}$ と同じ形です: もちろん $\alpha’ = \alpha h$.
ご都合主義のような解ける漸化式,
実は現実とよくマッチしてるんですね.
こんなところです.
この講座では放射性物質の崩壊と単振動くらいしか紹介してはいませんが,
数列の処理がきちんとできると割とそのノリで物理もできます.
高校でもやる単振動の運動方程式は $\frac{d^2 u}{dt^2} = – \omega^2 u$ です.
2 階微分の左辺はともかく右辺で $u$ の一次式が出てくるわけで,
大雑把に言えばさっき説明したのと同じ形です.
今回, 微分の話もそこそこに微分方程式に突っ込んで流れを回収しました.
次回はちゃんと微分の話をしましょう.
厳密な話をしていてもきりがないので,
高校であまり触れられない「気分」を紹介します.
今回もアンケートがあります.
改善につなげるためぜひ回答をお願いします.
ではまた次回をお楽しみに!
\clearpage
こちらに PDF があります.
サイトでは見づらい方, コンテンツを手元に置いておきたい方は
ダウンロードしてご覧ください.
前回数列の説明をしました.
関数は数と数の対応ルールのことで,
数列は関数の特別な形,
つまり自然数と実数の対応ルールのことでした.
で, 漸化式.
漸化式は数列のルールの作り方の 1 つなのでした.
ここから微分方程式から見た微分の発想につながっていきます.
この添字, 普段は数列の $n$ 番目としか言ってないですね.
もっと積極的な意味をつけましょう.
それは$n$ 分後とか$n$ ステップ後とか時間的な意味です.
2 つめの $n$ ステップがわかりづらいでしょう.
それはあとで説明します.
小学校の頃こんな問題があったのを覚えているでしょうか?
A さんは毎分 75 m の速さで歩いて家を出ました.
A さんは 5 分後に何 m 先にいるでしょうか?
こんなのは $5 \times 75 = 375$ で一発です.
これを数列のスタンスで解いてみましょう.
A さんの $n$ 分後の家からの距離を $a_{n}$ と書くことにします.
まず $a_{0} = 0$ ですね.
毎分 75 m の速さで進むので 1 分後の家からの距離 $a_{1}$ は $a_{1} = a_{0} + 75 = 75$ です.
2 分後の距離 $a_{2}$ は 1 分後の距離から 75 m 追加です.
式で書けばもちろん $a_{2} = a_{1} + 75 = 150$ ですね.
これをくり返せば $n+1$ 分後の家から距離 $a_{n+1}$ は $a_{n+1} = a_{n} + 75$ です.
1 分前にどこにいたかわかれば次にどこにいるかわかります.
いま毎分 75 m と言ったから $n$ 分後としただけで,
これが毎時 75 m だったら $n$ 時間後を考えたいし,
毎秒 75 m だったら $n$ 秒後を考えたいですね?
いちいち状況に合わせて $n$ の呼び名を変えるの面倒ですから,
$n$ は時間というよりこの適当な単位のことだと思いたいです.
それを言葉ではっきりさせるために $a_{n}$ を $n$ ステップ目と呼びましょう.
あなたは当たり前のことを言っているだけだと思ったかもしれません.
その通りです.
そしてこの当たり前を過激に推し進めると微分に近づいていきます.
高校の力学の基本は等加速度運動です.
つまりある時刻を基準にしてその $n$ ステップ後の速さを $v_{n}$ としましょう.
速度が 1 ステップごとに $\alpha$ だけ増えるのなら,
等加速度運動は $v_{n+1} = v_{n} + \alpha$ で決まる漸化式で書けます.
実際には 1 ステップとかケチくさいこと言わないで一気に次のように書きます.
基準時刻から任意の時刻 $t$ が経過したあとの速さは $v(t) = v_0 + \alpha t$.
ここで $v_0$ は初期速度である.
漸化式を解くと $v_{n} = v_{0} + \alpha n$ なので,
形式的に $n$ を $t$ に変えればいいだけです.
でもいきなり上みたいに書かれて物理全然わからん!と思ってたりしませんでした?
やってること, 小学校の頃と何も変わりませんよ?
ふつうは適当に平均を取ると毎分 75 mなのであって,
ずっと同じペースで動いているわけないですね.
漸化式で言うと $v_{n+1} = v_{n} + \alpha$ みたいなのが成り立ちません.
$\alpha$ がステップごとに変わるわけで.
どこにどう責任を押しつけるかは難しいところです.
いちばんシンプルなのは上に書いたように $\alpha$ を $n$ の関数だと思うことですね.
つまり $v_{n+1} = v_{n} + \alpha_{n}$ と $\alpha$ を定数から関数 (数列) にしてしまいます.
面倒なのでもう考える問題は A さんが場所 B から場所 C に移動する状況にしましょう.
そして $\alpha_{n}$ の部分をなるべくシンプルにしたいです.
実はここで究極的な理想形を考えると微分が出てきます.
とてもシンプルです.
ただもう少し現実の泥くさいところ・面倒くさいところを考えていきます.
何をどうがんばっても $\alpha_n = \alpha$ にすることだけはできません.
逆にもしそうできてしまったとすると全ての運動が等加速度運動にしかならないからです.
残念ながらそんな世界には生きていません.
とにかく $\alpha_{n}$ が曲者です.
これを何とかしたい.
もちろん一般的にはどうにもなりません.
でも特殊な状況なら何とかなるかもしれません.
数列と漸化式を基本に考えていても苦しいので,
いったんそこから抜けることにしましょう.
最初に漸化式は微分方程式を近似して出てくることを見ましたね?
このミニ講座では微分方程式が本体です.
何の指針もなく五里霧中を彷徨うよりも,
大事な微分方程式と関係した漸化式を考える方が手が打ちやすいです.
というわけで数列のレベルでぐちゃぐちゃ考えるのはこの辺にして,
もう微分に行ってしまいましょう.
今回はこの辺で終わりにします.
お疲れ様でした.
今回もアンケートがあります.
改善に役立てたいのでぜひご協力をお願いします.
ではまた次回をお楽しみに!
こちらに PDF があります.
サイトでは見づらい方, コンテンツを手元に置いておきたい方は
ダウンロードしてご覧ください.
ベクトル, 関数と来て今回は数列です.
簡単に復習すると,
関数は数と数の割り当てルールのことで,
数列も関数なのでした.
いろんな数列があります.
高校でもいろいろやります.
今回の話で 1 番大事な等比数列です.
長々とやっても仕方ないので軽く復習しときましょう.
$(x_n)$ を数列とします.
高校だと {$x_n$} と中括弧で書くと思いますが大学の数学的な都合で小括弧で書くことにします.
等比数列がどんな数列だったか,
つまりどんなルールで与えられているのかというとこんなルールです:
\begin{align}
x_{n+1}
=
\alpha x_{n}.
\end{align}
$x_{n}$ が 0 のときでも成り立つ形で書きました.
$x_{n}$ が 0 ではないならもちろん $x_{n+1} / x_{n} = \alpha$ と書けます.
どんな $n$ に対しても比が一定な数列だから等比数列というのでした.
このルールを使って一般項を出します.
$x_{n+1} = \alpha x_{n}$ で,
$x_{n} = \alpha x_{n-1}$ で,
$x_{n-1} = \alpha x_{n-2}$ で,
と延々続きます.
これが終わるのは $x_1 = \alpha x_{0}$ です.
順々に代入していくと $x_{n} = x_{0} \alpha^{n}$ になりますね.
この計算, はまる人ははまります.
実際私も高校の頃, 時々わけがわからなくなることがありました.
試験で慌てていてパニクったことを思い出します.
それはそれとして,
ここで細々とした計算を詳しく解説してると本筋を見失うので省略します.
数列をどんなところでどう使うのか,
それをちゃんと見てからきちんとやった方がよさそうですしね.
これがどこで出てきたかというと微分方程式を近似した方程式で出てきたのでした.
放射性物質の崩壊で出てきたのはこんなやつです.
\begin{align}
\frac{x_{n+1} – x_{n}}{h}
=
– x_{n}.
\end{align}
これを整理すると $x_{n+1} = (1 – h) x_{n}$ で,
$1-h = \alpha$ とすればまさにさっき書いた等比数列ですね.
さっき書いたように等比数列は指数関数で書けます.
で, 元の微分方程式の解も実は指数関数で書けます.
ちょっと先走ったことも書きました.
何はともあれ, 数列は関数で, 関数は数と数の割り当てルールのことで,
その割り当てルールとして等比数列っていう割り当て方があるんだ,
ということです.
微分方程式もその割り当てルールと見なせるっていうのが今書いたことです.
微分方程式と揃えた言い方として上の式は差分方程式と言うこともあります.
ちなみに上で紹介した割り当てルールはもっと一般的にできます.
これ, 要は次の項をその前の項で決まると言っているだけなので,
$a_{n+1} = a_{n}^2$ みたいにしてもいいし,
$a_{n+1} = a_{n} + a_{n-1}$ みたいに 2 つ前と関係あるようにしてもいいです.
この一般的なやつがいわゆる漸化式です.
もちろんこれ以外にもいろいろな漸化式があります.
あとで使うのでもう 1 つ漸化式を紹介します.
そのために 2 つの数列 $(x_{n})$, $(v_{n})$ を用意します.
で, 次のような漸化式を考えます.
\begin{align}
x_{n+1} – x_{n}
=
v_{n}, \quad
v_{n+1} – v_{n}
=
– \alpha^2 x_{n}.
\end{align}
2 つの数列が絡まりあう漸化式です.
高校でやる言葉を使うなら,
互いに階差数列を取ってると思ってもいいかもしれません.
これがどこから出てくるかというと次の微分方程式からです.
\begin{align}
\frac{d^2 x(t)}{dt^2}
=
– \alpha^{2} x(t).
\end{align}
この微分方程式も物理でよく出てくる方程式で,
いわゆる単振動の運動方程式です.
さっきの漸化式を出すには $v(t) = x'(t)$ としてもとの方程式も $v’ = – \alpha^2 x$ とすればいいです.
これを差分近似すると次の式が出てきます.
\begin{align}
x_{n+1}
=
x_{n} + h v_{n}, \quad
v_{n+1}
=
v_{n} – h \alpha^{2} x_{n}.
\end{align}
$h$ が入っていて係数が微妙に違いますが,
あまり気にしないでください.
この辺の計算プログラムも準備してあります.
この記事後半のプログラムパートを確認してください.
今回もアンケートがあります.
改善につなげるためぜひ回答をお願いします.
ではまた次回をお楽しみに!
復習でもう 1 回.
一番単純でしかも実際に使われる微分方程式としてまずは 1 階の線型常微分方程式を考えよう.
ちょっと不吉な例であるが放射性物質の崩壊の方程式を紹介する.
導出をしたければちゃんと物理を勉強してもらう必要がある.
ここでは物理は省略して数学に集中する.
\begin{align}
\frac{dx}{dt} = – c x.
\end{align}
厳密解は $x = C_0 e^{-ct}$ だ.
初期値を設定すれば $C_0$ はそこから決まる.
微分を単純に離散化すると次のようになる.
\begin{align}
\frac{x_{n+1} – x_{n}}{\Delta t}
=
-c x_{n}.
\end{align}
$\Delta t$ は $h$ と書くこともある.
整理すると次の通り.
\begin{align}
x_{n+1}
=
x_{n} – c (\Delta t) x_{n}.
\end{align}
これに沿って計算したのがいわゆるオイラー法.
次のセルではこれをコードに落としている.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
def radioactive_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
nt = 101
init = 5
x1 = radioactive_euler(nt, init)
plt.plot(np.linspace(0, 2, nt), x1)
# 厳密解
t = np.linspace(0, 2, nt)
x2 = init * np.exp(- c * t)
plt.plot(t, x2)
# 凡例
plt.legend(['approximation', 'exact'])
plt.show()
# 描画
#plt.savefig(img_file)
#b64 = base64.encodestring(open(img_file, 'rb').read()).decode('utf-8')
#img_str = "
" % (b64)
#print(img_str)
RESULT
こちらは単振動.
次に 2 階の常微分方程式を紹介しよう.
高校の物理で出てくるばねの振動(単振動)がまさにこの例だ.
項を増やすと減衰振動になったり、外力をつけたりといろいろなケースがある.
まずは一番単純な式を考えよう.
\begin{align}
\frac{d^2 x}{dt^2}
=
– \omega^2 x.
\end{align}
オイラー法やルンゲ-クッタ法は
1 階の方程式に対する計算法なので直接は使えない.
今は中間処理として $v = dx/dt$ を置いて計算すればいい.
これは単なる数値計算の便法ではない.
速度の意味もあるから,
という表面的な理由ではなくもっと深く解析力学の文脈で物理としても大事な視点だ.
もっといえばシンプレクティック計算法などもっといい計算法にも発展する.
とりあえずオイラー法で計算したい.
まずは微分方程式自体を書き直す.
\begin{align}
\frac{dx}{dt}
=
v, \quad
\frac{dv}{dt}
=
– \omega^2 x.
\end{align}
これをオイラー法で近似しよう.
\begin{align}
x_{n+1}
=
x_{n} + h v_{n}, \quad
v_{n+1}
=
v_{n} – h \omega^{2} x_{n}.
\end{align}
オイラー法をコードに落とす.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
def harmonic_euler(nt, init = (5, 0)):
dt = t_range / (nt - 1)
# 初期条件設定
x = np.zeros(nt)
v = np.zeros(nt)
x[0] = init[0]
v[0] = init[1]
for i in range(1, nt):
x[i] = x[i-1] + dt * v[i-1]
v[i] = v[i-1] - dt * (omega ** 2) * x[i-1]
# ベクトル計算で書き直したい
return (x, v)
omega = 2 * np.pi
nt = 101
t_range = 2
init = (5, 0)
harm = harmonic_euler(nt, init)
t = np.linspace(0, 2, nt)
# 厳密解
x_exact = init[0] * np.cos(- omega * t)
v_exact = - omega * init[0] * np.sin(omega * t)
# グラフ描画
plt.subplot(3, 1, 1)
plt.title('x-t graph')
plt.plot(np.linspace(0, 2, nt), harm[0])
plt.plot(t, x_exact)
plt.legend(['x approximation', 'x exact'])
plt.subplot(3, 1, 2)
plt.title('v-t graph')
plt.plot(np.linspace(0, 2, nt), harm[1])
plt.plot(t, v_exact)
plt.legend(['v approximation', 'v exact'])
plt.subplot(3, 1, 3)
plt.title('phase space')
plt.plot(harm[0], harm[1])
# 描画
plt.tight_layout()
plt.show()
#plt.savefig(img_file)
#b64 = base64.encodestring(open(img_file, 'rb').read()).decode('utf-8')
#img_str = "
" % (b64)
#print(img_str)
RESULT
見ての通り時間が進むごとに誤差が大きくなる.
nt を大きくすると少しはましになる.
実際に上のコードで nt を大きくして再計算してみてほしい.
あとまずいのは phase space の図だ.
この系はエネルギーが保存する系だから相空間内の軌道が閉じてほしいのにそうなっていない.
シンプレクティックにやれば解消できるようだが, とにかくここではよろしくない.
この方程式でオイラー法はよろしくないことがわかった.
とりあえずルンゲ-クッタでやってみよう.
とりあえず近似式を書く.
\begin{align}
x_{n+1}
&=
x_{n} + \frac{h}{6} (k_{1} + 2 k_{2} + 2 k_{3} + k_{4}),
\end{align}
\begin{align}
t_{n+1}
&=
t_{n} + h,
\end{align}
\begin{align}
k_{1}
&=
v_{n},
\end{align}
\begin{align}
k_{2}
&=
v_{n} + \frac{h}{2} k_{1},
\end{align}
\begin{align}
k_{3}
&=
v_{n} + \frac{h}{2} k_{2},
\end{align}
\begin{align}
k_{4}
&=
v_{n} + h k_{3}.
\end{align}
次が $v$ の式.
\begin{align}
v_{n+1}
&=
v_{n} + \frac{h}{6} (k_{1} + 2 k_{2} + 2 k_{3} + k_{4}),
\end{align}
\begin{align}
t_{n+1}
&=
t_{n} + h,
\end{align}
\begin{align}
k_{1}
&=
– \omega^2 x_{n},
\end{align}
\begin{align}
k_{2}
&=
x_{n} – \frac{h}{2} \omega^2 k_{1},
\end{align}
\begin{align}
k_{3}
&=
x_{n} – \frac{h}{2} \omega^2 k_{2},
\end{align}
\begin{align}
k_{4}
&=
x_{n} – h \omega^2 k_{3}.
\end{align}
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
def harmonic_rk(nt, init = 10):
dt = t_range / (nt - 1)
# 初期条件設定
x = np.zeros(nt)
v = np.zeros(nt)
x[0] = init[0]
v[0] = init[1]
def fx(t, x, v):
return v
def fv(t, x, v):
return - (omega ** 2) * x
# ベクトル計算で書き直したい
for i in range(1, nt):
xk1 = fx(dt * (i - 1), x[i-1], v[i-1])
vk1 = fv(dt * (i - 1), x[i-1], v[i-1])
xk2 = fx(dt * (i - 1/2), x[i-1] + xk1 * dt / 2, v[i-1] + vk1 * dt / 2)
vk2 = fv(dt * (i - 1/2), x[i-1] + xk1 * dt / 2, v[i-1] + vk1 * dt / 2)
xk3 = fx(dt * (i - 1/2), x[i-1] + xk2 * dt / 2, v[i-1] + vk2 * dt / 2)
vk3 = fv(dt * (i - 1/2), x[i-1] + xk2 * dt / 2, v[i-1] + vk2 * dt / 2)
xk4 = fx(dt * (i - 1), x[i-1] + xk3 * dt, v[i-1] + vk3 * dt)
vk4 = fv(dt * (i - 1), x[i-1] + xk3 * dt, v[i-1] + vk3 * dt)
x[i] = x[i-1] + dt / 6 * (xk1 + 2 * xk2 + 2 * xk3 + xk4)
v[i] = v[i-1] + dt / 6 * (vk1 + 2 * vk2 + 2 * vk3 + vk4)
return (x, v)
omega = 2 * np.pi
nt = 101
t_range = 2
init = (5, 0)
harm = harmonic_rk(nt, init)
t = np.linspace(0, 2, nt)
x_exact = init[0] * np.cos(- omega * t)
v_exact = - omega * init[0] * np.sin(omega * t)
plt.subplot(3, 1, 1)
plt.title('x-t graph')
plt.plot(np.linspace(0, 2, nt), harm[0])
plt.plot(t, x_exact)
plt.legend(['x approximation', 'x exact'])
plt.subplot(3, 1, 2)
plt.title('v-t graph')
plt.plot(np.linspace(0, 2, nt), harm[1])
plt.plot(t, v_exact)
plt.legend(['v approximation', 'v exact'])
plt.subplot(3, 1, 3)
plt.title('phase space')
plt.plot(harm[0], harm[1])
# 描画
plt.tight_layout()
plt.show()
#plt.savefig(img_file)
#b64 = base64.encodestring(open(img_file, 'rb').read()).decode('utf-8')
#img_str = "
" % (b64)
#print(img_str)
RESULT
今度の一致具合はなかなかよさそう.
あくまで見た目の感じではあるけれども.
良くなったのは一番下の図, 相空間軌道だ: ちゃんと閉じてくれた.
こちらに PDF があります.
サイトでは見づらい方, コンテンツを手元に置いておきたい方は
ダウンロードしてご覧ください.
前回はベクトルを紹介しました.
ベクトルは始点と終点をつなぐ矢印であり,
その矢印を辿って折れ線を作って曲線を近似するんだ,
そういう視点からの紹介です.
今回は関数です.
そして数列, 漸化式, 微分, 微分方程式とつないでいく予定です.
で, 関数.
とりあえず数と数を適当なルールで結びつける装置のことだと思ってください.
関数のよくある説明は自動販売機ですね.
自動販売機にお金を入れて何かボタンを押すと,
押したボタンに対応した飲み物が出てきます.
この対応がまさに関数です1.
ここで数学として大事なのは押したボタンに応じていつでも同じ飲み物が出てくることです.
同じボタンを押したのに違う飲み物が出てこられたらルール壊れてますからね.
数学で具体例を出すなら $f(x) = x^2$.
$x$ を入れたら必ず $x^2$ を出してくれる機械を関数と呼んでいるわけです.
この関数を支配するルールはもちろん $x$ を $x^2$ に変換することです.
このルールは本当は何でもいいです.
この講座で大事なのはルールが微分方程式で決まる場合です.
かといっていきなり微分にかっとぶのも大変なのでもうちょっとクッションを入れます.
あなたは関数は実数に対して実数をあてるルールと思っているかもしれません.
実際にはもっとゆるくて何かと何かを適当に割り当てるルールくらいに思っておいてください.
例えば自然数2に対して実数を割り当てる関数だってあります.
これはふつう数列と呼ばれています.
つまり数列も関数なんですね.
あなたが数列を勉強したことがあるなら,
数列は「ある規則にしたがって数を書き並べたもの」みたいな説明を受けなかったでしょうか?
この説明, まさに関数と同じです!
高校だと数列は特にルールっていう感じで出てきます.
等差数列とか等比数列とか階差数列とかもそうだし,
漸化式なんてまさに数列を作っていくルールのことですしね.
最初にシミュレーションでやったことを思い出してもらうと,
プログラムを書いて計算していったのはまさに漸化式です.
あとあなたが大学の数学やその他の学問に興味があるなら次のようなことまで知っておくと楽しいかもしれません:
数列は自然数全体を適当なルールで実数に割り当てる関数でした.
ここで自然数全体じゃなくて $1$ から $n$ までを実数に割り当てる関数を考えてみましょう.
実はこれはベクトルです.
$n$ 次元のベクトルってやつです.
ベクトルは他にいろいろ要件があるのであんまり適当なこと言うのも微妙なんですが.
ちなみに「$3$ より高い次元のベクトルなんてどこに使うの?」みたいなこと,
工学部の大学生が言っているのを聞いたことがあります.
でも実はシミュレーションでこういう高次元のベクトルをバリバリ使っています.
最後のベクトルの話はわからなくても問題ないです.
関数は数と数の対応ルールであること,
数列は特殊な関数であること,
この 2 つを覚えておいてください.
今回は概念の説明だけだったのでちょっと難しかったでしょう.
次回の数列では高校の復習しながら具体的な話もします.
今回の話がわからなくてもあまり気にしないでください.
今回はここまでです.
お疲れ様でした.
今回もアンケートがあります.
改善につなげるためぜひ回答をお願いします.
ではまた次回をお楽しみに!
こちらに PDF があります.
サイトでは見づらい方, コンテンツを手元に置いておきたい方は
ダウンロードしてご覧ください.
ここまでは微分方程式が自然現象のシミュレーションに使えることを紹介し,
実際の微分方程式をいくつか見てきました.
実際のシミュレーションでは本当に微分方程式を厳密に解いているわけじゃなくて,
近似計算をしているんだ,
そしてそれは四則演算なんだというのを大雑把に紹介してきました.
近似といってもけっこうきちんと計算できますよ,
ということを見るためにもとにかくいくつかの実例を紹介することを優先にしてきました.
我慢強いあなたも「もういい加減きちんと数学の紹介して!」
と思ってらっしゃるはずです.
というわけで数学の紹介も簡単にやっていきましょう.
微分方程式なんだからまずは微分じゃないの?
と思う方もいらっしゃるでしょう.
でも今回の話の流れでは微分の話をする前にベクトルをやった方がスムーズなので,
ベクトルからいきます.
高校でベクトルは向きと大きさがある矢印のことと言われます.
それはそれで大事な見方ですが,
ここでは始点と終点がある矢印と思ってみてください.
始点と終点をつないだたくさんのベクトルで作った折れ線を方程式の近似解とみなすのが今回の話のキモだからです.
図のように曲線を適当な間隔でわけましょう.

わけた点に $A_0, A_1, \dots, A_n$ と順に名前をつけていきます.
そして $A_0$ と $A_1$, $A_1$ と $A_2$ というふうに始点と終点を入れかえながら隣の点どうしを結んでいきます.
$A_0$ から $A_1$ に向かって進むんだ,
という気持ちを表したいのでそれを $\overrightarrow{A_0 A_1}$ と書くことにします.
記号の上の右向き矢印で点 $A_0$ から点 $A_1$ に向かっている気分もはっきり書いています.
ここで何度も始点と終点をつないだ矢印を継ぎ足しています.
この継ぎ足しという図形の操作がベクトルの足し算です.
例を 1 つだけ書いておくと $\overrightarrow{A_0 A_1} + \overrightarrow{A_1 A_2} = \overrightarrow{A_0 A_2}$ です.
高校だとベクトルに関してもっといろいろなことが出てきます.
定数倍したり内積を取ったり長さを調べたりなどなど.
もちろんベクトルを使っていろいろやるならやっておかないと困ります.
でも微分方程式から数学を眺めてみる立場ではまずここさえ乗り越えればどうにかなります.
他のことは他のことをやるときに絡めてやってみてください.
折れ線をつないでいって曲線を近似する様子をもっときちんと見てみましょう.
具体的な曲線としては円を取り,
それを等分して折れ線近似した様子をプログラムで描きました.
次のページを見てください.
最後に近似がよくなっていくアニメーションもつけています.
基本的なプログラムはこの記事の後半にも載せています。
アニメーションは Jupyter との連携でやっているので,
この記事ではうまく動かせません.
上のリンクのページから確認してください.
今回はここまでです.
お疲れ様でした.
今回もアンケートがあります.
改善につなげるためぜひ回答をお願いします.
ではまた次回をお楽しみに!
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
div_num = 9
def draw_circle_by_polygonal_line(div_num):
thetas = np.linspace(0, 2 * np.pi, div_num)
xs = np.cos(thetas)
ys = np.sin(thetas)
plt.plot(xs, ys)
plt.gca().set_aspect('equal', adjustable='box')
円周上の点を $n$ 分割し折れ線で分点をつないでいった.
一旦個別に図示している.
for i in range(4, 12):
pnum = i - 3
plt.subplot(2, 4, pnum)
plt.xlim([-1.2, 1.2])
plt.ylim([-1.2, 1.2])
plt.title("div = " + str(i-1))
draw_circle_by_polygonal_line(i)
draw_circle_by_polygonal_line(1000)
plt.tight_layout()
RESULT
9 分割までを重ねて 1 つの図にしてみた.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
for div_num in range(10):
draw_circle_by_polygonal_line(div_num)
draw_circle_by_polygonal_line(1000)
plt.xlim([-1.2, 1.2])
plt.ylim([-1.2, 1.2])
plt.show()
RESULT
分割を細かくしていくことで精度が上がる様子をアニメーションで見てみよう.
下のプログラムを Jupyter 上で実行すると,
図の両端にある「+」「-」ボタンでアニメーションのスピードを変えられる.
適当に変えて遊んでみよう.
注意
次のプログラムは Jupyter 上で実行することを前提にしている.
他の実行環境で動くかどうかは確認していない.
ここを見ると Jupyter のアニメーションが見られる.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from JSAnimation.IPython_display import display_animation
def circle_data(div_num):
thetas = np.linspace(0, 2 * np.pi, div_num)
xs = np.cos(thetas)
ys = np.sin(thetas)
return (xs, ys)
circles = []
for i in range(4, 31):
circles.append(circle_data(i))
#fig = plt.figure(figsize=(10, 10));
fig = plt.figure();
ax = plt.axes(xlim=(-1.2, 1.2), ylim=(-1.2, 1.2));
line, = ax.plot([],[],lw=2);
plt.gca().set_aspect('equal', adjustable='box')
def animate(data):
x = data[0]
y = data[1]
line.set_data(x, y)
return line
anim = animation.FuncAnimation(fig, animate, frames=circles, interval=100)
display_animation(anim, default_mode='reflect')
こちらに PDF があります.
サイトでは見づらい方, コンテンツを手元に置いておきたい方は
ダウンロードしてご覧ください.
次回からもう少し数学的に詳しく踏み込んでいきます.
その前にここまでの話を簡単にまとめておきましょう.
ここでは微分方程式をそのまま扱うよりも差分で近似してシミュレーションで遊ぶことを目的にしています.
そしてそのシミュレーションための差分計算で中高の数学を総動員するのでした.
いくつか箇条書きでまとめておきましょう.
後で出す微分方程式の厳密解やその解を導く間に三角関数や対数関数も出てきます.
当然これの微分積分も必要です.
シミュレーションの気持ちを知るためにはベクトルが役に立ちますし,
連立 1 次方程式を解くのに行列を知っていると便利です.
微分方程式の厳密解を出すのに複素数が使えると便利な場面も多いし,
実際に大学だとよく使いますね.
電気回路の理論をやると必ず出てきます.
ちなみに理工系で実験やろうと思うと必ずどこかしらに電気回路が出てきますから,
理工系なら複素数使えないとまずいというのも思い知らされます.
複素数と行列は高校の課程に入ったり入らなかったりするので,
あなたが高校生ならなおのことどちらかまたは両方を知らないかもしれません.
この中高数学駆け込み寺でも,
全体像を知ってモチベーションを上げてもらうという目的があるのであまり深入りはしません.
興味がある方のために最後に参考文献も含めて今後の勉強の指針をお伝えします.
それまで少しの間待っていてください.
次回からは数学に関して少しずつ踏み込んでいきます.
メインの微分や微分方程式の前にベクトルからはじめます.
シミュレーションを考えるときにも大事なんです.
今回もアンケートがあります.
ぜひ回答をお願いします.
ではまた次回をお楽しみに!