言語の「Julia」でベクトル場を作り、各点の成分をCSVファイルとして出力する方法を紹介します。
数学の勉強の一環で取り組んだら面白かったので、方法をまとめました。
デモ
この記事では、以下の図とCSVファイルを作成します。
![[-y,x]のベクトル場](https://www.noboyu.com/wp-content/uploads/2021/05/circle-vector-fields-sample.png)

Juliaの導入方法
Juliaというプログラミング言語を使います。
Juliaの導入方法は、別記事にまとめています。
もし今回の記事を試される場合、IJulia、Plots、GRを使える状態にしておいてください。
適当なベクトル場を用意する
サンプルデータとして、以下の数式(円の方程式)からベクトル場を作りました。
\[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では標準の機能ではないようで、配列を自分で作る必要があるみたいです。
- 参考にしたJuliaのフォーラム :
Meshgrid function in Julia – discourse.julialang.org
今回の解決策はこんな感じ。例えば、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) # グラフに点を打つ

そこで、コードを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) # グラフに点を打つ

▼ 配列の作成に使ったrepeat関数ついての、公式ドキュメントはこちらです。
CSVに出力する
あとはCSVに出力するだけです。
インストールしたパッケージを使うだけなので、とても楽が出来ます。
パッケージをインストール
以下二つのパッケージをインストールします。
- DataFrames
表形式のデータを操作するためのパッケージ - CSV
CSVで読み書きするためのパッケージ
例えばDataFramesをインストールするならば、juliaの端末(REPL)で]キーを押してパッケージモードに入り、add DataFrames
と入力し実行します。
julia> ]
(v1.5) pkg> add DataFrames
公式ドキュメント
▼ DataFrames.jlについて
▼ CSV.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に出力する最終的なコードは以下の通りです。
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ファイルが生成されました。
下図は、エクセルで開いた様子です。

参考資料一覧
数学
▼ LibreTexts 5.2: Vector Fields

ベクトル場(Vector fields)については、上記のLibreTextsがわかりやすいです。LibreTextsは、オンラインのオープンアクセス教科書プロジェクトで、様々な単元の解説を無料で閲覧できます。
沢山の図表、例題も交えて解説されているので、スムーズに読み進められます。
日本語の参考書で勉強後に読むと、知識が整理され、英語の勉強にもなるのでよく利用しています。
▼ 「ベクトル解析キャンパス・ゼミ」マセマ出版社
マセマの本です。語り口が穏やかで緊張がほぐれる気がして、なんか元気が出ます。
最初は行列やベクトルの基礎から解説が入るので、あまり数学に自信がない方でも、脱落せずに入っていけるはずです。私の数学の学力は歯抜けで、大学の線形代数や微積分の入門書を一通り終えた程度ですが、本書の配慮のおかげで、なんとかついていけています。
ただ、微分方程式も出てくるので、そこは今の知識では歯が立たず、別の書籍で勉強を進めています。
不足分は別途立ち止まって拾っていく方針で、気長に取り組んでいます。
Julia関連
配列の操作について
- Repeat関数
https://docs.julialang.org/en/v1/base/arrays/#Base.repeat - 関数をベクトル化するドット演算子 “.” について
https://docs.julialang.org/en/v1/manual/functions/#man-vectorized
https://docs.julialang.org/en/v1/manual/mathematical-operations/#man-dot-operators
Plots
- インストール方法について
https://docs.juliaplots.org/latest/install/ - バックエンドの種類や特徴について
https://docs.juliaplots.org/latest/backends/ - バックエンド別のプロット例(リンク先はGR)
https://docs.juliaplots.org/latest/generated/gr/
CSVへの出力
- DataFrames
https://dataframes.juliadata.org/stable/man/getting_started/ - CSV
https://dataframes.juliadata.org/stable/man/importing_and_exporting/
さいごに
結果的には簡単に視覚化しただけですが、たどり着くまでに四苦八苦して夢中になれました。参考書を読み込んだり、思ったようにグラフ化できずに延々とコードを試してはエラーと格闘したり。
本をよむだけだと、ここまで躍起にならなかったかもしれません。
また今後も、勉強のお供にJuliaを使っていこうと思います。
▼ 関連記事
↓ 前半で、Juliaを活用しています。