NASAでどのようにJuliaを使っているか
宇宙船の分離のJuliaによるシミュレーション

多分 #Julia言語 ユーザーはNASAでどのようなパッケージを使っているのか気になると思います。動画のスクショを見て下さい。 ImageImageImageImage
#Julia言語 NASAでの宇宙船の分離シミュレーションで使っているパッケージ続き

添付が画像③によればMATLABでやっていた場合よりも15000倍高速化されたらしい。

DifferentialEquations.jl で微分方程式を解いて、Optim.jl で最適化を実行しているらしい。

Pluto.jlを使っていることもわかる。 ImageImageImage
#Julia言語 NASA では Pluto.jl 上で宇宙船の分離のシミュレーションを行っているらしいのですが、スライダーを設置したり、MonteCarloMeasurements.jl で摂動をかけた場合の結果の違いをシミュレーションのコードを変更せずに表示させているようです。 Image
#Julia言語 では、摂動をかけた場合の結果の違いを後で見たくなることに気を使わずに書かれたシミュレーションのコードを一切変更せずに、MonteCarloMeasurements.jl を組み合わせることによって摂動をかけた場合の結果を表示させることができます!

初めて経験したときにはまるで魔法に感じられる。
#Julia言語 Juliaは確かに速いのですが、その点だけを強調するのはひどくミスリーディングで、1つ前に書いたように、自分が書いたコードを変更せずに、他人が書いたパッケージの機能を適用することによって、コードを複雑にすることなく、複雑な仕事を簡単にできてしまう点も強調されるべきです。
#Julia言語 似たようなシンプルな例を Van der Pol 方程式について作って来ました。

NASAでも使っている Pluto.jl のノートブックのソースコードを

gist.github.com/genkuroki/9013…

で公開しておきました。添付画像のようなことをできます。 Image
#Julia言語 ソースコードも添付画像の形式で貼り付けておきます。

添付画像1に微分方程式を数値的に解くためのシンプレクティック・オイラー法のコードがあります。

その部分には、初期条件を摂動したときの効果を計算するためのコードが一切含まれていないことを確認して下さい! ImageImageImage
#Julia言語 実は私は初期条件を摂動したときの結果の違いをプロットするためのコードを何も書いていません。

単に、using MonteCarloMeasurements して、初期条件を

u0 = u00 ± ε

と与えているだけです。± ε の部分を削ると、初期条件を摂動した場合の結果の違いは表示されなくなります。 ImageImageImageImage
#Julia言語 微分方程式を解くコードも自分で書かずに、NASAと同じように DifferentialEquations.jl にまかせようとかと最初思ったのですが、それだと自分で書くコードが「パラメーターを与えて結果を表示するだけ」になってしまうので、シンプレクティック・オイラー法の部分は自分で書きました(笑)
#Julia言語 さらに微分方程式を数式で表示するためのコードも追加したのに、添付画像のようなことをするために自分が書いたコードは60行程度でしかありません。

Van der Pol方程式のリミットサイクルがしっかり見えています。

Pluto notebook のソースコード↓
gist.github.com/genkuroki/9013… Image
#Julia言語 NASAでもJuliaを使っているのだから、以下のリンク先のような仕事でもJuliaを使うと便利なのではないかと思いました。

#Julia言語 上での Van der Pol 方程式の例では使わなかったのですが、DifferentialEquations.jl には多数の優れた数値解法がすでに実装されており、ものすごく沢山の機能を持っており、DifferentialEquations.jl 以外のパッケージとも組み合わせて使えるように書かれています。
#Julia言語 誰か、太陽系内での宇宙船の軌道のシミュレーションを DifferentialEquations.jl でやって見せて欲しいです。

各種定数の取得には

github.com/cadojo/Unitful…

を使えます。
#数楽 添付画像では最大εの大きさで初期条件に摂動がかけられた場合の様子もプロットされているのですが、リミットサイクルに引き込まれて行っているので、初期条件の違いの影響が時間とともに減少している様子も見えます。 Image
#Julia言語 常微分方程式の数値解法にも種類がものすごく沢山あって、精度と計算速度に間にはトレードオフがあります。自分の目的に合わせて適切な数値解法を選択する必要がある。

数値解法を自分の手でハードコーディングしてしまうとそういう試行錯誤をすることが恐ろしく大変になります。
#Julia言語 解法の選択でも試行錯誤したい場合には、DifferentialEquations.jl のような超強力超巨大パッケージを利用した方が得だと思う。

新しめの数値解法を自分で実装して試すことはかなりの手間が必要な大変な作業になりそうです。
#Julia言語 添付画像は私が書いたシンプレクティック・オイラー法のコードです。

