忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2007-01-01(Monday)

新年明けましておめでとうございます

MP3とAAC(MP4)の音質

携帯電話を機種変更したらiPodが安く買えるというキャンペーンにつられて、iPodを手に入れた。

これを機会に、CDを取り込むときの形式はどれが一番いいのかというのを少し詳しく知りたくなって、いろいろと調べてみると見つかったのが次のサイト

MP3を使う限りは、LAMEが一番いいらしい。

それじゃあAACに変換したらどうなるのか、と思って試してみた。fatboyをiTunesを使って128kbpsのAACに変換して、オリジナルのファイルと聞き比べてみる。

なんと、上記サイトで言うところの"「シャラ」という感じのノイズ"がまったく聞こえず、オリジナルの音と聞き分けられない。…いや、僕の耳が悪くなってるという可能性も大きいけど。

そんなわけで、手持ちのCDを片っ端からiTunesでAACに変換するのが年始めのイベントになってしまった。

追記

ちなみに、foobarのABXテストのコンポーネントが404で手に入らなかったので、KikeG's ABX softwareを使った。

ロジスティック写像

唐突ですが、ロジスティック写像(Logistic map)というものがあります。

$$f(x)=4x(1-x)$$ で表される写像で、種の個体数の増減に関するモデルだったと思うのですが良く分からないのでその辺の由来は省略。また、式の最初の定数は $a$ などと一般化されているのが本来の形ですが、話を簡単にするためにここでは定数を 4 に固定します。

グラフで書くとこんな感じ。 f(x)=4x(1-x)のグラフ

中学校の数学の問題にも出てきそうな単純な式です。

この式を展開せよ

とか。

$$4x(1-x) = -4x^2+4x$$

これが高校になると

(1)頂点を求めよ
(2)グラフと$x$軸が囲む領域の面積を求めよ

とかになります。

解答はこんな感じで。

\begin{eqnarray}
4x(1-x) &=& -4x^2+4x \\
&=& -4\left(x^2-x\right) \\
&=& -4\left(x-\frac12\right)^2+1
\end{eqnarray}
よって頂点は$(x,y)=(1/2,1)$

元の式から$x$軸との交点は$x=0, 1$なので \begin{eqnarray}
\int_0^1-4x^2+4x\,dx &=& \left[-\frac43x^3+2x^2\right]_0^1\\
&=& -\frac43\cdot1^3+\frac63\cdot1^2 \\
&=&-\frac43+\frac63 \\
&=& \frac23
\end{eqnarray}
よって面積は$2/3$

それでは大学ではどんなことを調べるかというと、例えばこの写像による軌道なんてものを調べます。

Tags: 数学

言い訳

なんでまた急にこんな文章を書き始めたのかというと、MathMLライブラリなんて作っているのに、最近はさっぱり数式を含む文書を書いていないことに気づいてしまったからなのです。

下調べに何日もかかるような濃いネタのほうが見栄えが良いんでしょうが、それだと中々書き始められそうにないので、まったく下調べなしにソラで書けそうなものを思いつくままに書いてみようというわけです。

自分が吸収し終わっている数学的な知識を洗い出すことで何か新しい世界が開けるのかもしれないし、まったく意味のない落書きで終わるかもしれないし、そもそも三日坊主になるかもしれませんが、日記代わりにダラダラと書いてみようという趣旨です。

気が向いたら目を通して、ツッコミでも入れてやってください。 あ、eqnarray環境の配置設定が{ccc}なのはマズそうだというのは把握済みです。


2007-01-02(Tuesday)

ロジスティック写像 (2)

ロジスティック写像 $f(x)=4x(1-x)$軌道とは、適当な値を初期値として選んで、繰り返し写像を適用することで得られる数列のことです。

例えば初期値として $x_0=1/2$ を選ぶと、次の値は \begin{eqnarray}
x_1 &=& f(x_0)\\
&=& 4\cdot\frac12(1-\frac12)\\
&=&2\cdot\frac12\\
&=& 1
\end{eqnarray}
となって、更に次の値は \begin{eqnarray}
x_2 &=& f(x_1) \\
&=& 4\cdot1(1-1)\\
&=& 4\cdot0\\
&=& 0
\end{eqnarray}
となって、更に次の値は \begin{eqnarray}
x_3 &=& f(x_2)\\
&=&f(0)\\
&=&4\cdot0(1-0)\\
&=&0
\end{eqnarray}
となって、更に次の値は…と繰り返していきます。

この結果をまとめて書くと、初期値$x_0=1/2$から始まる軌道は $$\left\{\frac12, 1, 0, 0, 0, \dots\right\}$$ となります。

初期値として負の値、例えば$x_0=-1$をとると、軌道は $$\{-1, -8, -288, -332928, -443365544448, \dots\}$$ となって、$-\infty$に発散してしまいます。

