자동 미분 & 비선형 역학계 수치 계산
\begin{equation}
\begin{aligned}
&\dot{x} = f(x,y) = a-(b+1)x+x^2y\\
&\dot{y} = g(x,y) = bx-x^2y
\end{aligned},\qquad x,y\ge 0
\end{equation}
이 방정식의 고정점이 $(x, y)=(x^*, y^*)$이면 선형 안정성 분석을 통해 고정점 $(x^*, y^*)$의 안정성을 계산하여 다음 아크비안 행렬 공식의 대각과 토론할 수 있다.\begin{equation}
\frac{\partial (f,g)}{\partial (x,y)}=
\left(\begin{aligned}
&\frac{\partial f(x,y)}{\partial x}&\frac{\partial f(x,y)}{\partial y}\\
&\frac{\partial g(x,y)}{\partial x}&\frac{\partial g(x,y)}{\partial y}\\
\end{aligned}\right)_{\begin{aligned}x=x^*\\y=y^*\end{aligned}}
\end{equation}
아래의 그림은 고정점 중의 대각과 행렬 공식의 값에 따라 고정점의 안정성을 분류한 도표이다.게임에서 각양각색의 2변수의 비선형 역학 시스템의 수치를 계산할 때, 각 방정식에 대해 해석적으로 미분함수 $f (x, y), g (x, y) $를 편향시켜 설명하는 것은 좀 번거롭다.이에 따라 이번에는 프로그램이 편미분 계산을 하기 위해 쌍수 자동 미분을 채택했다.python에서 이중수를 사용하기 위해 만든 모듈 (dual.py) 의 원본 파일은 여기. 에 두어야 합니다.다음은 임의의 $x, y$의 대각과 행렬 공식을 계산하기 위한 함수입니다.
from dual import *
def calc_trace_determinant2(x,y):
det = fx(x,y)*gy(x,y)-fy(x,y)*gx(x,y)
tr = fx(x,y)+gy(x,y)
return tr,det
def fx(x,y):
return dual(f(dual(x,1),y)-f(x,y)).im
def fy(x,y):
return dual(f(x,dual(y,1))-f(x,y)).im
def gx(x,y):
return dual(g(dual(x,1),y)-g(x,y)).im
def gy(x,y):
return dual(g(x,dual(y,1))-g(x,y)).im
# Brusselator 方程式の場合, f, g は次のように定義する.
# 引数x, yにはスカラーを指定してください.
def f(x,y):
return a-(b+1)*x+x**2*y
def g(x,y):
return b*x-x**2*y
그 밖에 선형 안정성 분석에서 고정점의 대각과 행렬 공식의 값을 알기 위해 뉴턴법으로 아래 함수를 통해 고정점의 좌표를 얻었다.import numpy as np
def newton_method2(f,g,x_range,y_range,epsilon=10**(-13),limit=10**4):
x_min,x_max = x_range
y_min,y_max = y_range
x = np.random.rand()*(x_max-x_min)+x_min
y = np.random.rand()*(y_max-y_min)+y_min
err_x,err_y = 1,1
count = 0
while err_x>epsilon or err_y>epsilon:
_,det = calc_trace_determinant2(x,y)
dx = (fy(x,y)*g(x,y)-f(x,y)*gy(x,y))/det
dy = (gx(x,y)*f(x,y)-g(x,y)*fx(x,y))/det
x = x+dx
y = y+dy
err_x = np.abs(dx)
err_y = np.abs(dy)
count += 1
if count>limit:
raise RuntimeError("count exceeded limit @ newton_method2.")
return x,y
다음 그림은 상기 함수를 사용하여 Brusselator 방정식의 고정점 아크비의 대각과 행렬 공식을 계산하고 인자 $a, b$$$$$$$$$$$$tr-det 평면을 바꾸는 데 그려집니다.여기에 위의 그림에서 달러는 아래 공식에 따라 계산된 것이다.
\begin{align}
&\hat{a} = \frac{a-a_{min}}{a_{max}-a_{min}},\qquad
\left\{\begin{aligned}
&a\in A=\{a_m\}_{1\le m\le M}\\
&a_{min}=\mathrm{min}\;A\\
&a_{max}=\mathrm{max}\;A
\end{aligned}\right.\\
&\hat{b} = \frac{b-b_{min}}{b_{max}-b_{min}},\qquad
\left\{\begin{aligned}
&b\in B=\{b_n\}_{1\le n\le N}\\
&b_{min}=\mathrm{min}\;B\\
&b_{max}=\mathrm{max}\;B
\end{aligned}\right.\\
&color = \frac{M\hat{a}+\hat{b}}{M+1},\qquad 0\le color\le 1
\end{align}
수치 계산에서 $a{min}=b_{min}=0.1$, $a_{max}=b_{max]=2달러, $M=N=10달러입니다.tr-det 평면만 그리면 자동 미분의 은혜를 느끼지 못하기 때문에 마지막으로 x-y 평면에 고정점을 그려 매개 변수가 변할 때 고정점의 안정성이 어떤gif 애니메이션으로 변할지 색깔로 표시했다.gif 애니메이션에서 고정점의 안정성은 검은색 안정성, 회색 중심, 흰색 불안정이다.
실제 온라인 안정성 분석에서dual.py를 사용할 때 sample2.py를 참고하십시오.
Reference
이 문제에 관하여(자동 미분 & 비선형 역학계 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tmurakami1234/items/a35133604f94baaa0c35텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)