JLD2를 사용하여 계산 결과를 저장하고 그래프 그리기

12527 단어 Julia



지금까지 수치 계산 결과를 저장하기 위해 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 형식으로 데이터 쓰기



    저장된 데이터로서 적절한 Hermite 행렬
    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 공식 문서 : htps : // 기주 b. 코 m/쥬아이오/JLD2. jl

    @Lirimy Julia에서 데이터를 읽고 씁니다. htps : // 이 m / ぃり my / ms / 04 74376 04d607f80

    좋은 웹페이지 즐겨찾기