また、初期値として1より大きな値、例えば$x_0=1.5$をとると、軌道は $$\left\{1.5, -3, -48, -9408, -354079488, \dots\right\}$$ となり、$x_1$が負の値となってそのまま$-\infty$に発散してしまいます。

そこで、ロジスティック写像の軌道を考えるときには、区間$[0, 1]$の範囲で考えることになります。

先ほどの初期値 $x_0=1/2=0.5$ の場合は、最終的に 0 にハマってしまいましたが、これを少しずらして例えば$x_0=0.6$にすると $${0.6, 0.96, 0.1536, \dots}$$ という軌道が得られます。見やすいように縦に並べると、

$x_{0}$ 0.6
$x_{1}$ 0.96
$x_{2}$ 0.1536
$x_{3}$ 0.52002816
$x_{4}$ 0.998395491228058
$x_{5}$ 0.00640773729417265
$x_{6}$ 0.0254667127877661
$x_{7}$ 0.0992726373102061
$x_{8}$ 0.357670323166729
$x_{9}$ 0.918969052370147
$x_{10}$ 0.297859732624244
$x_{11}$ 0.836557249221031
$x_{12}$ 0.54691687198709
$x_{13}$ 0.991195228491788
$x_{14}$ 0.0349089900276012
$x_{15}$ 0.134761409771416
$x_{16}$ 0.466403088831347
$x_{17}$ 0.995484990239702
$x_{18}$ 0.0179784977886481
$x_{19}$ 0.0706210856236468
$x_{20}$ 0.262534991555938

となります。

これの何が面白いのか、というのはまた明日。

Tags: 数学

2007-01-03(Wednesday)

ロジスティック写像 (3)

昨日、初期値が0.6である軌道を計算しました。

$x_{0}$ 0.6
$x_{1}$ 0.96
$x_{2}$ 0.1536
$x_{3}$ 0.52002816
$x_{4}$ 0.998395491228058
$x_{5}$ 0.00640773729417265
$x_{6}$ 0.0254667127877661
$x_{7}$ 0.0992726373102061
$x_{8}$ 0.357670323166729
$x_{9}$ 0.918969052370147
$x_{10}$ 0.297859732624244
$x_{11}$ 0.836557249221031
$x_{12}$ 0.54691687198709
$x_{13}$ 0.991195228491788
$x_{14}$ 0.0349089900276012
$x_{15}$ 0.134761409771416
$x_{16}$ 0.466403088831347
$x_{17}$ 0.995484990239702
$x_{18}$ 0.0179784977886481
$x_{19}$ 0.0706210856236468
$x_{20}$ 0.262534991555938

今日は、そこからちょっっっっっとだけずらして、初期値を0.60000001として軌道を計算してみます。

$x_{0}$ 0.60000001
$x_{1}$ 0.959999992
$x_{2}$ 0.153600029440002
$x_{3}$ 0.520028241584129
$x_{4}$ 0.998395478156191
$x_{5}$ 0.00640778941384649
$x_{6}$ 0.0254669185946971
$x_{7}$ 0.0992734186079528
$x_{8}$ 0.357672827863372
$x_{9}$ 0.918971904286363
$x_{10}$ 0.297850173674636
$x_{11}$ 0.8365417908665
$x_{12}$ 0.546958492001475
$x_{13}$ 0.99117960011579
$x_{14}$ 0.0349704017203719
$x_{15}$ 0.134989890895551
$x_{16}$ 0.467070481006232
$x_{17}$ 0.995662587115356
$x_{18}$ 0.017274398936447
$x_{19}$ 0.0679039763113259
$x_{20}$ 0.253172105249747

並べてみると

$x_{0}$ 0.6 0.60000001
$x_{1}$ 0.96 0.959999992
$x_{2}$ 0.1536 0.153600029440002
$x_{3}$ 0.52002816 0.520028241584129
$x_{4}$ 0.998395491228058 0.998395478156191
$x_{5}$ 0.00640773729417265 0.00640778941384649
$x_{6}$ 0.0254667127877661 0.0254669185946971
$x_{7}$ 0.0992726373102061 0.0992734186079528
$x_{8}$ 0.357670323166729 0.357672827863372
$x_{9}$ 0.918969052370147 0.918971904286363
$x_{10}$ 0.297859732624244 0.297850173674636
$x_{11}$ 0.836557249221031 0.8365417908665
$x_{12}$ 0.54691687198709 0.546958492001475
$x_{13}$ 0.991195228491788 0.99117960011579
$x_{14}$ 0.0349089900276012 0.0349704017203719
$x_{15}$ 0.134761409771416 0.134989890895551
$x_{16}$ 0.466403088831347 0.467070481006232
$x_{17}$ 0.995484990239702 0.995662587115356
$x_{18}$ 0.0179784977886481 0.017274398936447
$x_{19}$ 0.0706210856236468 0.0679039763113259
$x_{20}$ 0.262534991555938 0.253172105249747

