{- |
Lotka-Volterra predator-prey model
parameters
* @g@ : victims' growth factor
* @d@ : predators' death factor
* @s@ : search rate
* @e@ : energetic efficiency
-}
module Predator where
import Visualize (
Vis, Color(Green, Red),
figP, figure, title,
showParams, xLabel, yLabel, plotL, color, label,
)
-- try: n>=500
-- g = 1.05
-- d = 0.95
-- s = 0.01
-- e = 0.01
g, d, s, e :: Float
g = 1.02
d = 0.98
s = 0.01
e = 0.01
-- 'direct' function-over-time approach -- very inefficient due to recursion
--
-- v :: Int -> Float
-- v 0 = 20
-- v t = ((1 + r - a*p(t-1)) * v (t-1)) `max` 0
--
-- p :: Int -> Float
-- p 0 = 15
-- p t = ((1 - d + a*b*v(t-1)) * p (t-1)) `max` 0
--
--
-- fig1 = figP figure{title="Predator/Prey Simulation "++
-- showParams [r,d,a,b] ["r","d","a","b"],
-- xLabel="Time (generation)",
-- yLabel="Population"}
-- [(plotF (0,15,1) v){color=Green,label="Victim"},
-- (plotF (0,15,1) p){color=Red,label="Prey"}]
v0 :: Float
v0 = 1
p0 :: Float
p0 = 1
dv :: (Float,Float) -> Float
dv (v,p) = (g*v - s*v*p) `max` 0
dp :: (Float,Float) -> Float
dp (v,p) = (d*p + e*v*p) `max` 0
dvp :: (Float, Float) -> (Float, Float)
dvp vp' = (dv vp', dp vp')
vp :: [(Float, Float)]
vp = (v0,p0):map dvp vp
vs :: [Float]
vs = map fst vp
ps :: [Float]
ps = map snd vp
fig1 :: Int -> Vis
fig1 n = figP figure{title="Predator/Prey Simulation "++
showParams [g,d,s,e] ["g","d","s","e"],
xLabel="Time (generation)",
yLabel="Population"}
[(plotL (take n vs)){color=Green,label="Victim"},
(plotL (take n ps)){color=Red,label="Prey"}]