Juliaで平面ベクトル場を作って、CSVファイルとして出力する方法

勉強の記録

言語の「Julia」でベクトル場を作り、各点の成分をCSVファイルとして出力する方法を紹介します。

数学の勉強の一環で取り組んだら面白かったので、方法をまとめました。

スポンサーリンク

デモ

この記事では、以下の図とCSVファイルを作成します。

[-y,x]のベクトル場
ベクトル場をCSVに出力したサンプル
ベクトル場をCSVに出力し、エクセルで開いた様子

Juliaの導入方法

Juliaというプログラミング言語を使います。
Juliaの導入方法は、別記事にまとめています。
もし今回の記事を試される場合、IJuliaPlotsGRを使える状態にしておいてください。

適当なベクトル場を用意する

サンプルデータとして、以下の数式(円の方程式)からベクトル場を作りました。

\[x^2+y^2=C\qquad(Cは任意定数)\]

平面上の各点での傾きは、元の式を微分して求めます。
微分すると、y’=-x/yになるので、これがx-y平面上の各ポイントの傾きだと考えると

\[\textbf{f}(x,y) = [-y,x]\]

・・・という式が得られます。

例えば、平面上の点(2,0)でのベクトルは、[0,2]となり、垂直上向きになります。

プロットして確認

CSVを生成する前に、プログラムのコードが正しく動いているか、確認しておきます。
ベクトル場が作れているかは、プロットして視覚化すると、見た目ですぐに判断できます。

コード

コード実行前に、IJulia上でプロットツールのGRをロードしておきます。

using Plots
gr()
実行後、ロード完了まで数秒かかります

そして、以下のコードを実行します。
点を格子状に生成して、各点にベクトル関数[-y , x]を設定して、それをプロットする流れです。

x = range(-2,2,length=11) # -2から2まで、要素11個分の配列を作る
y = range(-2,2,length=11) # -2から2まで、要素11個分の配列を作る
X = repeat(x, inner=(length(y))) # xの個々の要素を、yの要素数の回数分、繰り返す
Y = repeat(y, outer=(length(x))) # y全体を、xの要素数の回数分、繰り返す

scale =0.3
u = scale * -Y
v = scale * X

quiver(X, Y, quiver=(u, v), lw = 3,size=(500,500))  # グラフに点を打つ

こんな感じになりました。無事、思い通りの図が書けました。※見やすくする為に、スケールを掛けて矢線の長さを縮めています。

↓ちなみに、スケールをかけなかったら、こんなん。

格子点の作り方

ちなみに上記のコードに行きつくまでに、悩んでしまいました。
格子状の点の生成に、詰まってしまったんです。勝手にmeshgrid(x,y)と書いては、UndefVarErrorエラーが帰ってきて考え込んでいました。フォーラム等を調べるとJuliaでは標準の機能ではないようで、配列を自分で作る必要があるみたいです。

今回の解決策はこんな感じ。例えば、xとy方向の座標の配列が以下だったとします。

  • a=[1,2,3]
  • b=[1,2,3]

以下のコードだと、点は3個しか作られません。

a = range(1,3,length=3) # 1から3まで、要素3個分の配列を作る
b = range(1,3,length=3) # 1から3まで、要素3個分の配列を作る

scatter(a, b, size=(400,400),label=false)  # グラフに点を打つ
3個の点(3組の座標)しか作れない

そこで、コードを2行書いてこんな配列をつくると、3×3=9個分の点が打てます。

  • A=[1, 1, 1, 2, 2, 2, 3, 3, 3]
  • B=[1, 2, 3, 1, 2, 3, 1, 2, 3]
a = range(1,3,length=3) # 1から3まで、要素3個分の配列を作る
b = range(1,3,length=3) # 1から3まで、要素3個分の配列を作る

A = repeat(a, inner=(length(b))) # xの個々の要素を、yの要素数の回数分、繰り返す
B = repeat(b, outer=(length(a)))  # y全体を、xの要素数の回数分、繰り返す

scatter(A, B, size=(400,400),label=false)  # グラフに点を打つ
Juliaで格子点を作成した様子
9個分の点が打てた

