Julia에서 로지스틱 방정식 풀기

0. 이전: 대학 도서관에서 재미있는 책을 발견했다



어느 날, 대학의 도서관을 평소처럼 물색하고 있다고 수학의 선반에 있던 1권의 책을 손에 들었다.

미분 방정식으로 수학 모델을 만들자 · 일본 평론사 (서적 자세한 것은 여기)

미분방정식에서 다양한 현상을 모델화하고 있는 것 같다. Julia에서 수치 계산이거나 미분 방정식을 푸는 수단인지를 알게 된 직후였기 때문에 연습하고 싶다고 생각하고 도서관에서 빌려왔다.

이 기사에서는 실제로이 책에 쓰여진 "인구 문제"에 대해 Julia에서 풀어 봤기 때문에보고합니다.
뭐, 타이틀에도 있듯이 「로지스틱 방정식」을 풀어 본 것이다.

1. 로지스틱 방정식이란?



Wikipedia에 따르면,

로지스틱 방정식(로지스틱 편견, 영어: logistic equation[1])은 생물체의 개체수의 변화의 모습을 나타내는 수리 모델의 일종이다. 특정 단일 생물체가 특정 환경에서 성장할 때 생물체의 개체 수 (개체 그룹 크기)의 변화를 예측할 수 있습니다. 인간의 경우라면 인구의 변동을 나타내는 모델이다.

라고 적혀있다. 인간으로 말하는 곳의 인구 변동을 나타내는 모델, 이것으로 어쩐지 이해는 해 주셨을 것이다.

구체적으로 로지스틱 방정식은

$$
\frac{dN}{dt} =\gamma N\left(1 -\frac{N}{N_{\infty}}\right)
$$

같이 기술된다. 여기서, $ N = N (t) $는 "임의의 시간 $ t $에서 특정 국가의 총 인구"를 나타냅니다. $N_{\infty}$는 "인구가 증가한 상한"이다.

이것을 미분 적분학의 지식을 사용하여 엄격하게 풀면,
$$
N(t) =\frac{N_{\infty}}{1 -\left(1 -\frac{N_{\infty}}{N_0}\right)e^{-\gamma t}}
$$

된다. 여기서 초기 조건을 $N(0) = N_0$ 로 하고 있다.
상수에 대해 이번에는
N_0 = 3.9 \times 10^6 \\
N_{\infty} = 1.97 \times 10^8 \\
\gamma = 0.3134

한다.

2. 코드에 떨어뜨림



그럼 이번에도 Ordinary Differential Equations 을 참고하면서 코딩해 나가자.

PopulationProblem.jl
using DifferentialEquations
using Plots; gr()

#微分方程式を定義
f(y , t) = 0.3134y*(1-y/1.97e8)

#初期値
y0 = 3.9e6

#時間間隔
tspan = (0.0, 70.0)

#微分方程式を解かせる
prob = ODEProblem(f, y0, tspan)
sol = solve(prob)

#グラフをplot
plot(sol; legend=:topleft , title = "PopulationProblem" , lw = 5 , label = "Numerical" , color =:black)

#厳密解を定義してグラフに追加する
g(t) = 1.97e8/(1 - (1 - 1.97e8/3.9e6)*exp.(-0.3134*t))
plot!(g , linestyle =:dash , lw = 3 , label = "Exact" , color =:red)

이것을 실행하면, 제대로 그래프를 낼 수 있었다. $t\to\infty$ 로 $N(t)\to N_{\infty}$ 에 수렴하는 것은 엄밀해에서도 알 수 있다.


3. 마지막으로



Twitter에서 조언을 주면서 이번에도 쓸 수 있었습니다. 참고 자료는 본문중에 링크를 메우고 있습니다.
Julia는 매우 쉽게 작성할 수 있습니다!

좋은 웹페이지 즐겨찾기