ほとんど変わりません。

そこで、回数を5倍にして100回までの軌道を見てみます。

$x_{90}$ 0.890055568167096 0.755061509089518
$x_{91}$ 0.391426614967375 0.73977450632391
$x_{92}$ 0.95284728025023 0.7700327444685
$x_{93}$ 0.17971736307988 0.708329267659238
$x_{94}$ 0.589676129949978 0.826395664946262
$x_{95}$ 0.967832766868779 0.57386347961715
$x_{96}$ 0.124530008975611 0.978176745515387
$x_{97}$ 0.436089143360582 0.0853880001932499
$x_{98}$ 0.983661609614463 0.31238755846499
$x_{99}$ 0.0642857895405875 0.85920628712509
$x_{100}$ 0.240612507214923 0.483883373159231

がらっと変わっています。特に$x_{98}$から$x_{99}$への変化は、初期値が0.6の方は増えている変化なのに対して、初期値が0.60000001の方は減る変化になっています。

なんでこんな違いが出るかというのは、また明日(日を追うごとに話が短くなってるような…)。

Tags: 数学

2007-01-04(Thursday)

フライトプラン

DVDをレンタルしてきて見た。以前、映画館で別の映画を見たとき、この予告編が上映されていてそのうち見てみようと思っていたのだ。

状況は面白いんだけど、後半で明かされる犯人の動機がなんとういかこう、ショボくてがっかり。映画館に見に行かなくて良かった。DVDで見る分にはまぁまぁかな。ハッピーエンドだったし。

Tags: 映画

デイ・アフター・トゥモロー

一緒に借りてきた映画。実は以前にも借りて見たのだけど、えらく気に入ってしまい、いずれもう一度見たいと思っていたもの。

やっぱり面白かった。お父さんががんばって雪道を歩いていくとかその辺の話はまあ平凡なんだけど、都市が一気に凍りついていく描写がとても迫力があり、またそうなる過程も(きっと結構なウソ・ハッタリが入っているのだろうけど)見ている瞬間には「ほほー」と思わせる説得力があって気に入っている。

最初に見たときはなんで狼が凍りついたニューヨークにいるのか良く分からなかったのだけど、あれは動物園から逃げ出してきたものだったと判明。それが分かっただけでも、再び借りてきた甲斐があった。

Tags: 映画

ロジスティック写像

写像のある軌道と、それの初期値に十分近い別の初期値から始まった軌道とが、少しずつ近づくのか、それとも離れていくのかという性質は、微分を調べることで分かる。

具体的には、写像$f(x)$のある点 $c$ での微分係数を求めたとき、その絶対値 $|f'(c)|$ が1より大きいか小さいかで、その点が写像されたときに近くの点が近づいてくるか離れていくか(相対的に、近くの点に近づくか近くの点から離れるか、とも言えます)が決まる。1より大きければ近くの点から離れ、1より小さければ近づく。

例えばロジスティック写像 $f(x)=4x(1-x) = -4x^2+4x$ を微分すると$$f'(x) = -8x+4$$であり、一昨日から使っている初期値 $x_0=0.6$ に対しては$$f'(0.6) = -0.8$$なので、十分近い点、例えば$x_0=0.60000001$は写像されたときに近づいてくる。

・・・・はい、これでは100回反復して計算した軌道が全然別物になってしまった理由を説明できません。正しくは、「点の微分係数」ではなく「軌道に対する微分係数」とでも言うべきものを計算する必要があります。

Tags: 数学

2007-01-05(Friday)

フォーガットン

これも映画館で予告編を見て気になっていた映画。

サスペンスか何かだと思ってみていたらX-Fileだった。結構面白かった。

Tags: 映画

写像の軌道と微分

写像$$f(x)=2x$$のある2つの軌道が、写像の反復のたびにどれくらい離れるかを考えてみる。

例えば、初期値として0.5と1.0を取って、反復させてみると

初期値0.5初期値1.0その差
$x_0$0.51.00.5
$x_1$1.02.01.0
$x_2$2.04.02.0
$x_3$4.08.04.0

こんな感じで、1回の反復ごとに軌道の各点の値が2倍されるとともに、2つの軌道の差も2倍になっている。

これは、写像の関数$f(x)=2x$のグラフの傾きに依存した値で、例えば次の図から、1回の反復ごとに差が2倍になることが分かる。

写像で写す2つの点は、写す前は2点間の距離が0.5だったものが、写した後は2点間の距離が1.0と2倍になっている。

逆に、傾きが1より小さい関数$$g(x)=\frac12x$$を写像として軌道を計算すると、例えば次のようになる。

初期値1.0初期値2.0その差
$x_0$1.02.01.0
$x_1$0.51.00.5
$x_2$0.250.50.25
$x_3$0.1250.250.125

