このサイトは学部では早稲田で物理を, 修士では東大で数学を専攻し, 今も非アカデミックの立場で数学や物理と向き合っている一市民の奮闘の記録です. 運営者情報および運営理念についてはこちらをご覧ください.
理系のための総合語学・リベラルアーツの視点から数学・物理・プログラミング・語学 (特に英語) の情報を発信しています. コンテンツアーカイブに見やすくまとめているのでぜひご覧ください.
こちらに 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')
ベクトルの足し算の所に,誤植があります.
ベクトルA_0A_1+ベクトルA_1A_2=ベクトルA_1A_2 ではなく
ベクトルA_0A_1+ベクトルA_1A_2=ベクトルA_0A_2 であると思います.
いつも学術的なものから,導入的学習的なものまで良質な記事をありがとうございます.
おお、ありがとうございます。
直しておきました。
ベクトルの足し算だけで、微分法手式とつなげてこれだけのことまで行くとは。自分には、プログラムを作成することはできませんが、毎回ついてくるプログラム動画を楽しませてもらっています。よろしく、お願いします。別の所にも書きましたが、歩みは遅くとも相対性理論を表層だけでなく、テンソルや4元ベクトルなども含めて学びたいと思います。よろしくお願いします。