このコードのどこにもFloat64のような浮動小数点数の型にあたる情報が何も書かれていないことに注目!

このような書き方でもJuliaは高速に計算してくれます(今回はpush!を使っているので計算速度に気を使っていない)。 Image
#Julia言語 仮に添付画像のように Float64 (倍精度)のような型の指定をしないで済ますのではなく、Float64を指定してしまっていると、さまざまな害が起こります。

* Float32やFloat128では使えなくなる。

* 摂動した結果を表示するためのパッケージと組み合わせて使えなくなる。 Image
#Julia言語

function f(x)

end

と一切型名を書かずに函数を定義していれば、多彩な型の引数で使える函数になるのに、

function f(x::Float64)::Float64

end

のように書いて、損しているのをよく見る。条件を摂動した結果の違いを見るためのコードも自分で書く羽目に陥いる。
#Julia言語

function f(x::Float64)::Float64

end

のようなコードを書いた途端に、NASAの人が

Solves the dependent input parameter problem
(no more "exploding complexity")

と強調しているところの、

no more "exploding complexity"

に至る道が閉ざされてしまうのです。 Image
#Julia言語 上のVan der Pol方程式のPlutoノートブックを使う方法

⓪Juliaの公式バイナリをインストール

julialang.org/downloads/

v1.6.0-rc2またはnightly buildがお勧め。

julialang.org/downloads/nigh…

①juliaを起動して、]と押して

pkg> add Pluto PlutoUI Plots MonteCarloMeasurements Image
#Julia言語

②バックスペースを押して

julia> using Pluto; Pluto.run()

すると、ブラウザにPlutoノートブックのタブが開く。

③以下のリンク先のURLを貼り付ける。

gist.github.com/genkuroki/9013…

④OKボタンを押す。 ImageImageImage
#Julia言語

⑤すると、Plutoノートブックがダウンロードされて実行される!しばらく待つ。

⑥⑦⑧添付画像を参照。

Juliaを使ったことがない人であってもトラブらなければ10分もあればここまでたどり付けると思います! ImageImageImageImage
#Julia言語 3.0 ± 0.1 のような「不定性を持った数」を実装しておき、Plots.jl用のレシピも実装することによって「魔法」が実現されています。

添付画像

① sin(3x)のプロット

② sin((3±0.1)x)のプロット

①と②の違いはパッケージの読み込みと a = 3.0 と a = 3.0 ± 0.1 の違いだけ! ImageImage
#Julia言語

①質点の質量m=1、バネ定数k=3の調和振動子をDifferentialEquations.jlでYoshida6()法を使って数値的に解いている。

②MonteCarloMeasurements.jlを使ってバネ定数を k = 3.0 ± 0.03 とした場合。

この2つのコードの違いはほんの少ししかない❗️

gist.github.com/genkuroki/5230… ImageImage
#Julia言語 このように、微分方程式をシンプレクティック法の1つであるYoshida6()法で数値的に解いて、パラメータを変化させたときの挙動を視覚化することを、空行を除けばたったの9行で実行できている!

こういう便利なものをNASAの宇宙開発で使っているわけです。

gist.github.com/genkuroki/5230… Image
#Julia言語

しかも、パラメータを変化させたときの挙動を視覚化を行うためには、本質的に、3.0に設定していたパラメータの値を 3.0 ± 0.03 に書き換えるだけで良い!

NASAの人もその点を強調しています。

この辺はこのスレッドのトップに貼り付けたYouTubeの動画を見ても認識し難い点だと思った。 Image

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

16 Mar
#Julia言語 Julia言語で10行

nbviewer.jupyter.org/gist/genkuroki…

(1/5) 二項分布モデル内の標本分布で測った95%信頼区間にモデルのパラメーター値が含まれる確率のプロット。95%以上になる。ほとんどのパラメーターで95%より真に大きい。 Image
#Julia言語

nbviewer.jupyter.org/gist/genkuroki…

(2/5) 二項分布モデルの95%信頼区間 [CI_min, CI_max] を平面上の座標 (CI_min, CI_max) にプロット。丸の大きさはモデル内でその信頼区間が生じる確率の大きさに比例。赤の十字の左上側の領域ではパラメータの真の値が信頼区間に含まれている。 Image
#Julia言語

nbviewer.jupyter.org/gist/genkuroki…

(3/5) 3次元のランダムウォーク Image
Read 7 tweets
16 Mar
#Julia言語

using Statistics, StatsBase
f(x) = (mean(x), geomean(x), median(x))
[∘(fill(f, n)...)((1, 1, 2, 3, 5)) for n in 30:35]