こっちは軌道の各点の値が反復のたびに1/2になるとともに、2つの軌道の差も1/2倍になっている。 これも、関数$g(x)=\frac12x$のグラフの傾きに依存した値だ。

グラフの傾きが$\frac12$なので、写す前は2点間の距離が1.0だったものが、写した後は0.5と$\frac12$倍されている。

$f(x)=2x$$g(x)=\frac12x$は傾きが常に一定だけどロジスティック写像の場合は2次関数なので、傾きの代わりに微分を使って、微分の絶対値が1より大きいか小さいかで、ある軌道がその初期値のすぐそばの点を初期値とする別の軌道から離れるか、それとも近づくかを判定する。

ただし、写像を反復して点を移すたびに、その点の微分係数は異なるので、もう一工夫する必要が出てくる。

Tags: 数学

2007-01-06(Saturday)

軌道の近づきまたは離れ具合

写像の反復によって求められる軌道に対して、そのすぐ近くの軌道がどれくらいの割合で近づいたり離れたりするかというお話。

初期値$x_0=0.6$から始めて写像を反復して軌道を求め、各点での微分係数も調べると

軌道 微分係数
$x_{0}$ 0.6 -0.8
$x_{1}$ 0.96 -3.68
$x_{2}$ 0.1536 2.7712
$x_{3}$ 0.52002816 -0.160225280000002
$x_{4}$ 0.998395491228058 -3.98716392982446
$x_{5}$ 0.00640773729417265 3.94873810164662
$x_{6}$ 0.0254667127877661 3.79626629769787
$x_{7}$ 0.0992726373102061 3.20581890151835
$x_{8}$ 0.357670323166729 1.13863741466616
$x_{9}$ 0.918969052370147 -3.35175241896118
$x_{10}$ 0.297859732624244 1.61712213900605

となる。

それぞれの点での微分係数は、絶対値が1より大きい場合もあるし、小さい場合もある。これらの微分係数は、その点が写像によって写される時にすぐ近くの点が近づくか離れるかを表すものだと考えることが出来る。それぞれの点では、写ったときに近くの点が近づいてくる場合もあるし、離れる場合もあるというわけ。

ではそれらを総合して軌道全体では近くの軌道が近づいてくるか離れていくかを調べるためにはどうしたら良いか?

それには軌道の各点$x_i$がその前の点$x_{i-1}$から写像によって1回写した点であるという事を、初期値$x_0$から写像の$i$回の反復によって写ってきた点として捉えなおすと良いらしい。つまり、 $$x_i = f(x_{i-1})$$ではなく $$x_i = f(f(f(\dots f(x_0)\dots)))$$として考える。

もうちょっと具体的に書くと、例えば$x_2=f(x_1)$としてではなく、$x_2=f(f(x_0))$と考えるということだ。記述を簡単にするために合成関数の記法を使って \begin{eqnarray}
x_2 &=& f\circ f(x_0)\\
&=& f^2(x_0)
\end{eqnarray}
とか \begin{eqnarray}
x_i &=& f\circ f\circ\dots\circ f(x_0)\\
&=& f^i(x_0)
\end{eqnarray}
と書く。

そして軌道全体の近づき・離れの指標として、合成関数の微分を使うというわけだ。

Tags: 数学

rcが〜

デカイ。\bigcircと同じ大きさになってる(この日記を書いている時点の話)。後で直さないと

Tags: MathML

2007-01-07(Sunday)

ハック初め

新年早々ツッコミスパムが書き込まれてしまってメラメラと闘志がわいたので、NGワードを設定して引っかかったコメントを全部スパム扱いにするようにしてしまった(ツッコミスパムフィルタ自体は公式のものを前から使っていたので、それをいじった)。

しかしもしかしたら、まっとうなツッコミがたまたまNGワードを含むことがあるかも知れない。

そこで、ツッコミスパムフィルタに引っかかった場合は、ツッコミとしては受け付けないがメールで通知してくるようにしてみた。ここまでが昨日の作業。 そしたらまあ、来るわ来るわ。半日で40くらいの通知メールが届いた。

ここでふと思いついた。もしかして、ツッコミの書き込みに対してはたとえスパムであっても200 OKを返すから、フィルタで弾いていてもしつこく届いてしまうのではないか、と。そこで、ツッコミフィルタに引っかかったコメントが書き込まれた場合には、404 Not Foundを返すようにしてみた。

処理の記述が今一な感じがするのでパッチの提出はまだなんですが、この日記のツッコミを書くときにお名前欄を nGworD とするとスパム扱いになります。良かったら試してみてください。

Tags: tDiary

あっ

本体をまだ最新版にアップデートしてなかった。とほほほほ

Tags: tDiary

アップデート完了。もう一回ツッコミのテストをしておかないと

Tags: tDiary

合成関数の微分

