JLD2を使って計算結果を保存しグラフを描く


私はこれまで数値計算の結果の保存にCSVフォーマットを用いていました。
しかし結果が増えるにつれファイルの管理が大変になったので,階層構造を使えるJLD2に目を付けました。
そこで今回の目的は
1.JLD2フォーマットでデータを書き込む
2.データを読み込んでグラフを作成する
とします。
他に階層構造を使えるフォーマットにHDF5とJLDがあり,HDF5とJLDとJLD2の違いは@Lirimy様の"Julia でデータを読み書きする”の記事内にあります。

環境

  • Jupyter Lab v1.2.6
  • julia v1.4.0
  • JLD2 v0.2.3
  • Plots v0.29.9

1.JLD2フォーマットでデータを書き込む

保存するデータとして,適当なエルミート行列

H = \left[
\begin{array}{ccc}
\epsilon_1+2t\cos k&s&0\\
s&\epsilon_2+2s\cos k&s\\
0&s&\epsilon_3+2t\cos k
\end{array}
\right]

の固有値と固有ベクトルを保存することにします。
用いるパッケージを宣言し,固有値を計算する関数を以下のように書きます。

using JLD2
using LinearAlgebra
using Plots
gr(framestyle=:box)

function egtest(k)
    #適当なパラメータ
    ϵ1 = -1.0
    ϵ2 = 0.0
    ϵ3 = 1.0
    t = -2.0
    s = 1.0
    H = [ϵ1+2*t*cos(k) s 0.0;s ϵ2+2*s*cos(k) s;0.0 s ϵ3+2*t*cos(k)]
    v,w = eigen(H)
    return v,w
end

続いてパラメータ$k$を$-\pi$から$\pi$まで変化させたときの固有値と固有ベクトルを
"example.jld2"に書き込みます。

function test_write()
    k = collect(-pi:0.01*pi:pi)
    val1(k) = egtest(k)[1][1]
    val2(k) = egtest(k)[1][2]
    val3(k) = egtest(k)[1][3]

    vec1(k) = egtest(k)[2][1]
    vec2(k) = egtest(k)[2][2]
    vec3(k) = egtest(k)[2][3]


    jldopen("example.jld2", "w") do file
        file["eig/k"] = k
        file["eig/value/1"] = val1.(k)
        file["eig/value/2"] = val2.(k)
        file["eig/value/3"] = val3.(k)

        file["eig/vector/1"] = vec1.(k)
        file["eig/vector/2"] = vec2.(k)
        file["eig/vector/3"] = vec3.(k)
    end
end
test_write()

ここで

jldopen("example.jld2", "r")

を実行すると下図のように階層構造になっていることが分かります。

これで書き込みは完了です。

2.データを読み込んでグラフを作成する

structを定義してその中にデータをいれます。

struct dispersion
    k::Array{Float64,1}
    E1::Array{Float64,1}
    E2::Array{Float64,1}
    E3::Array{Float64,1}
end

function data_arr()
    jldopen("example.jld2", "r") do file
        k = file["eig/k"]
        E1 = file["eig/value/1"]
        E2 = file["eig/value/2"]
        E3 = file["eig/value/3"]
        return dispersion(k,E1,E2,E3)
    end
end

plot(data_arr().k,[data_arr().E1 data_arr().E2 data_arr().E3])
savefig("test.png")


プロットしてみると以下のような図が得られます。

一応これでプロットできましたので目的達成です。

参考文献

JLD2公式ドキュメント: https://github.com/JuliaIO/JLD2.jl

@Lirimy様 Julia でデータを読み書きする: https://qiita.com/Lirimy/items/04dde74376e04d607f80