忘れないようにメモっとく

機械学習とかプログラミングとか。

Lagrangian coherent structures入門

LCS

物理学 Advent Calendar 2014 - Adventar 6日目です。

Lagrangian coherent structures(ラグランジアンコヒーレント構造。以下, LCS)の話を書きます。

LCSについて、すごく簡単に説明すると、流体中の動的なバリア構造です。例えば、乱流のような複雑な系は、初期値のちょっとした違いでその後の振る舞いが大きく変わってくるので、単純に方程式を眺めていても、一般的な構造を取り出すのは難しいです。 LCSを使って、流体中のバリア(障壁)を定義すると、粒子(流体要素)を複数の領域に分けることができます。各領域内ではやはり複雑な振る舞いをするのですが、その領域がどのように動いていくかを調べることによって、流体の輸送メカニズムを解析することができます。

流出した原油の輸送先を予測したという事例もあります。→ Mathematical methods predicts movement of oil and ash following environmental disasters -- ScienceDaily

さて、LCSはどうやって定義するかというと(いろんな手法があるようですが)、Finite-time Lyapunov exponents(有限時間リアプノフ指数。以下, FTLE)によって定義されることが多いです。

FTLEとは、ある時間に隣接する流体要素がどのくらい離れるのかという分離率を表したものです。これを領域内で計算することによって、FTLEの等高線を描くことができ、尾根(ridge)にあたる領域をLCSとして定義します。そして、時間を前向きに進めた時に計算されたFTLEから定義されるLCSをstable manifolds(安定多様体)、後ろ向きの時をunstable manifoldsといい、この二つの領域で囲まれた領域をlobe(ローブ)といいます。

クラゲの例→ CONTROL and DYNAMICAL SYSTEMS - California Institute of Technology

数式も図も無しで簡単に説明していまいましたが、詳しくは英語版wikipediaやこちらの二重渦の動画を見ればなんとなくわかるんじゃないかと思います。 最初の方に出てくる隣接したカラフルな粒子が、時間が経った後に離れるかどうかでFTLEが計算されます。動画の後半はFTLEの尾根も可視化されています。

Lagrangian Coherent Structures - Double Gyre - YouTube

参考文献

http://math.arizona.edu/~flaschka/Topmatter/527files/termpapers/Kent.pdf

http://web.archive.org/web/20070416222110/http

SageMathCloudを使ってみよう

Python Advent Calendar 2014 - Qiita 3日目の記事です。

タイトルの通り、SageMathCloudを使ってみようという話をします。

SageMathCloudとは?

すごく簡単に説明すると、クラウド(ブラウザ)上で、SageMathやiPython Notebook、LaTeX、Terminalなどが実行できます。

f:id:Akiniwa:20141203214031p:plain

そもそもSageMathってなに?って思うかもしれませんが、SageMathはPythonベースのオープンソースMathematicaみたいな数式処理のソフトウェアです。Mathematicaにはまだまだ適わない部分が多いらしい(使ったことない)ですが、無料というのはありがたいです。 SageMathは例によって環境構築ではまったりすることがあるので、SageMathCloudを利用すれば、いつでもどこでも使えて良い感じです。

SageMathを使ってみる

では、早速SageMathを使ってみます。大体チュートリアルに載ってることなので、詳しくはチュートリアル読んでくださいな。-> A Guided Tour — Sage Tutorial v6.4

  • 変数宣言 (sympyみたいにシンボリックな操作ができます。)
x = var('x')
  • 方程式を解く
solve(x^2 + 3*x + 2, x)
-> [x == -2, x == -1]
diff(sin(x), x)
-> cos(x)
integral(cos(x), x)
-> sin(x)
  • 2次元プロット
x, y=var("x", "y")
contour_plot(-1/(sqrt(3*x**2+5*y**2))-1/(sqrt((2*x+0.4)**2+(y+0.2)**2))-1/(sqrt((2*x-0.2)**2+(2.5*y-0.5)**2)), (x,-1,1), (y,-1,1))

f:id:Akiniwa:20141203212328p:plain

  • 3次元プロット
x, y, z = var('x, y, z')
implicit_plot3d(x^2 + y^2 + z^2 - 1, (x,-1, 1), (y,-1, 1), (z,-1, 1))

f:id:Akiniwa:20141203211020p:plain

ほんとにちょっと触っただけですが、他にも行列演算とか多項式の展開とか色々できます。 わたしは物理シミュレーションをするときに、ポテンシャルを微分したり、等ポテンシャル面を描いたりするのに使います。

sort - Unixコマンド。ヘッダー以外の行でソートする。

(head -n +1 sample.txt && tail -n +2 sample.txt | sort ) > sorted_sample.txt

headとtailを使えば、中間ファイル無しで書ける。以下はサンプルファイルを使った解説。

例えばこんなファイル。sample.txt

id x y
1 1.3 0.6
2 1.1 0.4
3 1.1 0.6
4 1.7 0.4
5 1.5 0.2
6 1.5 0.9

これをx, yでソートしようとするとき、普通はヘッダー以外の部分でソートしたいですよね。 ヘッダーとデータ部分の切り分けをていねいにやるとしたら

head -n +1 sample.txt
>>>
id x y

で、ヘッダー部分を取り出し、

tail -n +2 sample.txt
>>>
1 1.3 0.6
2 1.1 0.4
3 1.1 0.6
4 1.7 0.4
5 1.5 0.2
6 1.5 0.9

で、データ部分を取り出す。 このデータ部分にsortを使う。

sort -k 2n,3n data.txt
>>>
2 1.1 0.4
3 1.1 0.6
1 1.3 0.6
5 1.5 0.2
6 1.5 0.9
4 1.7 0.4

このソートしたファイルと、最初に切り出したヘッダー部分をくっつければおk。

めんどくさいからまとめましょう。

(head -n +1 sample.txt && tail -n +2 sample.txt | sort -k 2n,3n ) > sorted_sample.txt