$x_1=f(x_0),\,x_2=f(x_1)=f(x_0)$としたとき、この写像を2回反復したときの軌道全体の微分係数のようなものを求めるために、合成関数の微分を使う。もちろん、3回の反復、4回の反復と繰り返した場合にも使えるし、収束することを確かめられれば無限回の反復の場合にも使える。

具体的には$y=y(x)=f(x)$とおき、 $$\frac{df^2(x)}{dx} = \frac{df(y)}{dx}=\frac{df(y)}{dy}\cdot\frac{dy}{dx} = \frac{df(y)}{dy}\cdot\frac{df(x)}{dx}$$ と変形できるので、$y_0=f(x_0)$とおくと $$ \frac{df^2(x_0)}{dx}= \frac{df(y_0)}{dy}\cdot\frac{df(x_0)}{dx} = f'(x_1)\cdot f'(x_0)$$ によって2階の反復によって計算した軌道(今更だが、これを長さ2の軌道と呼ぶことにする)に対する微分係数を求めることが出来る。

同様に、長さ3の軌道$\{x_0,x_1,x_2,x_3\}$の微分係数は$f'(x_2)\cdot f'(x_1)\cdot f'(x_0)$によって求まり、長さ$n$の軌道$\{x_i\}_{i=0}^n$の微分係数は $$f'(x_{n-1})\cdot f'(x_{n-2})\cdot\cdots\cdot f'(x_1)\cdot f'(x_0)$$ によって求めることが出来る。

$f(x_{i})$ 微分係数 $f^{i+1}(x_0)$
$x_0$ 0.6 0.8
$x_1$ 0.96 2.944
$x_2$ 0.1536 8.15841279999999
$x_3$ 0.52002816 1.3071839752356
$x_4$ 0.998395491228058 5.21195679570394
$x_5$ 0.00640773729417265 20.5806523833322
$x_6$ 0.0254667127877661 78.1296370274793
$x_7$ 0.0992726373102061 250.469467151461
$x_8$ 0.357670323166729 285.193906530152
$x_9$ 0.918969052370147 955.899366085424
$x_{10}$ 0.297859732624244 1545.80602755859
$x_{98}$ 0.983661609614463 3.17316791063619e+29
$x_{99}$ 0.0642857895405875 1.10607548067039e+30
$x_{100}$ 0.240612507214923 2.29521716609714e+30
$x_{998}$ 0.15441234669329 5.46258974907675e+300
$x_{999}$ 0.522276695527846 9.73507589069716e+299
$x_{1000}$ 0.998014995345439 3.87857101951443e+300
$x_{1021}$ 0.365604046456533 2.37509962607922e+307
$x_{1022}$ 0.927750910684569 8.12760822417573e+307
$x_{1023}$ 0.268116633634088 1.50772572442011e+308
$x_{1024}$ 0.78492041761125 Infinity

手元の環境では、1024回の反復でオーバーフローを起こしてしまうが、$\infty$に発散すると予想される。

一方、例えば写像$f(x)=0.5x$の場合は0に収束し、また例えば$f(x)=-2$などの場合は$-\infty$に発散する。

つまり、このままのやり方では、たいていの場合で$\pm\infty$への発散か0への収束かの2択になってしまう。また、$f(x)=1.1x$$f(x)=2$のどちらも、軌道の微分係数が同じ$\infty$への発散になってしまう。出来れば、もう少し細かい値がほしい。例えば、$f(x)=1.1x$の時には1.1となり、$f(x)=2x$の時には2になるような。また、合成関数の微分をそのまま使うと比較的早い段階でオーバーフローを起こしやすいので、これもどうにかしたい。

といった経緯で編み出されたのがLyapunov指数なのでしょう。多分。詳しくはまた明日。

Tags: 数学

2007-01-08(Monday)

リャプノフ数

写像$f(x)$による初期値$x_0$から始まる軌道$\{x_i\}$が、$x_0$の近くの別の初期値から始まる軌道に近づくか離れるかを判定するために、軌道の微分係数(のようなもの)ではちょっと不十分という話の続き。