▼ 配列の作成に使ったrepeat関数ついての、公式ドキュメントはこちらです。

CSVに出力する

あとはCSVに出力するだけです。
インストールしたパッケージを使うだけなので、とても楽が出来ます。

パッケージをインストール

以下二つのパッケージをインストールします。

  • DataFrames
    表形式のデータを操作するためのパッケージ
  • CSV
    CSVで読み書きするためのパッケージ

例えばDataFramesをインストールするならば、juliaの端末(REPL)で]キーを押してパッケージモードに入り、add DataFramesと入力し実行します。

julia> ]
(v1.5) pkg> add DataFrames

公式ドキュメント

▼ DataFrames.jlについて

Getting Started · DataFrames.jl

▼ CSV.jlについて

Importing and Exporting Data (I/O) · DataFrames.jl

実行する

本番実行前に、まずはテストとして、下図の4つ分のベクトルを出力してみます。

初めにusing DataFrames, CSVとかいて、パッケージを呼び出す必要があります。

using DataFrames, CSV

x = [2,0,-2,0]
y = [0,2,0,-2]

u =  -y
v =  x

df = DataFrame(x = x, 
               y = y,
               u = u,
               v = v
               )

CSVを出力する前にIJulia上で確認すると、ちゃんと4行4列見出し付の表が生成されています。

後は以下のコードでCSVとして出力します。出力先は、適宜任意のパスを入力して下さい。(パスの\は二回入れないとエラーが出ます)

CSV.write("E:\\test1.csv", df)

Eドライブの直下に、test1.csvという名前のファイルを作りました。

エクセルでCSVファイルを開いた様子
エクセルでCSVファイルを開いた様子

最終コード

CSVに出力する最終的なコードは以下の通りです。

using DataFrames, CSV
x = range(-2,2,length=11)
y = range(-2,2,length=11)

X = repeat(x, inner=(length(y)))
Y =repeat(y, outer=(length(x)))

scale =1
u = scale * -Y
v = scale * X

df = DataFrame(x = X, 
               y = Y,
               u = u,
               v = v
               )
CSV.write("E:\\test2.csv", df)

無事、CSVファイルが生成されました。
下図は、エクセルで開いた様子です。

ベクトル場をCSVに出力したサンプル

参考資料一覧

数学

LibreTexts 5.2: Vector Fields

5.2: Vector Fields
Vector fields are an important tool for describing many physical concepts, such as gravitation and electromagnetism, which affect the behavior of objects over a...

ベクトル場(Vector fields)については、上記のLibreTextsがわかりやすいです。LibreTextsは、オンラインのオープンアクセス教科書プロジェクトで、様々な単元の解説を無料で閲覧できます。
沢山の図表、例題も交えて解説されているので、スムーズに読み進められます。
日本語の参考書で勉強後に読むと、知識が整理され、英語の勉強にもなるのでよく利用しています。

「ベクトル解析キャンパス・ゼミ」マセマ出版社

マセマの本です。語り口が穏やかで緊張がほぐれる気がして、なんか元気が出ます。
最初は行列やベクトルの基礎から解説が入るので、あまり数学に自信がない方でも、脱落せずに入っていけるはずです。私の数学の学力は歯抜けで、大学の線形代数や微積分の入門書を一通り終えた程度ですが、本書の配慮のおかげで、なんとかついていけています。
ただ、微分方程式も出てくるので、そこは今の知識では歯が立たず、別の書籍で勉強を進めています。
不足分は別途立ち止まって拾っていく方針で、気長に取り組んでいます。

Julia関連

配列の操作について

Plots

CSVへの出力

さいごに

結果的には簡単に視覚化しただけですが、たどり着くまでに四苦八苦して夢中になれました。参考書を読み込んだり、思ったようにグラフ化できずに延々とコードを試してはエラーと格闘したり。
本をよむだけだと、ここまで躍起にならなかったかもしれません。
また今後も、勉強のお供にJuliaを使っていこうと思います。

▼ 関連記事

↓ 前半で、Juliaを活用しています。

タイトルとURLをコピーしました