logo

줄리아에서 meshgrid 만드는 법 📂줄리아

줄리아에서 meshgrid 만드는 법

개요

파이썬이나 매트랩에서 사용하는 meshgrid() 같은 함수가 따로 있는 건 아니다. 그리드 위에서의 함숫값만을 얻고 싶은 것이라면, 격자를 만들지 않는 더 간단한 방법이 있다.

코드

2차원

열벡터와 행벡터를 곱하는 것은, 열벡터와 행벡터를 크로네커 곱하는 것과 같은 결과를 준다.

U(t,x) = sin(π*x)*exp(- π^2 * t)
x = LinRange(-1., 1, 100)
t = LinRange(0., 0.35, 200)'

# Fig. 1
X = x * fill!(similar(t), 1)
T = fill!(similar(x), 1) * t

u1 = U.(T,X)
heatmap(t', x, u1, title="Fig 1")

fig1.png

크로네커 곱으로 만들면,

using LinearAlgebra

X = kron(x, ones(size(t)))
T = kron(ones(size(x)), t)

u2 = U.(T,X)
heatmap(t', x, u2, title="Fig 2")

julia> u1 == u2
true

fig2.png

3차원1

U(x,y,t) = exp(-x^2) * exp(-2y^2) * exp(- π^2 * t)

x = LinRange(-1., 1, 100)
y = LinRange(-1., 1, 100)
t = LinRange(0.,0.35, 50)

X = getindex.(Iterators.product(x, y, t), 1)
Y = getindex.(Iterators.product(x, y, t), 2)
T = getindex.(Iterators.product(x, y, t), 3)

u3 = U.(X,Y,T)

anim = @animate for i ∈ 1:50
    surface(u3[:,:,i], zlims=(0,1), clim=(-1,1), title="Anim. 1")
end

anim1.gif

코드 전문

using Plots
cd = @__DIR__

U(t,x) = sin(π*x)*exp(- π^2 * t)
x = LinRange(-1., 1, 100)
t = LinRange(0., 0.35, 200)'

# Fig. 1
X = x * fill!(similar(t), 1)
T = fill!(similar(x), 1) * t

u1 = U.(T,X)
heatmap(t', x, u1, title="Fig 1")
savefig(cd*"/fig1.png")

# kron
using LinearAlgebra

X = kron(x, ones(size(t)))
T = kron(ones(size(x)), t)

u2 = U.(T,X)
heatmap(t', x, u2, title="Fig 2")
savefig(cd*"/fig2.png")

u1 == u2

# 3d
U(x,y,t) = (1/4) * exp(-x^2) * exp(-2y^2) * exp(- π^2 * t)

x = LinRange(-2., 2, 100)
y = LinRange(-2., 2, 100)
t = LinRange(0.,0.35, 50)

X = getindex.(Iterators.product(x, y, t), 1)
Y = getindex.(Iterators.product(x, y, t), 2)
T = getindex.(Iterators.product(x, y, t), 3)

u3 = U.(X,Y,T)

anim = @animate for i ∈ 1:50
    surface(u3[:,:,i], zlims=(0,0.5), clim=(0,0.3), title="Anim. 1")
end
gif(anim, cd*"/anim1.gif", fps=10)

환경

  • OS: Windows11
  • Version: Julia v1.8.3, Plots v1.38.6