まず、$f(x)=2x$の場合と$f(x)=1.1x$の場合とで、どちらも$\infty$に発散してしまうのを避ける方法から。単に$f^n(x_0)$の微分ではなく、軌道の長さ(反復の回数)に対する平均値として、 \[
\sqrt[n]{\left|\frac{df^n(x_0)}{dx}\right|} = \sqrt[n]{|f'(x_{n-1})|\cdot\cdots\cdot |f'(x_1)|\cdot |f'(x_0)|}
\]
を使う。$n$乗根を取りたいので、各微分係数の絶対値を使うようにする。これで、$f(x)=2x$の場合には2、$f(x)=1.1x$の場合には1.1となる。絶対値を使っているので、$f(x)=-2x$の場合も2になる。傾きが常に一定なので初期値は何でも良い。また、反復回数による平均なので、回数が2回でも100回でも(収束するなら)\infty回でも構わない。

これがリャプノフ数。軌道のリャプノフ数を求めてみて、それが1より大きければその軌道は初期値が近い別の軌道と互いに離れ合い、1より小さければ近づき合う。

ついでに。ある軌道について

  • リャプノフ数が1より大きくて
  • その軌道の各点が一定の有限な範囲に収まる

という条件が満たされるとき、その軌道をカオス的軌道と呼ぶ…んだったと思うけど、ソラで書いてるのでちょっと自信がない。リャプノフ数に関する条件はこの通り。ただしリャプノフ数を使わないカオスの定義もあるらしいので、その辺はちょっと要注意。

Tags: 数学

2007-01-09(Tuesday)

(体調を崩してしまって、本当は1/10の夕方に書いてます)

リャプノフ指数

「リアプノフ」とか「リヤプノフ」と書く場合もあるらしいけど、僕は最初に覚えた「リャプノフ」と書いてしまう。「Linusが発音する"Linux"」みたいに「Lyapunovが発音する"Lyapunov exponent"」みたいな音声ってどこかに無いもんだろうか?

それはさておき、リャプノフ数のお話。

$$ \sqrt[n]{|f'(x_{n-1})|\cdot\cdots\cdot |f'(x_1)|\cdot |f'(x_0)|} $$ によってある軌道が初期値が近い別の軌道と離れあう(反発的という)か近づきあう(吸引的という)かを判定できるが、これをこのままコンピュータで計算しようとすると、例えばロジスティック写像の場合は200回の反復を待たずに\inftyに発散してしまう。

そこで、対数を取って \begin{eqnarray}
e^L &=& \sqrt[n]{|f'(x_{n-1})|\cdot\cdots\cdot |f'(x_1)|\cdot |f'(x_0)|} \\
L &=& \log\left(\sqrt[n]{|f'(x_{n-1})|\cdot\cdots\cdot |f'(x_1)|\cdot |f'(x_0)|}\right) \\
&=& \log\left(\left(|f'(x_{n-1})|\cdot\cdots\cdot |f'(x_1)|\cdot |f'(x_0)|\right)^{\frac1n}\right)\\
&=& \frac1n\log\left(|f'(x_{n-1})|\cdot\cdots\cdot |f'(x_1)|\cdot |f'(x_0)|\right)\\
&=& \frac{\log|f'(x_{n-1})|+\cdots+\log|f'(x_1)|+\log|f'(x_0)|}n
\end{eqnarray}
という式で求まる指数$L$を使うことにする。この指数$L$リャプノフ(Lyapunov)指数。軌道に対してこの値を求めたとき、今度は指数なので1より大きければ反発的、1より小さければ吸引的というわけ。

これを使えば100回200回どころか100回でも1万回でも好きなだけ反復して計算することが出来る。ばんざ〜い

Tags: 数学

2007-01-10(Wednesday)

2005年5月17日

なぜか知らないが、この日付の日記宛にやたらとコメントスパムが届く。他の日にも届くことが多いが、この日付は特別に多い。なんなんだろう

非公式から開発版

個人ページで公式も非公式も無いよな、とか考えたら妙にこっ恥ずかしく思えてきたので、カテゴリーを開発版に変えてしまった。RSSフィードに古い記事が出てきてしまったのはそのせいです

MathML::String StringクラスのMathMLライブラリによる拡張

タイトルは長いけど早い話がコレ↓

#!/usr/bin/env ruby
require "math_ml/string"
puts "x".to_mathml  # => "<math display='inline' xmlns='http://www.w3.org/1998/Math/MathML'><mi>x</mi></math>"

MathML::String.mathml_latex_parser.macro.parse('\newcommand{\test}{x}')
puts '\test'.to_mathml   # => "<math display='inline' xmlns='http://www.w3.org/1998/Math/MathML'><mi>x</mi></math>"

京都のCA-ALIAS'06での発表で、質疑応答の時間に座長の長坂先生から貰ったアイデアを実装してみたもの。

ちょろっとMathMLが欲しいときにirbから使ったりすると結構便利だ。例えば

~/tmp$ irb
irb(main):001:0> require "math_ml/string"
=> true
irb(main):002:0> puts "x+y".to_mathml
<math display='inline' xmlns='http://www.w3.org/1998/Math/MathML'>
 <mi>x</mi>
 <mo>+</mo>
 <mi>y</mi>
</math>
=> nil

てな感じ。

Tags: 開発版

2007-01-24(Wednesday)

ローカルサーバのApacheのドキュメントが読めない件について

Debianでは apache2-doc パッケージをインストールすることで http://httpd.apache.org/docs/2.0/ja/ のようなマニュアルをブラウザで読むことが出来る。

ところが、たまに

URI: index.html.de Content-Language: de Content-type: text/html; charset=ISO-8859-1 URI: index.html.en Content-Language: en Content-type: text/html; charset=ISO-8859-1 URI: index.html.es Content-Language: es Content-type: text/html; charset=ISO-8859-1 URI: index.html.fr Content-Language: fr Content-type: text/html; charset=ISO-8859-1 URI: index.html.ja.euc-jp Content-Language: ja Content-type: text/html; charset=EUC-JP URI: index.html.ko.euc-kr Content-Language: ko Content-type: text/html; charset=EUC-KR URI: index.html.ru.koi8-r Content-Language: ru Content-type: text/html; charset=KOI8-R

と表示されて読めなくなることがあり、また、何かの弾みで直ったりすることがあって、とても気持ち悪かった。

これが先日、原因を特定できたのでメモ。

まずは、上に挙げた変なページを表示する再現から。以下の手順で再現される。

  1. apache2 パッケージを使ってWebサーバをインストールし、適当に設定して起動
  2. apache2 が動作している状態で apache2-doc をインストール
  3. インストールしたサーバの http://www/doc/apache2-doc/manual にアクセスすると、件の変なページが表示されてしまう。

原因は、このマニュアルが多くの言語の版を持っていてクライアントの言語設定に応じて切り替える機能を使っていることにある。具体的には、apache2-doc パッケージをインストールすると /etc/apache2/conf.d/apache2-doc ディレクトリが作られて、その中で多言語の設定がされている。この設定ファイルは、apache2 を再起動しないと読み込まれない。

ので、解決方法も簡単。apache2 を再起動すれば良い。Debianなら

# /etc/init.d/apache2 restart

こうした後で、http://www/doc/apache2-doc/ にアクセスすると、このディレクトリに置かれているファイル・ディレクトリの一覧が表示されて、その中から manual ディレクトリが消えている。

これは、/etc/apache2/conf.d/apache2-doc で

   Deny from all
   Allow from  127.0.0.0/255.0.0.0 ::1/128

と書かれているから。だから、apache2を動かしているのとは別のマシンからこのマニュアルを読みたい場合は、Allow を適切に書き換えてやれば良い。これで、自分のマシンにインストールされたapacheのマニュアルが読めるようになる。

なお、以上の手順で問題の再現を試した直後にマニュアルを読もうとしても、相変わらず "URI: index.html.de ....." のページが表示される場合がある(というか今、表示されてしまった)。これは、ブラウザのキャッシュに前の内容が残っているのが原因。FirefoxならCtrl+F5でキャッシュを無視したりロードが出来るのでこれで解決できる。

Xmodmap で BackSpace に文字キーを割り当てると、シフトが効かなくなる件。

例えば、親指シフト風の配列に変更したくてbackSpaceキーに"]/}"キーを割り当てるすると、ホームディレクトリの .Xmodmap に

keycode 22 = bracketright braceright

と書くことになる。ところが、この設定を有効にして BackSpace キーを押すと"]"が入力されるが、シフトキーを押しながらBackSpaceを押しても"}"は入力されない。

なんで〜?と思って調べてみると、どうも Ctrl+Alt+BackSpace を受け付けるための措置で、BackSpaceは特別扱いされているらしい。

これを解決するためには、設定ファイル /etc/X11/xkb/keycodes/xfree86 を書き換える。ただしこれはDebian Sargeで日本語キーボードを使っている場合。Etchでは別のディレクトリ(確か/usr/lib/X11/xkb だったかな?)に置かれているし、日本語キーボード以外のキーボードを使っている場合は keycodes 以下の別のファイルをいじる必要があるかもしれない。

とにかく、この xfree86 というファイルに以下のような記述がある。

   <BKSP> =  22;

これを、例えばこう書き換える。

   <BKSP> =  47;

ついでに、この場合はキーコード47番との入れ替えを目論んでいるので、下のほうにある

   <AC10> =  47;

   <AC10> =  22;

と書き換える。これで、BackSpaceキーに別のキーを割り当てることが出来て、さらにシフトキーとの同時押しも大丈夫というわけ。

どっとはらいヽ(´ー`)丿

Italic が気に入らない

<em>タグで囲まれた文をブラウザで表示されると、大抵の場合はItalic(斜体)で表示されてしまう。<strong>だとより強い強調ということでBold(太字)で表示される。

この斜体での表示がどうにも気に入らない。とにかく読みづらく感じる。

そんなわけで、この日(?)記では何週間か前から<em>タグを太字にして、<strong>タグを太字+背景色変更としている。

これが<em>タグこっちが<strong>タグ

設定方法は append-css プラグインを使って

em {
  font-weight: bold;
  font-style: normal;
}

strong {
  background-color: yellow;
}

このCSSを追加するだけ。


2007-01-31(Wednesday)

image_ex プラグインで SVG を使う

グラフを描くのに SVG を使っていると、手動でサーバにアップしなければならず、これが面倒になってきたので何とかしようというお話。

とりあえず、image_ex プラグインをいじって、SVGファイルをブラウザからアップロード出来るようにしてみた。サイズを調べてサムネイルを作る機能にも対応。ただし動作させるにあたり、svgをpngに一時的に変換するので、その為に inkscape が必要です(Etchで作ったときはImageMagickのconvertだけでよかったんだけど、Sargeで試したらconvertがsvgの変換に対応していなかった…)。

パッチはここにおいておきます。

gnuplot.rb

GNUPLOT を使ってグラフを描きSVGファイルとして出力すると名前空間の記述が足りなくてそのままでは Firefox で表示できない。

いままでは出力されたファイルを手書きで修正していたのだが、これもまた面倒になってしまった。

自動的に書き換えるスクリプトでも作るべぇかと思い、最近使いはじめたDebian Etchな開発マシンにとりあえずGNUPLOTをインストールしようとしたら、libgnuplot-rubyなる興味深い名前のパッケージを見付けた。 開発元はここで、なんと配列にした実数データをgnuplotに送りつけてグラフを表示したりするものらしい。

こりゃ面白いと早速使ってみたら、グラフをウィンドウに描画させるのは良いが、term に svg を設定して使うとデータが標準出力に出てしまう。gnuplotを実行するときにパイプを使っているが、書き込み専用にしているのが原因らしい。

そこで、読み書き両用のパイプを使うサブルーチンを作ってみた。これで、Ruby側でgnuplotの出力を受け取れる。 また後できちんとした形でアップロードするとして、とりあえずここに貼り付けておきます。

gnuplot_pipe.rb

require "gnuplot"

module Gnuplot
  def self.pipe_plot
    pipe = PipePlot.new
    yield pipe
    pipe.io.close
  end

  class PipePlot
    attr_reader :io
    def initialize
      cmd = Gnuplot.gnuplot( true ) or raise 'gnuplot not found'
      @io = IO::popen( cmd, "r+")
    end

    def plot(plot_class=Plot)
      plot_class.new(@io) do |plot|
        yield plot
      end
      @io.close_write
      @io
    end

    def splot
      plot(SPlot) do |plot|
        yield plot
      end
    end
  end

  def self.svg_header(io, buffersize=512)
    buff = io.read(buffersize)
    buff.sub(/(<svg\s+.*?)>/m){%[#$1 xmlns="http://www.w3.org/2000/svg">]}
  end
end

使用例はこんな感じ

sample.rb

#!/usr/bin/ruby
require "gnuplot_pipe"

def henon(x, y)
  nx = 0.3*y+1.0-1.4*x*x
  ny = x
  return [nx, ny]
end

dx = []
dy = []
x, y = [1.0, 0.5]
(0..500).each do |i|
  dx << x; dy << y
  x, y = henon(x, y)
end

Gnuplot.pipe_plot do |pipe| # pipe には Gnuplot::PipePlot のインスタンスが入っている
  io = pipe.plot do |plot| # PipePlot#plot(と、#splot)は読み込み専用(書き込み側はクローズ済み)のパイプを返す
    plot.term "svg"
    plot.data << Gnuplot::DataSet.new([dx,dy]) do |ds|
      ds.notitle
    end
  end
  puts Gnuplot.svg_header(io) # GNUPLOTの吐くSVGのsvgタグに名前空間を付加するメソッド
  puts io.read # 残りのデータも出力
end

そして早速、svg対応版image_exを使って貼り付けてみたり

エノン写像のアトラクタ

反復回数は500回とちょっと少なめ。 1万回くらいだと綺麗なアトラクタが描けるが、出来たSVG画像をFirefoxで表示しようとすると「ブラクラか!!」ってくらいに重くなってしまう。

え?どんなか見てみたい?しょうがないなぁ(笑)それじゃ、自己責任ということで。どうなっても知りませんよ〜

恐怖の1万回反復

ブラクラ対策

正確には、「ブラクラになってしまうこと」への対策。

他のサイトのWikiとかに上の激重なSVGへのリンクを貼り付けられたら大変なことになりそうなので、 .htaccess をいじってSVGファイルはこの日記からしか飛べないようにしてみた。http://www.hinet.mydns.jp/~hiraku/tDiary/images/20070131_1.svg をURLの直打ちしたり、よそのサイトから飛んできても"403 Forbidden"になるはず。キャッシュも無効にするので一度この日記を通して表示したSVGを別のサイトから踏んでしまう恐れもない(はず)

キャッシュ関係で参考にしたのはここで、出来た.htaccessはこんな感じ。

SetEnvIf Referer "^https?://www\.hinet\.mydns\.jp/~hiraku/tDiary" FROMDIARY
<FilesMatch "svg$">
    Order deny,allow
    Deny from all
    Allow from env=FROMDIARY
    Header add Pragma "no-cache"
    Header set Cache-Control no-cache
</FilesMatch>