JLD2를 사용하여 계산 결과를 저장하고 그래프 그리기
12527 단어 Julia
서
지금까지 수치 계산 결과를 저장하기 위해 CSV 형식을 사용했습니다.
그러나 결과가 증가함에 따라 파일 관리가 어려워졌기 때문에 계층 구조를 사용할 수있는 JLD2에 주목했습니다.
그래서 이번 목적은
1.JLD2 형식으로 데이터 쓰기
2. 데이터를 읽어 그래프를 작성합니다.
합니다.
그 밖에 계층 구조를 사용할 수 있는 포맷에 HDF5와 JLD가 있고, HDF5와 JLD와 JLD2의 차이는 @Lirimy 같은 "Julia에서 데이터 읽기 및 쓰기"의 기사내에 있습니다.
환경
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
Reference
이 문제에 관하여(JLD2를 사용하여 계산 결과를 저장하고 그래프 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SOI_Phys/items/dada01e7d6cf9c358ea1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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")
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
Reference
이 문제에 관하여(JLD2를 사용하여 계산 결과를 저장하고 그래프 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SOI_Phys/items/dada01e7d6cf9c358ea1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(JLD2를 사용하여 계산 결과를 저장하고 그래프 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SOI_Phys/items/dada01e7d6cf9c358ea1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)