2020-04-26 課題
はじめに
- コンテンツの案内ページ
- GitHub へのリンク
- 少なくとも英語・フランス語・ドイツ語・ウクライナ語・スペイン語では別行立ての式に句読点がついていました. 式に句読点がついている外国語, 特に英語の文献を探してみてください. 英語については arxiv が探しやすいでしょう. ドイツ語についてはアインシュタインの論文, フランス語では Serre の論文あたりが探しやすいだろうと思います.
- 引き続き TeX でいろいろな式を書いてみましょう. arxiv を彷徨って格好よさそうな式を https://mathpix.com/ で TeX 化してみると楽しいかもしれません.
- 引き続きプログラムをいろいろいじってみましょう. 例えば次のような方針があります. コンテンツからのコピペで構いません. 適切にコピペして動かすだけでも割と大変なので.
- (numpy を使って) いろいろな関数のグラフを描いてみましょう.
- (sympy を使って) いろいろな連立方程式を解いてみましょう.
- いろいろな微分方程式を解いてみましょう. 実際にコンテンツでも紹介しているように, 分点を自分でも変えていじってみるとのが第一歩です.
- (難しいのでやらなくても構いません) 近似について考えてみましょう. もとの関数 $f$ がほとんど 0 であるにも関わらず, 導関数が 0 とはかけ離れた関数を考えてみてください.
- 近似の基準として差の絶対値の最大値, つまり $\max_x |f(x) - g(x)|$ を取ることにします. この量が小さくても, 導関数に対する $\max_x |f'(x) - g'(x)|$ が小さいとは限らない関数を具体例を作ることで示したことにあたります. エネルギーは適当な導関数によって定義されるので, 近似に関する微妙なさじ加減が少し体験できます. (エネルギーは積分が絡むので実はもう少し面倒です.)
- 数値計算と微分方程式の近似解法についてはシンプレクティック積分法などの話題もあります.
$F(x)=0$ という関数があったとする。 これは導関数の $F'(x)$ も $F'(x)=0$ である。
自分用メモ
- 遅延型方程式に対するコメント追加
- 06 の introduction と overview の統合
- 人口論の説明のブラッシュアップ
- import に関する実演:めんどいのでローカルの Jupyter で。
解答例:忘れる前にメモしておく
句読点問題
TeX でいろいろな式を書こう
\begin{align} \int_0^\infty x^{2n} e^{-ax^2} \, dx &= \frac{(2n+1)!!}{2^{n+1}} \sqrt{\pi} a^{- n - 1/2}. \end{align}
\begin{align} \langle f, e^{-tH} g \rangle = \int_{\mathbb{R}^d} \mathbb{E}_W^x \left[ \overline{f(B_0)} g(B_t) e^{- \int_0^t V(B_s) ds} \right] dx. \end{align}
$\mathrm{R}$
いろいろなプログラムを書こう
numpy でのグラフ
| import numpy as np
import math
x = np.linspace(0.01, 2)
print(np.linspace(0.01, 2))
print(np.log(x))
print(np.log(1))
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | [0.01 0.05061224 0.09122449 0.13183673 0.17244898 0.21306122
0.25367347 0.29428571 0.33489796 0.3755102 0.41612245 0.45673469
0.49734694 0.53795918 0.57857143 0.61918367 0.65979592 0.70040816
0.74102041 0.78163265 0.8222449 0.86285714 0.90346939 0.94408163
0.98469388 1.02530612 1.06591837 1.10653061 1.14714286 1.1877551
1.22836735 1.26897959 1.30959184 1.35020408 1.39081633 1.43142857
1.47204082 1.51265306 1.55326531 1.59387755 1.6344898 1.67510204
1.71571429 1.75632653 1.79693878 1.83755102 1.87816327 1.91877551
1.95938776 2. ]
[-4.60517019 -2.98356174 -2.39443189 -2.02619098 -1.75765386 -1.54617572
-1.37170739 -1.22320417 -1.09392939 -0.97946963 -0.87677571 -0.7836526
-0.69846743 -0.61997259 -0.54719327 -0.47935332 -0.41582471 -0.35609202
-0.29972711 -0.2463704 -0.195717 -0.14750614 -0.10151305 -0.05754264
-0.01542447 0.02499122 0.06383674 0.10122955 0.13727438 0.17206506
0.20568593 0.23821311 0.26971551 0.30025575 0.32989086 0.35867295
0.38664975 0.4138651 0.44035936 0.46616976 0.4913307 0.51587408
0.53982949 0.56322443 0.58608454 0.60843372 0.63029431 0.65168723
0.67263205 0.69314718]
0.0
|
1
2
3
4
5
6
7
8
9
10
11
12
13 | import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.01, 2) # x を 0 にできない
y = np.log(x) # 自然対数
plt.plot(x, y)
plt.xlabel("x", size=20)
plt.ylabel("y", size=14)
plt.grid()
plt.show()
|
| import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2) # 0 を含めるとエラー
y = np.log(x) # 自然対数
|
| /usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log
"""
|
sympy での連立方程式
実際に解があるか目で見て確かめる。
| import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2, 2, 100) # x を 0 にできない
y1 = x**2 - 1
y2 = x
plt.plot(x, y1, label="x^2 - 1")
plt.plot(x, y2, label="x")
plt.legend()
plt.show()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | from sympy import *
#from sympy.plotting import plot
from IPython.display import display
def custom_latex_printer(expr, **options):
from IPython.display import Math, HTML
from google.colab.output._publish import javascript
url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_CHTML"
javascript(content="""window.MathJax = {
tex2jax: {
inlineMath: [ ['$','$'] ],
processEscapes: true
}
};""")
javascript(url=url)
return latex(expr, **options)
init_printing(use_latex="mathjax", latex_printer=custom_latex_printer)
x = Symbol('x')
expr1 = x**2 - 1
expr2 = x
sol = solve(expr1 - expr2, x) # 「引き算 = 0」にすれば連立方程式を解いたことになる
display(sol)
|
| <IPython.core.display.Javascript object>
|
$$\left [ \frac{1}{2} + \frac{\sqrt{5}}{2}, \quad - \frac{\sqrt{5}}{2} + \frac{1}{2}\right ]$$
微分方程式
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
34
35
36
37
38
39
40
41
42
43
44
45
46 | import numpy as np
import matplotlib.pyplot as plt
from IPython.display import HTML
from matplotlib import animation
lx = 2 # 計算領域の長さ
nx = 41 # 領域の分割数
xs = np.linspace(0, lx, nx)
def diffusion(nx):
dx = lx / (nx - 1) # 空間方向の刻み
dt = 0.001 # 時間刻み
nt = 200 # 計算回数
nu = 1.0 # 拡散係数
# 初期条件:中央以外すべて 0
u0 = np.zeros(nx)
# 真ん中に物質を置く
x_center = int((nx - 1) / 2)
u0[x_center-2: x_center+2] = 1
# 結果の配列と nt, nx の次元を持つ配列で初期化
us = np.zeros((nt, len(u0)))
# 初期条件を結果の配列の各行にコピー
us[:,:] = u0.copy()
for i in range(0, nt-1):
us[i+1, 1:-1] = us[i, 1:-1] + nu * dt / dx**2 * (us[i, 2:] - 2 * us[i, 1:-1] + us[i, :-2])
return us
us = diffusion(nx)
fig = plt.figure()
ax = plt.axes(xlim=(0, lx), ylim=(0, 1.2));
line, = ax.plot([], [], lw=2)
def animate(u):
line.set_data(xs, u)
return line
anim = animation.FuncAnimation(fig, animate, frames=us, interval=50)
plt.close(anim._fig)
HTML(anim.to_jshtml(default_mode='reflect'))
|
関数の近似
例
十分大きな $n$ に対する次の関数があります。 \begin{align} f(x) &= \frac{1}{n} \sin (e^n x), \ f'(x) &= \frac{e^n}{n} \cos (e^n x). \end{align} グラフを描いてみましょう。
| import numpy as np
import matplotlib.pyplot as plt
n = 10
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(np.exp(n) * x) / n
y2 = np.exp(n) * np.cos(np.exp(n) * x) / n
plt.plot(x, y1, label="$f$")
plt.plot(x, y2, label="$df/dx$")
plt.legend()
plt.show()
|
コメント
これは次のように思ってください。
- 関数 $f_n$ は元の関数 $f_0 = 0$ を(最大値ノルムで)よく近似できている。
- 関数 $f'_n$ は元の関数の導関数 $f'_0 = 0$ をよく近似できていない.
関数の近似はいろいろ難しいところがあって, それだけで論文になるレベルです. 同じ事情はベクトルの近似にもあります. いま流行りの統計学の応用としての自然言語処理でも, 言語の近さを量的にどう判定するかという問題があり, これはまさに言葉をどうベクトルで表現するか, 表したベクトルの近さを何でどう判定するかが問われています. 例えば, よくある「変換候補」遊びは, ある単語を打ち込んだとき, その人の入力の癖という観点から次にどのような語が来るか (どのような語が近いか) を統計的に判定する自然言語処理の事情が絡んでいます. このあたり, 既に「身近」なテーマで, そして身近なことは本当に難しいのでちょっと考えた程度でわかるような話ではありません. 何せ十分な精度で使いやすくかつ役に立ってもらわないといけないので.