logo

로렌츠 84 시스템 📂동역학

로렌츠 84 시스템

모델

다음은 로렌츠-84 시스템Lorenz-84 system의 지배 방정식이다.

$$ \begin{align*} \dot{x} =& - a x - y^2 - z^2 + a F \\ \dot{y} =& - y + x y - b x z + G \\ \dot{z} =& - z + b x y + x z \end{align*} $$

파라미터

  • $a = 0.25$
  • $b = 4$
  • $F= 5$, $G= 1$: 주로 바이퍼케이션 파라미터가 된다.

설명

로렌츠-63 그리고 로렌츠-96과 더불어서 로렌츠의 이름이 붙은 어트랙터다. 고차원 공간에서 형식만 남은 로렌츠-96과 비교해보면 로렌츠-84는 대기의 순환처럼 실제 의미가 있다고 한다.

예시로써는 여타 시스템과는 비교할 수 없을 정도로 풍부한 바이퍼케이션을 보이기 때문에 굉장히 중요한 시스템이다.

어트랙터

alt text

이상한 어트랙터를 보면 어떻게 생겼다고 형용하기가 어려울 정도로 복잡하다.

바이퍼케이션

alt text

보통 로렌츠-84를 다룰 때는 파라미터를 하나만 보는 것보단 $F, G$ 를 동시에 보아 코디멘젼-2를 다루고, 그 바이퍼케이션 다이어그램은 위와 같다.

코드

using DataFrames, DifferentialEquations, OrdinaryDiffEqLowOrderRK

function factory_lorenz84(FG; ic = [1.0, 1.0, 1.0], saveat = 0:1e-2:100)
    F, G = FG
    a, b = (0.25, 4)
    function sys(du, u, p, t)
        x, y, z = u
        F, G = p

        du[1] = -a*x - y^2 - z^2 + a*F
        du[2] = -y + x*y - b*x*z + G
        du[3] = -z + b*x*y + x*z
        return du
    end
    sol = solve(ODEProblem(sys, ic, (0, last(saveat)), [F, G]), RK4(), dt = saveat.step.hi, adaptive=false, maxiters = Inf)
    dsol = [sol.k[2][1] stack([solk[2] for solk in sol.k[2:end]])]
    matrix = [sol.t sol[:, :]' dsol']
    return matrix[sol.t .≥ first(saveat), :][1:end-1, :]
end
factory_lorenz84(T::Type, args...; kargs...) =
DataFrame(factory_lorenz84(args...; kargs...), ["t", "x", "y", "z", "dx", "dy", "dz"])

sol = factory_lorenz84(DataFrame, [5, 1]; ic = [1, 1, 1], saveat = 900:1e-2:1000)
plot(sol.x, sol.y, sol.z, alpha = .5, color = :black, xlabel = L"x", ylabel = L"y", zlabel = L"z", size = [400, 400])