ノートの切れ端

その日やったことを書くだけ。

mathematicaで数値計算結果の出力

最近mathematicaにハマっています。授業で引力を加味した天体の動き的なものを数値計算したのですが、単に数字を見てもどうなっているのかさっぱりわからないので、図にしたいと思って今回利用しました。

準備

環境

今回はmathematicaメインなので、数値計算結果は準備済みということで。入力データとして以下のようなものを準備します。

天体1のx座標 天体1のy座標
天体2のx座標 天体2のy座標
...

mathematicaで散布図作成

まず、上記のような入力データの散布図をmathematicaで描くためのコードを書きます。以下のようなコードで動くと思います。

(* Define Size *)
size = 0.3;

circle := {
       Disk[{x,y},size]
};

xylst =
ReadList["Path-To-File", {Number, Number}];

objlst = {Thickness[0.005]};
Do[
   x = xylst[[i,1]];
   y = xylst[[i,2]];
   AppendTo[objlst, circle],
   {i, 1, Length[xylst]}
    ];

Show[
     Graphics[objlst],
     Axes->True,
     PlotRange->{{0,100}, {0,100}},
     AspectRatio->1
    ]

mathematicaGIFアニメーション作成

自分の場合、計算回数Nステップ後の天体全体の様子を見るために、上記の散布図を利用しました。ここまでくると、時間経過で天体がどのように動くか気になりますね。ということで、時間経過で変化するようGIFアニメーションにします。

準備として、計算回数Nステップ後の出力データのファイル名を"tN.txt"とかにします。wolfram言語では数値変数Nに対して、『"t"<>ToString[N]<>".txt"』で文字列結合ができます。これで順次アクセスするファイルを変更します。

(* Define Size *)
size = 0.3;

circle := {
       Disk[{x,y},size]
};

anime=Table[
    filename = "t"<>ToString[k]<>".txt";
    xylst =
    ReadList["Path-To-Directory-with-Files"<>filename, {Number, Number}];
    objlst = {Thickness[0.005]};

    Do[
       x = xylst[[i,1]];
       y = xylst[[i,2]];
       AppendTo[objlst, circle],
       {i, 1, Length[xylst]}
    ];
    Graphics[objlst, PlotRange->{{0,100},{0,100}},Axes->True,AspectRatio->1],
    {k,0,300,1}
]
Export["Output-Filename",anime];
ListAnimate[anime]

終わり

mathematicaってすごく楽しいんですけど、エディタが使いづらい気がするんですよね。mathematica使うときって50行くらい一度に書くこともあるので、emacsとかで書きたいけどwolfram-modeとかなかったり、誰かが設定ファイル作ってくれてるんですけど合わなかったり。そんな感じでEmacsLispへの興味が湧き上がってきてます笑

下記のようなコードで下のGIFアニメができました。それでは、皆さんも楽しいmathematicaライフを!

f:id:nobuta05:20160207222542g:plain