6-element Vector{~}:

(2.0890579497368598, 2.0890579497368598, 2.0890579497368598)


gist.github.com/genkuroki/e69a…

xkcd.com/2435/ Image
#Julia言語

∘(fill(f, 4)...)((1, 1, 2, 3, 5))



f∘f∘f∘f(1, 1, 2, 3, 5)

と同じで、∘は函数の合成なので、

f(f(f(f(1, 1, 2, 3, 5))))

と同じ意味になる。

函数fのn個の合成は

∘(fill(f, n)...)

と書ける。Juliaを超高級電卓として使うときにはこれを知っているとちょっと便利。
#Julia言語 による解答例のスクショ

もとの問題文の数学的内容がほとんどそのままJuliaのコードに翻訳されていることがわかる。

難しいのはn個の函数fの合成が ∘(fill(f, n)...) と書けること。

φ(fill(f, 3)...)はφ(f, f, f) と同じ意味に、∘(f, g, h)(x,y)はf(g(h(x,y)))と同じ意味になる。 Image
Read 6 tweets
16 Mar
NASAでは普通に #Julia言語 を使っているようですが、日本ではどうなっているんですかね?

Juliaの良い点をNASAがどのように活かしているか分かる動画


Modeling Spacecraft Separation Dynamics in Julia
Jonathan Diegelman
#Julia言語 あらためてNASA JuliaLangでググったら、こんな素敵な動画も見つかりました。


The Julia Language 1.0 Ephemeris and Physical Constants Reader for Solar System Bodies

github.com/JuliaAstro/JPL…
#Julia言語 NASA関連

Pluto.jl
DifferentialEquations.jl
Optim.jl
GlobalSensitivity.jl
MonteCarloMeaurements.jl
ComponentArrays.jl
Unitful.jl

などを使っているみたい。
Read 15 tweets
15 Mar
#数楽 ランダムウォークの話なので、ランダムウォークの数え上げの図をシンプルに描けば簡単です。

(1)は二項係数の問題。

(2)はCを通らない経路を数えて二項係数から引けばよい。

続く Image
#数楽 「Cにいる状態から出発して云々」という発想で最後までやり切るのは苦しいです。

Cを通る経路の個数を数え上げた青の数字をじっと眺めれば色々複雑なことになっていることが分かります。

添付画像の緑の部分はCを経由してAに達する経路の本数(全部で8本になる)の正しい数え方の例。

続く Image
#数楽 移動禁止点があるランダムウォークの経路の数え方に習熟すれば、公平なギャンブルを繰り返すと、勝ちまたは負けに偏っている時間の割合が長くなる確率が高くなることを意味する逆正弦法則を証明できます。以下のリンク先を参照。

この話題は「大学入試問題」という枠で見ない方がお得です。
Read 5 tweets
13 Mar
#Julia言語

JupyterとPluto.jlの違い

Jupyterを使うにはPythonが必要。
Pluto.jlはJuliaだけで動く。

Jupyterではセル単位で実行される。
Pluto.jlでは任意のセルの実行が他のセルにも自動的に反映される。さらにスライダーなどの設置がJupyterよりも楽。

github.com/fonsp/Pluto.jl
#Julia言語 続き

Jupyter notebookをダウンロードすると計算結果の情報もそこに含まれている。
Pluto.jlのノートブックをダウンロードしても計算結果の情報は含まれない。

以上のようにJupyterとPluto.jlでは長所と欠点が違うので使い分けるとよいと思います。

github.com/fonsp/Pluto.jl
#Julia言語 仮に私が中高生に初めてJuliaを使わせる仕事が割り振られたとしたら、

①Juliaの公式バイナリをダウンロードしてインストール
②Plots.jlやPluto.jlなどのパッケージのインストール
③using Pluto; Pluto. run() → ブラウザでPlutoが使用可能に!

のようにしたいです。
Read 13 tweets
12 Mar
#Julia言語 で @ distributed を使ってモンテカルロシミュレーションの足し上げを行うときに、forループの内側で rand() を使うと遅くなります。固定された rng について rand(rng) の形式で実行する必要がある。

解決策:@ my_distributed マクロを自作して使う!

gist.github.com/genkuroki/a6dc…
#Julia言語 例の e のモンテカルロ計算については

gist.github.com/genkuroki/5212…

を参照。色々試してみたが、私の環境では @ my_distributed 版がシンプルでかつ一番速かったです。
#Julia言語

@ my_threads - threads version of @ my_distributed

gist.github.com/genkuroki/1efd…
Read 12 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!