ひとり勉強会

ひとり楽しく勉強会

[SICM] 1.4 Computing Actions (承前)

最小作用の軌跡を探す

前回は、

ときに、実際にそのpathを使って計算した作用が極小値になってることを確かめました。今回は

ときに、その間に物体が描くpathを探すお話。具体的には、pathが多項式で表せると仮定して、さまざまな多項式のうち一番作用が極小になるものを見つけ出します。近似です。
例として、調和振動子(harmonic oscillator)を考えます。要はバネがびよんびよんする動きですね。昔の偉い人によると、重りの重さとバネ定数を1.0にしたときのラグランジアンはこうだそうです。
L(t,q,v) = \frac{1}{2}v^2 - \frac{1}{2}q^2
Schemeで書くとこう。

(define (L local)
  (let ((q (coordinate local)) 
        (v (velocity   local)))
    (- (* 1/2 (square v)) (* 1/2 (square q)))))

始点 q(0)=1 終点 q(\pi/2)=0 とすると、このバネの動きは
q(t)=cos(t)
となるのですが、ここでは、そんな結論は知らないものとして、多項式近似させてみます。どうやるかというと、まず、途中で通る点のリストqsをパラメータとして与えると、指定した点全部を通る多項式pathを作ってくれる便利関数を定義しておきます。あとは、このqsを色々動かしてみて、一番作用が小さくなるqsを解として返せばOK。多項式pathを計算する関数は組み込みで用意されてますので、それ(make-path)を使います。

(define (parametric-path qs)
  (make-path 0.0 1.0 :pi/2 0.0 qs))
(define (parametric-path-action qs)
  (Lagrangian-action L (parametric-path qs) 0.0 :pi/2))

関数と初期値を与えると、初期値付近でその極小値を探してくれる関数 multidimensional-minimize が組み込みで用意されてますので、あとは、これを使って qs を色々動かしてもらいます。

(define q
  (parametric-path
     (multidimensional-minimize
        parametric-path-action
        (linear-interpolants 1.0 0.0 3))))

linear-interpolants はたぶん指定された個数の分割点を区間からとっていて、上の例だと、(0.75 0.5 0.25) になります。とりあえず直線的に動くという初期値を与えておいて、そこからqsを調整して最小化していくんだと思う。ものすごい時間がかかりますが、しばらくするとこの最小化が終わって、

guile> (list (q 0.0) (cos 0.0))
(1.0 1.0)
guile> (list (q :pi/6) (cos :pi/6))
(0.865860337498234 0.866025403784439)
guile> (list (q :pi/4) (cos :pi/4))
(0.707094767245861 0.707106781186548)
guile> (list (q :pi/3) (cos :pi/3))
(0.500167078050394 0.5)
guile> (list (q :pi/2) (cos :pi/2))
(0.0 6.12303176911189e-17)

だいたいcosに近い関数が計算されました。

[SICM] 1.5 The Euler-Lagrange Equations

オイラーラグランジュ方程式
action(pathから実数値への関数)が最小になるようなpathが、現実に実現されうるpathなのでした。ところで「f(x)を最小にするようなxは、fの微分が0になるようなxである」のと同じで、pathについても、「action(path)を最小にするようなpathは、actionの微分的なものが0になるようなpathである」はず。これを念頭において、実現されうるpathが満たさなければならない方程式を導出してみようの巻。
といっても、「path」自体が関数なので、普通の微分のように「actionをpathで微分する」のはできない。でも似たようなものとして「変分法」というのがある。

パスの変分

f : path → real、\eta : path とする。f の変分 \delta_\eta f
(\delta_\eta f)(q) = \lim_{\epsilon \rightarrow 0}\frac{f(q+\epsilon\eta)-f(q)}{\epsilon}
と定義する。微分と同じ感じ。

練習問題 1.7

微分と同じで、変分でも以下の性質が成り立つことを示せ。

  • (\delta_\eta(f+g))(q) = (\delta_\eta f)(q) +  (\delta_\eta g)(q)
  • (\delta_\eta cf)(q) = c(\delta_\eta f)(q)

左辺を定義にしたがって分解してから、limが加算,定数倍と可換であることを使って変形して、再度定義にしたがって戻すと右辺になる。

  • (\delta_\eta(fg))(q) = (\delta_\eta f)(q)g(q) +  f(q)(\delta_\eta g)(q)

左辺 =  \lim\frac{(fg)(q+\epsilon\eta)-(fg)(q)}{\epsilon} = \lim\frac{f(q+\epsilon\eta)g(q+\epsilon\eta)-f(q)g(q)}{\epsilon} = \lim\frac{(f(q+\epsilon\eta)-f(q))g(q+\epsilon\eta)+f(q)(g(q+\epsilon\eta)-g(q))}{\epsilon} = 右辺

  • (\delta_\eta(f \circ g))(q) = (Df \circ g)(q) (\delta_\eta g)(q)

左辺 = \lim\frac{f(g(q+\epsilon\eta))-f(g(q))}{\epsilon} = \lim\frac{f(g(q+\epsilon\eta))-f(g(q))}{g(q+\epsilon\eta)-g(q)}(\delta_\eta g)(q) = \lim{\epsilon' \rightarrow 0}\frac{f(g(q)+\epsilon')-f(g(q))}{\epsilon'}(\delta_\eta g)(q) = 右辺。最後の変形あやしすぎるので間違ってる気がする。

作用の変分

作用が最小になるということは、それは変分が 0 になるようなpathであるということで
\delta_\eta S(q)(t_1,t_2) = 0
つまり q はこれを満たさないといけないということになる。S の定義に従ってこれを展開して式変形していく(略)と、ラグランジアンが「時間・位置・速度」までで決まっているような系の場合は
[tex:D*1 - (\partial_1 L \circ \gamma)(q) = 0]
になる。\delta_1 は位置に関する偏微分で、\delta_2 は速度に関する偏微分。これを(オイラー・)ラグランジュ方程式と呼ぶ。

具体例
練習問題 1.9a
練習問題 1.11

1.9をSchemeに計算させてみよう。ラグランジアンはこう。

(define (V q)
   (let ((x ((component 0) q))
         (y ((component 1) q)))
     (+ (* 1/2 (+ (square x) (square y))) (* x x y) (- (* 1/3 (* y y y))))))

(define ((L mass) local)
  (let ((v (velocity   local))
        (q (coordinate local)))
    (- (* 1/2 mass (dot-product v v)) (V q))))

パスは変数で記号的に与えてやって…

(define x (literal-function 'x))
(define y (literal-function 'y))
(define (q t) (up (x t) (y t)))

ラグランジュ方程式は、組み込みの関数が導出してくれます。

guile> (pe (((Lagrange-equations (L 'm)) q) 't))
(down (+ (* m (((expt D 2) x) t))
         (* 2 (y t) (x t))
         (x t))
      (+ (* m (((expt D 2) y) t))
         (* -1.0 (expt (y t) 2))
         (expt (x t) 2)
         (y t)))

ええと、あってるみたいですね。よかった。

*1:\partial_2 L \circ \gamma)(q