[gloss로 실험] 판델폴 진동자

4942 단어 Gloss하스켈
판델폴 진동자는 상공간 1 에 리미트 사이클이 존재하는 미분방정식에 의해 기술되는 진동자입니다.
\frac{d^2x}{dt^2} - \mu (1 - x^2)\frac{dx}{dt} + x = 0

이것을 Haskell로 구현하면 다음과 같습니다.
type Point = (Double, Double)

vanderpol :: Float -> Point -> Point
vanderpol dt (x, x') = let mu = 2.5
                           x'' = mu * (1 - x^2) * x' - x
                       in (x + dt * x', x' + dt * x'')
Point(位置, 速度) 라는 좌표를 나타내는 튜플입니다. 미분 방정식에서 2층 미분 값을 계산하고 오일러 방법에 의해 다음 단계의 좌표를 계산합니다.

이 미분 방정식의 시간 발전을 실제로 gloss 2 로 그려서 바라봅시다.
main :: IO ()
main = simulate inWindow white 24 initModel draw (\_ -> step)
  where
  inWindow = InWindow "Haskell Day 2018" (640, 480) (100, 100)
  initModel = [(1.0, 0.0)] -- 初期状態
  draw = scale 50 50 . line -- そのままだと小さいので50倍に拡大する
  step dt ps@(p:_) = vanderpol dt p : ps
(1.0, 0.0) 에서 시작하여 시간 발전을 line 로 그립니다. stepvanderpol 에 의해 계산한 다음 단계의 상태를 지금까지의 계산 이력의 리스트의 선두에 덧붙이고 있습니다. 이것을 실행하면 다음과 같은 시뮬레이션이 됩니다.



여러분도 꼭 스스로 구현해 보고 초기 상태나 $\mu$의 값을 바꾸거나 해 놀아 보세요.

[참고] Wikipedia: 판델폴 진동자



x 축에 위치, y 축에 속도를 취한 공간

gloss로 시작하는 그래픽 그리기 :: Haskell 입문 다음 읽기 기사 - Qiita 

좋은 웹페이지 즐겨찾기