狠狠撸

狠狠撸Share a Scribd company logo
东工大D2 中川 麻悠子
様々な時間の関数や境界条件を含んだ複雑な微分方程式を Numerical method で解く Numerical Methods ;  時間や空間に関して不連続なステップを連続モデル式に近づけるための 近似 をする。 長所:どんな複雑な問題にも適応できる 問題点:新たな誤差を( numerical errors )を生み出す
多くの Numerical Method の背景となる重要な数学式。 Fig. 6.2  x+h における異なる次数のテイラー展開。 A)0 次近似、 B) 1次近似、 C) 2次近似、 D) 3次近似。
Numerical model テイラー展開のある点で切り捨てを行って進行。 この切り捨てにより起こる誤差-> Numerical Error ある method が n 次精度( n 次で切り捨て)->最も大きな各ステップでの切り捨て誤差は h n+1 *何故 Numerical Error を気にするのか? ① エラーは無い方がいい。出来る限り精度の良い結果を得るため。 ② 解の安定性。誤差が打ち消し合う場合と増幅する場合がある。 Fig. 6.3 Numerical Error の例。 A) 始めは小さいが徐々に真値から外れてくる。 B) 近似値が振動する。振動により現実的にはありえない負の値を示すこともある (●)
力学的な微分式の微分段階はタイムステップ ? t (一定でなくてもいい)を用いて Fig. 6.4   Numerical integration method の構成 テイラー式を用いた最も単純な update formula 。 O( ? t) :  切り捨てによる誤差 (i.e. for t =0.01,  ? t 2  = 1e ?4 ,  ? t3=1e?6; whereas for t=1,  ? t 2  =  ? t n  =1) 。 一次精度
Euler Integration の例: 単純な algal growth model 二次以降のテイラー級数を切り捨てるため、事実上 ? t の間速度が一定だと仮定->もしそういう場合でなければ精度はあまり良くない( Fig. 6.5A )。  対策としては ? t を小さくすることである。モデルの性質が本当に悪いと、何も変化しない位 ? t を小さくする必要があるかも
積分法の良し悪しのポイント;精度、安定性、速さ、メモリ必要量 ① 精度 離散化誤差(各タイムステップで発生):テイラー展開の結果と比較することで見積もれる。高次の method はタイムステップが進むほど高精度になる。 ② 安定性 連続的な solution points 間における振動増加をもたらす可能性の大きさ。なるべく精度良く安定である方がいい。 ③ スピード 1) タイムステップの数と ? t の取り方、 2)t ~ t+ ? t での関数計算の数 ④ メモリ必要量 繰り返し積分が複雑になればなるほどメモリは多く必要になる。 ← 毎回のタイムステップで記憶しなければいけない情報量の多さ hard-to-integrate type of problems は’ stiff’ sets of equations と言われる。 ← 異なる固有のタイムスケールを持ってモデル化されたプロセスに起きる。 例; dynamics of bacterial population dynamics (time scale: hours~days) + a forcing  with a seasonal or year-to-year variation (time scale: months~years) ← ほとんどのコンピュータは速いプロセスに合わせてで計算する
数値解析において常微分方程式の近似解を求める一連の方法。最も良く用いられる 4 次の Runge-Kutta method は各タイムステップ ? t で 4 つの評価を行う。 次の値( C i +1 )は、現在の値( C i )に間隔( ? t )と推定された勾配の積を加えたものである。その勾配は次の 4 つの勾配の重み付け平均で求める。 4 次精度の方法、すなわち全体の切り捨て誤差が ? t 5 のオーダーになる ← ? t 一定
?
この方法は 2 つの part で構成されている: ― 実際に積分を行う the stepper routine ― 用いられたステップの良し悪しを判断する a quality routine ? 5th Order Runge-Kutta method ; 4 次 Runge-Kutta 法が持つ構造安定性と flexible time step の正確さを組み合わせている。 ? t に推定される誤差 ? 0 を適用する。 基準エラー ? 1 を二つの Runge-Kutta 近似間の差から見積もる。 1 つは a large step  ? t 1 でもう一方は二つの連続的な半分のタイムステップからなる。 4 次 Runge-Kutta 法のように誤差を ? t 5 のオーダーとしてステップサイズを評価する。
t+ ? t の値を… t における値を元に算出する  (explicit method t+ ? t における値  (implicit method)  t と t+ ? t における値を両方とも部分的に含んでいる  (Semi-implicit method, the Crank-Nicholson scheme) を元に算出。 これまで述べた方法( explicit method )より精度が低いが、とても安定性がある ? は通常 0.5
Method 精度 安定性 メモリ Explicit  一次 ― ― Implicit 一次 良い + Semi-implicit  二次 良い + より大きなタイムステップを用いることができる (n*n) 行列の反転を行う分メモリをくう
R model では信頼性と効率性を達成するようなステップサイズを自動的に選ぶ繰り返し積分法 (ode) が利用できる( pakage deSolve )。 より単純な繰り返し積分はスピードに関していくつか問題がある。もし高精度で安定な Euler or 4th order Runge-Kutta method で用いた ? t が出力区間と同じかより大きいとしたら、その method はおそらく良い選択である。 ← fixed time step method によって得られた結果が十分に高精度か確かめる前に ? t が十分に小さいかチェックしなくてはいけない。 <チェック項目> あるタイムステップでまずモデルを走らせる タイムステップを二倍にして二つの run 間での違いを検査する。 もし違いが顕著なら、有意に変化しなくなるまでタイムステップを半分にする。 もし違いが有意でないなら、有意に変化するまでタイムステップを二倍にする。 大事を取るため、十分な精度のタイムステップの半分を用いる。
空間的一次元導関数の数値近似は有限の節目や layer の関数値を計算。 これらの微分には空間での位置の経過を慎重に追わなくてはいけない。特に、濃度、表層、フラックスや距離が ボックスの中心の値 なのか 境界の値 なのか。 Fig. 6.6   空間的導関数は空間定義域を grid cells  や boxes の数で再分配することで近似する。位置 (x i ) はボックスの 中心 。 相対的距離はボックスの 中心間 の距離 ( ? x i,i+1 ) かボックスの 長さ ( ? x i, ? x i+1, ) 濃度や密度などは grid cell の 中心の値 フラックスはボックスの 境界 で定義される。
First step; flux-gradient form で一般的な反応輸送方程式を立てる。 (g は一次成長速度 ) 各ボックス i に関して Ci はボックス i における濃度、 ? x i はボックス i の厚さ、 Ai はボックス i の中心部表面積、 ? i はボックス i 周りのフラックス勾配を表す。 ボックス i におけるフラックス勾配は次のボックス (i, i+1) と前のボックス (i-1, i) の境界間の違いで定義される:
連続的な分散フラックスの方程式; この式では濃度勾配と反対向きにフラックスが定義される。フラックスも濃度勾配もボックスの境界で定義されるので、 と表せる。 Dx i-1,i はボックス中央間距離で’ dispersion distance’ である。 D i-1,i は境界における分散係数である。
移流フラックスは単純に濃度と速度を掛け合わせて表される。 境界における移流フラックスは次式のように表される (’ centred difference’ approximation ) ボックス i と i-1 の濃度を反映 -> C i-1 が 0 でも移流フラックスが発生する。そして次のステップで濃度が負になる。これは現実的ではなく、避けるべき。この現象では値が振動し、解が不安定になる。 ボックス i-1 の濃度のみの関数にすることがより安全である( backward approximation )。
1.  フラックスとしての境界条件 上部境界フラックスを F として、ボックス 1 における濃度変化の近似式 2. 濃度としての境界条件 境界濃度をフラックスに変更して flux divergence equation を記述する。 3. 濃度の関数となっているフラックスで境界条件を規定  (Robin or evaporation boundary condition)
The backward differencing scheme 濃度が負にならず、安定。だが一次精度。-> Taylor 展開の二次以上の項を無視することで発生する 切り捨て誤差 ( numerical dispersion or numerical dissipation ) 実際の現象がシャープな勾配だとしても、なだらかな勾配になることがある。 例)非移動性で一定速度の個体数増加 Fig. 6.7  実際の局所的な分布が、 advection を含んだ growth model を行うと実線のようになだらかな分布を示す。
① ほとんどの場合、移流と拡散項が混合しており、数値的分散 (numerical dispersion) はその他の分散に対してごく小さいと考えられる。このような場合、 the backward numerical scheme は十分な精度であると考えるかもしれない。 ② より複雑な numerical scheme を用いる   数値的分散は Taylor series を高次項まで用いることで抑えられるが、それらの手法は複雑であるため未だにいくつかの問題がある。参考として Gurney and Nisbet (1998) の本が挙げられる。 ③ 大きなボックスに対して特に起こるため、ボックス数を増やす。   しかし、ボックス数を増やせばコンピュータへの負担が大きくなるので限度はある。 ④ 濃度が負になる危険性を無視して centre differences を用いる。   これはある条件下では最善の解決策。空間軸に対して濃度が増加しない限り、負の濃度が算出されることがない。さらに数値的分散はかなり抑えられる。 例)堆積有機物濃度…堆積物の深度が深くなるほど減少する。 -> explicit way の堆積有機物モデルは移流を centre difference を用いて記述する。
異なる scheme における数値的分散の効果を見る。 3 種類の scheme ① backward differences( ? =1) ② centred differences( ? =0.5) ③ a flexible scheme ( the Fiadeiro scheme ) ( ? =Peclet number の関数 ) 同じ大きさのボックスに対して、3つの scheme とも簡単のために一つの方程式でモデル化する。 Pe ( Peclet number); 分散過程における移流の相対的重要性を表す無次元数。
require(deSolve)   まず deSolve を読み込む # general parameters times  <- c(1/365,10/365,30/365,1/4,1/2,1)  # y  time at which output is required # General parameters for all runs DD  <- 0.1  # cm2/y  diffusion coefficient representing bioturbatin u  <- 1  # cm/y  advection = sedimentation rate init  <- 1000  # n.cm-3  initial density in upper layers   上層の初期密度 outtime  <- 6  # choose the output time point (as found in 'times') you want to see in the graphs # default outtime=6 will show distribution after 1.0 year # Function to calculate derivatives Lumin <-function(t,LUMIN,parameters)  関数 Lumin の定義 {  with (as.list(c(LUMIN,parameters)), { FluxDiff  <- -DD*diff(c(LUMIN[1],LUMIN,LUMIN[numboxes]))/delx   拡散フラックス FluxAdv  <- u * (sigma * c(0,LUMIN) + (1-sigma) *  移流フラックス   c(0,LUMIN[2:numboxes],LUMIN[numboxes]))   表層、中間、最深層にわける Flux  <- FluxDiff + FluxAdv   拡散+移流 dLUMIN  <- -diff(Flux)/delx   Flux(i) – Flux(i-1) i=2-numbox list(dLUMIN )   境界におけるフラックス }) }
# Function to run the model and produce output Modelfunc <- function(ltt,diffm,numboxes)   関数 Modelfunc の定義 {  # complete set of parameters, depending on choices  delx  <- 3/numboxes  # thickness of boxes in cm   ? x :ボックス長 if (diffm==&quot;back&quot;)  sigma<-1 if (diffm==“cent”)  sigma<-0.5        3パターンの解き方 if (diffm==&quot;fiad&quot;) { if (DD>0) { Pe <- u * delx/DD sigma <- (1 + (1/tanh(Pe) - 1/Pe))/2 } if (DD==0) sigma <- 1 } pars<-as.list(c(           関数 Lumin の [parameters] numboxes = numboxes, delx  = delx, sigma  = sigma, DD  = DD, u  = u ))
# call    呼び出し state  <- c(LUMIN=Ll)   初期値 out  <- ode.band(y=state,times,func=Lumin,parms=pars,nspec=1 (the number of *species* (components) in the model) ) # store output Dl  <- out[outtime,2:(numboxes+1)] # output Distance  <- seq(from=delx/2, by=delx, length.out=numboxes) # distance of box centres from x=0 if (diffm==&quot;back&quot;) ttext<-&quot;Backward Differences“  if (diffm==&quot;cent&quot;) ttext<-&quot;Centered Differences&quot; if (diffm==&quot;fiad&quot;) ttext<-&quot;Fiadeiro Scheme&quot; if (ltt==1){  #numberbox =300 plot(Dl,Distance,xlim=c(0,max(Dl)),ylim=c(numboxes*delx,0),type=&quot;l&quot;, main=ttext,xlab=&quot;Tracer density&quot;,ylab=&quot;Depth (cm)&quot;) legend(200,2, legend=c(&quot;n=300&quot;,&quot;n=120&quot;,&quot;n=60&quot;,&quot;n=30&quot;,&quot;n=15&quot;),  lty=c(1,2,3,4,5),title=&quot;no. of boxes&quot;,pch=c(-1,-1,-1,-1,-1))  pch=type of symbol }  if (ltt>1)lines(Dl,Distance,lty=ltt)  #numberbox =120, 60, 30, 15 } ode.band(y, times, func, parms, nspec = NULL,  bandup = nspec, banddown = nspec, method = &quot;lsode&quot;, ...) Assumes a banded Jacobian matrix, but does not rearrange the state variables (in contrast to ode.1D).  Suitable for 1-D models that include transport only between adjacent layers and that model only one species.
# Run model with number of different options windows() par (mfrow=c(1,3),oma=c(1,1,4,1),mar=c(5, 4, 4, 2)+0.1,mgp=c(3,1,0))  numboxlist <- c(300,120,60,30,15) for (diffm in c(&quot;back&quot;,&quot;cent&quot;,&quot;fiad&quot;)) { for (ltt in 1:5)  { numboxes<-numboxlist[ltt] Modelfunc(ltt,diffm,numboxes) } }  ttext<-paste(&quot;Luminophore distribution at t = &quot;,round(times[outtime],2),&quot;year&quot;) mtext(outer=TRUE,side=3,ttext,cex=2)
小さい Pe : Centred diff. ( dispersion-donated )、大きい Pe : backward diff. ( advection-donated )に切り替わる。 3つの scheme による計算結果を比較。 Backward  は数値的分散の効果を大きく反映。ボックス数を多くしても。 Centre  ではボックス数が少ない場合に結果がずれる。しかし、これは初期条件の影響もある。ボックス数 30 と 300 では結果がそれほど変わらない。 The Fiadeiro scheme は centre differences  より backward differences に近い( D が低い値なので、 Pe が大きい)。 Backward よりは僅かに良い結果。 dispersion coefficient が増加 又は advection が減少すれば the Feadeiro scheme は centre differences に近づくだろう。  最後に、この場合 centred differences は不安定性を示さなかった。
R-pakage ‘ desolve ‘ にいくつかの numerical method が含まれている。 Function ‘ode’  はこの pakage で最も一般的な numerical integration routine;  連続的な動きをするモデルに対して選択される方法である。不連続な動きをするモデルの場合、いくつかに分けて走らせたほうが良いだろう。
#----------------------# # the model equations: # #----------------------# model<-function(t,state,parameters){  関数 model を定義 with(as.list(c(state,parameters)),{  # unpack the state variables, parameters dD <- -k1*E*D + k2*I dI <-  k1*E*D - k2*I - k3*I*F dE <- -k1*E*D + k2*I + k3*I*F dF <-  - k3*I*F dG <-  k3*I*F list(c(dD,dI,dE,dF,dG))  # the output, packed as a list }) } #-----------------------# # the model parameters: # #-----------------------# parameters<-c(k1=0.01/24,  # parameter values k2=0.1/24, k3=0.1/24)
#-------------------------# # the initial conditions: # 初期濃度  ( D, I, E, F, G) #-------------------------# state  <-c(D=100,  # state variable initial conditions I=10, E=1, F=1, G=0) #----------------------# # RUNNING the model:  # #----------------------# times  <-seq(0,300,0.5)  # time: from 0 to 300 hours, steps of 0.5 hours # integrate the model  require(deSolve)  # package with the integration routine: out <-as.data.frame(ode(state,times,model,parameters)) #------------------------# # PLOTTING model output: # #------------------------# #windows() par(mfrow=c(2,2), oma=c(0,0,3,0))  # set number of plots (mfrow) and margin size (oma) plot (times,out$D,type=&quot;l&quot;,main=&quot;[D]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) plot (times,out$F,type=&quot;l&quot;,main=&quot;[F]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) plot (times,out$E,type=&quot;l&quot;,main=&quot;[E]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) plot (times,out$I,type=&quot;l&quot;,main=&quot;[I]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) mtext(outer=TRUE,side=3,&quot;enzymatic reaction&quot;,cex=1.5) #plot (times,out$sum,type=&quot;l&quot;,col=&quot;red&quot;) ode(y, times, func, parms,  method = c(“lsoda”, “lsode”, “lsodes”, “lsodar”, “vode”, “daspk”, &quot;euler&quot;, &quot;rk4&quot;, &quot;ode23&quot;, &quot;ode45&quot;), ...)
Soetaert, K. and P.M.J. Herman. 2009. A practical guide to ecological modelling using R as a simulation platform. Springer. Output of the enzymatic reaction model
入り江には三種(淡水性、汽水性、海水性)の動物プランクトンが生存する。これらの生物が単に物理的移動によって起こるのか、海水性動物プランクトンは入江で増殖できるのかを調べるためモデル計算を行った。( the dynamics of marine zooplankton in the Scheldt estuary (Soetaert and Herman, 1994). 海水性動物プランクトン( C )の時間変化は川の流れで海に押し出される項、潮の流れで入江に入ってくる項、生物学的効果の項(正味の成長速度定数 g )で表される。 空間は川(ボックス 1 )から海の近く ( ボックス 100) まで (nbox) 分ける。 ボックスの表面積はシグモイド関数型に 4000 ~ 80000m2 へ増加する。境界面積 (IntArea) とボックス中央部の面積 (Area) を算出し、後者からは体積を計算する (Volume) 。
#-----------------------# # the model parameters: # #-----------------------# # the model parameters:  pars  <-  c(riverZoo  = 0.0,  # river zooplankton conc g  =-0.05,  # /day  growth rate meanFlow  = 100*3600*24,  # m3/d, mean river flow ampFlow  = 50*3600*24,  # m3/d, amplitude ( 振幅) phaseFlow = 1.4)  # -  phase of river flow ( 位相) #--------------------------# # Initialising morphology: # #--------------------------# # parameters defining the morphology # cross sectional surface area is a sigmoid function of estuarine distance nbox  <- 100  Length  <- 100000  # m  dx  <- Length/nbox  # m IntDist <- seq(0,by=dx,length.out=nbox+1)  # m Dist  <- seq(dx/2,by=dx,length.out=nbox)  # m ↓ 流路の面積 IntArea <- 4000 + 76000 * IntDist^5 /(IntDist^5+50000^5)  # m2 Area  <- 4000 + 76000 * Dist^5  /(Dist^5+50000^5)  # m2 Volume  <- Area*dx  # m3 #--------------------------# # Transport coefficients:  # #--------------------------# # parameters defining the dispersion coefficients # a linear function of estuarine distance Eriver  <- 0  # m2/d  Esea  <- 350*3600*24  # m2/d  E  <- Eriver + IntDist/Length * Esea  # m2/d  移流定数を一次関数式から求める Estar  <- E * IntArea/dx  # m3/d
#----------------------------------------------------------# # estuarine advective-diffusive transport and growth/decay # #----------------------------------------------------------# require(deSolve) Zootran <-function(t,Zoo,pars) { with (as.list(pars),{ Flow  <- meanFlow+ampFlow*sin(2*pi*t/365+phaseFlow)   波動関数式から流速を求める seaZoo <- approx(fZooTime, fZooConc, xout=t)$y   線形補間により求める海側境界におけるプランクトン密度 Input  <- +Flow * c(riverZoo, Zoo) + -Estar* diff(c(riverZoo, Zoo, seaZoo))   flux divergence equation の A*J dZoo  <- -diff(Input)/Volume + g *Zoo     flux divergence equation ( C=Zoo) list(dZoo) }) }  #-----------------------# # the forcing function: # #-----------------------# # Time and measured value of zooplankton concentration at sea boundary   観測値 fZooTime = c(0, 30,60,90,120,150,180,210,240,270,300,340,367) fZooConc = c(20,25,30,70,150,110, 30, 60, 50, 30, 10, 20, 20)
#----------------------# # RUNNING the model:  # #----------------------# ZOOP  <- rep(0,times=nbox)   反復ボックス 0 ~ 100 の初期値はそれぞれ 0 times <- 1:365   タイムスケール 1~365 (日) out  <- ode.band(times=times,y=ZOOP (初期条件) ,func=Zootran,parms=pars,nspec=1) 1~365 日のタイムスケール、初期状態 (0,…,0 )で関数 Zootran を計算。パラメータは pars を用いる。 解くのは動物プランクトン濃度 (Zoo) に関して。 Ode.band は一次元 reaction-transfer model の積分方法。 #------------------------# # PLOTTING model output: # #------------------------# # Plot zooplankton; first get the data par(oma=c(0,0,3,0))  # set margin size (oma) par(oma=c(0,0,3,0))  # set margin size filled.contour(x=times,y=Dist/1000,z=out [,-1],    コンターの設定 color= terrain.colors,xlab=&quot;time, days&quot;, ylab= &quot;Distance, km&quot;,main=&quot;Zooplankton, mg/m3&quot;) mtext(outer=TRUE,side=3,&quot;Marine Zooplankton in the Scheldt&quot;,cex=1.5)
?
生物は摂取して呼吸し、成長して生産する( the organisms ingest, respire, grow and reproduce. )。摂取速度はサイズが大きくなるに従い線形的に減少し、食糧量にも制限される(半飽和濃度定数 Ksfood で表す)。摂取したほんの一部が同化される。 同化された食物は①増体( increase of biomass )、②生産( reproduction )、③維持管理(基礎代謝) (respiration) に使われる。 Respiration は基礎代謝であり、個体重量に一次依存する。  同化と呼吸の総和が正ならば増体や繁殖に使われている。  生産は個体重量が生産重量 (reproductive weight) を超えてから始まる。生産 ( 卵の生産)に使われる割合は個体重量と共に大きく (hyperbolically) 増加する。最大でも比率は 1 未満である。そうなったら成熟に達していても増体が継続する。  最後に個体重量の変化速度、卵重量、食糧供給量を計算する。後者に関しては培地中の菌体数を考慮する。関数は変化速度と 3 つの変数に回帰する。?  脱皮中はエネルギー消費により生物重量が減少する。重量減少は体長の相対成長関数で、体長は個体重量の相対成長関数である。  脱皮期間中の個体重量の抑制と定期的な移動のためモデルが不連続的に進行する。 Integrator ode  は状態関数の変化に対応できないので必要である。 脱皮段階( TimeMolt )と生物を新しい培地に移す段階( TimeTransfer )の経過をおう。 Integrator はどちらかのイベントが起こるまで進行し( TimeOut )、状態関数は各時間にて積算過程の最終状況を再初期化する。  脱皮するなら個体重量を修正し( function Mouliting を用いて)、卵重量は 0 にする。そうして脱皮中の計算が行われる。  培地の移動に関して、食糧濃度( FoodInMedium )だけが変化し、 Moulting と同様に Transfertime の計算が行われる。
動物プランクトン1個体についてその成長と生産を描くモデル モデルには転移培養実験を組み込んでいる。 生物がボトル内で離れて育てられていることを意味し、決められた日数で決められた個体数が新しい培地に移動する。 モデルでは、生物量は连続的に増加するのではない。温度に依存した脱皮期间、新しい培地への移动は定期的な不连続を成长に及ぼす。
Growth of a Daphnia individual # load package with the integration routine: library(deSolve) #----------------------# # the model equations: # #----------------------# model<-function(t,state,parameters) { with(as.list(c(state)),{  # unpack the state variables # ingestion, size-dependent and food limited 一個体重量あたりの摂取速度はサイズが大きくなるに従い線形的に減少し、食糧量にも制限される WeightFactor <- (IngestWeight-INDWEIGHT)/(IngestWeight-neonateWeight)  MaxIngestion <- maxIngest*WeightFactor  # /day  Ingestion  <- MaxIngestion*INDWEIGHT*FOOD / (FOOD + ksFood) 食糧の制限がかけられた摂取量 Respiration  <- respirationRate * INDWEIGHT  #  ? gC/day   呼吸量   Growth  <- Ingestion*assimilEff – Respiration   成長に使われる量
# Fraction of assimilate allocated to reproduction if (Growth <= 0. | INDWEIGHT<reproductiveWeight) Reproduction <- 0.  生産力は 0 else {  # Fraction of growth allocated to reproduction. WeightRatio  <- reproductiveWeight/INDWEIGHT   個体重量に対する生産量 Reproduction <- maxReproduction * (1. - WeightRatio^2) } # rate of change  dINDWEIGHT <- (1. -Reproduction) * Growth dEGGWEIGHT <-  Reproduction  * Growth dFOOD  <- -Ingestion * numberIndividuals  # the output, packed as a list list(c(dINDWEIGHT, dEGGWEIGHT, dFOOD),  # the rate of change c(Ingestion  = Ingestion,  # the ordinary output variables Respiration  = Respiration, Reproduction = Reproduction)) }) }  # end of model #----------------------# # Moulting weight loss # #----------------------# Moulting  <- function () { with(as.list(c(state)),{  # unpack the state variables # Relationship moulting loss and length refLoss  <-  0.24  # ? gC cLoss  <-  3.1  #- # Weight lost during molts depends allometrically on the organism length INDLength  <- (INDWEIGHT /3.0)^(1/2.6) WeightLoss <- refLoss * INDLength^cLoss return(INDWEIGHT - WeightLoss)  # New weight }) }

More Related Content

Chap. 6(nakagawa)

  • 2. 様々な時間の関数や境界条件を含んだ複雑な微分方程式を Numerical method で解く Numerical Methods ; 時間や空間に関して不連続なステップを連続モデル式に近づけるための 近似 をする。 長所:どんな複雑な問題にも適応できる 問題点:新たな誤差を( numerical errors )を生み出す
  • 3. 多くの Numerical Method の背景となる重要な数学式。 Fig. 6.2 x+h における異なる次数のテイラー展開。 A)0 次近似、 B) 1次近似、 C) 2次近似、 D) 3次近似。
  • 4. Numerical model テイラー展開のある点で切り捨てを行って進行。 この切り捨てにより起こる誤差-> Numerical Error ある method が n 次精度( n 次で切り捨て)->最も大きな各ステップでの切り捨て誤差は h n+1 *何故 Numerical Error を気にするのか? ① エラーは無い方がいい。出来る限り精度の良い結果を得るため。 ② 解の安定性。誤差が打ち消し合う場合と増幅する場合がある。 Fig. 6.3 Numerical Error の例。 A) 始めは小さいが徐々に真値から外れてくる。 B) 近似値が振動する。振動により現実的にはありえない負の値を示すこともある (●)
  • 5. 力学的な微分式の微分段階はタイムステップ ? t (一定でなくてもいい)を用いて Fig. 6.4   Numerical integration method の構成 テイラー式を用いた最も単純な update formula 。 O( ? t) : 切り捨てによる誤差 (i.e. for t =0.01, ? t 2 = 1e ?4 , ? t3=1e?6; whereas for t=1, ? t 2 = ? t n =1) 。 一次精度
  • 6. Euler Integration の例: 単純な algal growth model 二次以降のテイラー級数を切り捨てるため、事実上 ? t の間速度が一定だと仮定->もしそういう場合でなければ精度はあまり良くない( Fig. 6.5A )。  対策としては ? t を小さくすることである。モデルの性質が本当に悪いと、何も変化しない位 ? t を小さくする必要があるかも
  • 7. 積分法の良し悪しのポイント;精度、安定性、速さ、メモリ必要量 ① 精度 離散化誤差(各タイムステップで発生):テイラー展開の結果と比較することで見積もれる。高次の method はタイムステップが進むほど高精度になる。 ② 安定性 連続的な solution points 間における振動増加をもたらす可能性の大きさ。なるべく精度良く安定である方がいい。 ③ スピード 1) タイムステップの数と ? t の取り方、 2)t ~ t+ ? t での関数計算の数 ④ メモリ必要量 繰り返し積分が複雑になればなるほどメモリは多く必要になる。 ← 毎回のタイムステップで記憶しなければいけない情報量の多さ hard-to-integrate type of problems は’ stiff’ sets of equations と言われる。 ← 異なる固有のタイムスケールを持ってモデル化されたプロセスに起きる。 例; dynamics of bacterial population dynamics (time scale: hours~days) + a forcing with a seasonal or year-to-year variation (time scale: months~years) ← ほとんどのコンピュータは速いプロセスに合わせてで計算する
  • 8. 数値解析において常微分方程式の近似解を求める一連の方法。最も良く用いられる 4 次の Runge-Kutta method は各タイムステップ ? t で 4 つの評価を行う。 次の値( C i +1 )は、現在の値( C i )に間隔( ? t )と推定された勾配の積を加えたものである。その勾配は次の 4 つの勾配の重み付け平均で求める。 4 次精度の方法、すなわち全体の切り捨て誤差が ? t 5 のオーダーになる ← ? t 一定
  • 9. ?
  • 10. この方法は 2 つの part で構成されている: ― 実際に積分を行う the stepper routine ― 用いられたステップの良し悪しを判断する a quality routine ? 5th Order Runge-Kutta method ; 4 次 Runge-Kutta 法が持つ構造安定性と flexible time step の正確さを組み合わせている。 ? t に推定される誤差 ? 0 を適用する。 基準エラー ? 1 を二つの Runge-Kutta 近似間の差から見積もる。 1 つは a large step ? t 1 でもう一方は二つの連続的な半分のタイムステップからなる。 4 次 Runge-Kutta 法のように誤差を ? t 5 のオーダーとしてステップサイズを評価する。
  • 11. t+ ? t の値を… t における値を元に算出する (explicit method t+ ? t における値 (implicit method) t と t+ ? t における値を両方とも部分的に含んでいる (Semi-implicit method, the Crank-Nicholson scheme) を元に算出。 これまで述べた方法( explicit method )より精度が低いが、とても安定性がある ? は通常 0.5
  • 12. Method 精度 安定性 メモリ Explicit 一次 ― ― Implicit 一次 良い + Semi-implicit 二次 良い + より大きなタイムステップを用いることができる (n*n) 行列の反転を行う分メモリをくう
  • 13. R model では信頼性と効率性を達成するようなステップサイズを自動的に選ぶ繰り返し積分法 (ode) が利用できる( pakage deSolve )。 より単純な繰り返し積分はスピードに関していくつか問題がある。もし高精度で安定な Euler or 4th order Runge-Kutta method で用いた ? t が出力区間と同じかより大きいとしたら、その method はおそらく良い選択である。 ← fixed time step method によって得られた結果が十分に高精度か確かめる前に ? t が十分に小さいかチェックしなくてはいけない。 <チェック項目> あるタイムステップでまずモデルを走らせる タイムステップを二倍にして二つの run 間での違いを検査する。 もし違いが顕著なら、有意に変化しなくなるまでタイムステップを半分にする。 もし違いが有意でないなら、有意に変化するまでタイムステップを二倍にする。 大事を取るため、十分な精度のタイムステップの半分を用いる。
  • 14. 空間的一次元導関数の数値近似は有限の節目や layer の関数値を計算。 これらの微分には空間での位置の経過を慎重に追わなくてはいけない。特に、濃度、表層、フラックスや距離が ボックスの中心の値 なのか 境界の値 なのか。 Fig. 6.6   空間的導関数は空間定義域を grid cells や boxes の数で再分配することで近似する。位置 (x i ) はボックスの 中心 。 相対的距離はボックスの 中心間 の距離 ( ? x i,i+1 ) かボックスの 長さ ( ? x i, ? x i+1, ) 濃度や密度などは grid cell の 中心の値 フラックスはボックスの 境界 で定義される。
  • 15. First step; flux-gradient form で一般的な反応輸送方程式を立てる。 (g は一次成長速度 ) 各ボックス i に関して Ci はボックス i における濃度、 ? x i はボックス i の厚さ、 Ai はボックス i の中心部表面積、 ? i はボックス i 周りのフラックス勾配を表す。 ボックス i におけるフラックス勾配は次のボックス (i, i+1) と前のボックス (i-1, i) の境界間の違いで定義される:
  • 17. 移流フラックスは単純に濃度と速度を掛け合わせて表される。 境界における移流フラックスは次式のように表される (’ centred difference’ approximation ) ボックス i と i-1 の濃度を反映 -> C i-1 が 0 でも移流フラックスが発生する。そして次のステップで濃度が負になる。これは現実的ではなく、避けるべき。この現象では値が振動し、解が不安定になる。 ボックス i-1 の濃度のみの関数にすることがより安全である( backward approximation )。
  • 18. 1. フラックスとしての境界条件 上部境界フラックスを F として、ボックス 1 における濃度変化の近似式 2. 濃度としての境界条件 境界濃度をフラックスに変更して flux divergence equation を記述する。 3. 濃度の関数となっているフラックスで境界条件を規定 (Robin or evaporation boundary condition)
  • 19. The backward differencing scheme 濃度が負にならず、安定。だが一次精度。-> Taylor 展開の二次以上の項を無視することで発生する 切り捨て誤差 ( numerical dispersion or numerical dissipation ) 実際の現象がシャープな勾配だとしても、なだらかな勾配になることがある。 例)非移動性で一定速度の個体数増加 Fig. 6.7 実際の局所的な分布が、 advection を含んだ growth model を行うと実線のようになだらかな分布を示す。
  • 20. ① ほとんどの場合、移流と拡散項が混合しており、数値的分散 (numerical dispersion) はその他の分散に対してごく小さいと考えられる。このような場合、 the backward numerical scheme は十分な精度であると考えるかもしれない。 ② より複雑な numerical scheme を用いる   数値的分散は Taylor series を高次項まで用いることで抑えられるが、それらの手法は複雑であるため未だにいくつかの問題がある。参考として Gurney and Nisbet (1998) の本が挙げられる。 ③ 大きなボックスに対して特に起こるため、ボックス数を増やす。   しかし、ボックス数を増やせばコンピュータへの負担が大きくなるので限度はある。 ④ 濃度が負になる危険性を無視して centre differences を用いる。   これはある条件下では最善の解決策。空間軸に対して濃度が増加しない限り、負の濃度が算出されることがない。さらに数値的分散はかなり抑えられる。 例)堆積有機物濃度…堆積物の深度が深くなるほど減少する。 -> explicit way の堆積有機物モデルは移流を centre difference を用いて記述する。
  • 21. 異なる scheme における数値的分散の効果を見る。 3 種類の scheme ① backward differences( ? =1) ② centred differences( ? =0.5) ③ a flexible scheme ( the Fiadeiro scheme ) ( ? =Peclet number の関数 ) 同じ大きさのボックスに対して、3つの scheme とも簡単のために一つの方程式でモデル化する。 Pe ( Peclet number); 分散過程における移流の相対的重要性を表す無次元数。
  • 22. require(deSolve)   まず deSolve を読み込む # general parameters times <- c(1/365,10/365,30/365,1/4,1/2,1) # y time at which output is required # General parameters for all runs DD <- 0.1 # cm2/y diffusion coefficient representing bioturbatin u <- 1 # cm/y advection = sedimentation rate init <- 1000 # n.cm-3 initial density in upper layers   上層の初期密度 outtime <- 6 # choose the output time point (as found in 'times') you want to see in the graphs # default outtime=6 will show distribution after 1.0 year # Function to calculate derivatives Lumin <-function(t,LUMIN,parameters)  関数 Lumin の定義 { with (as.list(c(LUMIN,parameters)), { FluxDiff <- -DD*diff(c(LUMIN[1],LUMIN,LUMIN[numboxes]))/delx   拡散フラックス FluxAdv <- u * (sigma * c(0,LUMIN) + (1-sigma) * 移流フラックス   c(0,LUMIN[2:numboxes],LUMIN[numboxes]))   表層、中間、最深層にわける Flux <- FluxDiff + FluxAdv   拡散+移流 dLUMIN <- -diff(Flux)/delx   Flux(i) – Flux(i-1) i=2-numbox list(dLUMIN )   境界におけるフラックス }) }
  • 23. # Function to run the model and produce output Modelfunc <- function(ltt,diffm,numboxes)   関数 Modelfunc の定義 { # complete set of parameters, depending on choices delx <- 3/numboxes # thickness of boxes in cm   ? x :ボックス長 if (diffm==&quot;back&quot;) sigma<-1 if (diffm==“cent”) sigma<-0.5        3パターンの解き方 if (diffm==&quot;fiad&quot;) { if (DD>0) { Pe <- u * delx/DD sigma <- (1 + (1/tanh(Pe) - 1/Pe))/2 } if (DD==0) sigma <- 1 } pars<-as.list(c(          関数 Lumin の [parameters] numboxes = numboxes, delx = delx, sigma = sigma, DD = DD, u = u ))
  • 24. # call    呼び出し state <- c(LUMIN=Ll)   初期値 out <- ode.band(y=state,times,func=Lumin,parms=pars,nspec=1 (the number of *species* (components) in the model) ) # store output Dl <- out[outtime,2:(numboxes+1)] # output Distance <- seq(from=delx/2, by=delx, length.out=numboxes) # distance of box centres from x=0 if (diffm==&quot;back&quot;) ttext<-&quot;Backward Differences“ if (diffm==&quot;cent&quot;) ttext<-&quot;Centered Differences&quot; if (diffm==&quot;fiad&quot;) ttext<-&quot;Fiadeiro Scheme&quot; if (ltt==1){ #numberbox =300 plot(Dl,Distance,xlim=c(0,max(Dl)),ylim=c(numboxes*delx,0),type=&quot;l&quot;, main=ttext,xlab=&quot;Tracer density&quot;,ylab=&quot;Depth (cm)&quot;) legend(200,2, legend=c(&quot;n=300&quot;,&quot;n=120&quot;,&quot;n=60&quot;,&quot;n=30&quot;,&quot;n=15&quot;), lty=c(1,2,3,4,5),title=&quot;no. of boxes&quot;,pch=c(-1,-1,-1,-1,-1)) pch=type of symbol } if (ltt>1)lines(Dl,Distance,lty=ltt) #numberbox =120, 60, 30, 15 } ode.band(y, times, func, parms, nspec = NULL, bandup = nspec, banddown = nspec, method = &quot;lsode&quot;, ...) Assumes a banded Jacobian matrix, but does not rearrange the state variables (in contrast to ode.1D). Suitable for 1-D models that include transport only between adjacent layers and that model only one species.
  • 25. # Run model with number of different options windows() par (mfrow=c(1,3),oma=c(1,1,4,1),mar=c(5, 4, 4, 2)+0.1,mgp=c(3,1,0)) numboxlist <- c(300,120,60,30,15) for (diffm in c(&quot;back&quot;,&quot;cent&quot;,&quot;fiad&quot;)) { for (ltt in 1:5) { numboxes<-numboxlist[ltt] Modelfunc(ltt,diffm,numboxes) } } ttext<-paste(&quot;Luminophore distribution at t = &quot;,round(times[outtime],2),&quot;year&quot;) mtext(outer=TRUE,side=3,ttext,cex=2)
  • 26. 小さい Pe : Centred diff. ( dispersion-donated )、大きい Pe : backward diff. ( advection-donated )に切り替わる。 3つの scheme による計算結果を比較。 Backward は数値的分散の効果を大きく反映。ボックス数を多くしても。 Centre ではボックス数が少ない場合に結果がずれる。しかし、これは初期条件の影響もある。ボックス数 30 と 300 では結果がそれほど変わらない。 The Fiadeiro scheme は centre differences より backward differences に近い( D が低い値なので、 Pe が大きい)。 Backward よりは僅かに良い結果。 dispersion coefficient が増加 又は advection が減少すれば the Feadeiro scheme は centre differences に近づくだろう。  最後に、この場合 centred differences は不安定性を示さなかった。
  • 27. R-pakage ‘ desolve ‘ にいくつかの numerical method が含まれている。 Function ‘ode’ はこの pakage で最も一般的な numerical integration routine; 連続的な動きをするモデルに対して選択される方法である。不連続な動きをするモデルの場合、いくつかに分けて走らせたほうが良いだろう。
  • 28. #----------------------# # the model equations: # #----------------------# model<-function(t,state,parameters){ 関数 model を定義 with(as.list(c(state,parameters)),{ # unpack the state variables, parameters dD <- -k1*E*D + k2*I dI <- k1*E*D - k2*I - k3*I*F dE <- -k1*E*D + k2*I + k3*I*F dF <- - k3*I*F dG <- k3*I*F list(c(dD,dI,dE,dF,dG)) # the output, packed as a list }) } #-----------------------# # the model parameters: # #-----------------------# parameters<-c(k1=0.01/24, # parameter values k2=0.1/24, k3=0.1/24)
  • 29. #-------------------------# # the initial conditions: # 初期濃度  ( D, I, E, F, G) #-------------------------# state <-c(D=100, # state variable initial conditions I=10, E=1, F=1, G=0) #----------------------# # RUNNING the model: # #----------------------# times <-seq(0,300,0.5) # time: from 0 to 300 hours, steps of 0.5 hours # integrate the model require(deSolve) # package with the integration routine: out <-as.data.frame(ode(state,times,model,parameters)) #------------------------# # PLOTTING model output: # #------------------------# #windows() par(mfrow=c(2,2), oma=c(0,0,3,0)) # set number of plots (mfrow) and margin size (oma) plot (times,out$D,type=&quot;l&quot;,main=&quot;[D]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) plot (times,out$F,type=&quot;l&quot;,main=&quot;[F]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) plot (times,out$E,type=&quot;l&quot;,main=&quot;[E]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) plot (times,out$I,type=&quot;l&quot;,main=&quot;[I]&quot;,xlab=&quot;time, hours&quot;,ylab=&quot;mol/m3&quot;,lwd=2) mtext(outer=TRUE,side=3,&quot;enzymatic reaction&quot;,cex=1.5) #plot (times,out$sum,type=&quot;l&quot;,col=&quot;red&quot;) ode(y, times, func, parms, method = c(“lsoda”, “lsode”, “lsodes”, “lsodar”, “vode”, “daspk”, &quot;euler&quot;, &quot;rk4&quot;, &quot;ode23&quot;, &quot;ode45&quot;), ...)
  • 30. Soetaert, K. and P.M.J. Herman. 2009. A practical guide to ecological modelling using R as a simulation platform. Springer. Output of the enzymatic reaction model
  • 31. 入り江には三種(淡水性、汽水性、海水性)の動物プランクトンが生存する。これらの生物が単に物理的移動によって起こるのか、海水性動物プランクトンは入江で増殖できるのかを調べるためモデル計算を行った。( the dynamics of marine zooplankton in the Scheldt estuary (Soetaert and Herman, 1994). 海水性動物プランクトン( C )の時間変化は川の流れで海に押し出される項、潮の流れで入江に入ってくる項、生物学的効果の項(正味の成長速度定数 g )で表される。 空間は川(ボックス 1 )から海の近く ( ボックス 100) まで (nbox) 分ける。 ボックスの表面積はシグモイド関数型に 4000 ~ 80000m2 へ増加する。境界面積 (IntArea) とボックス中央部の面積 (Area) を算出し、後者からは体積を計算する (Volume) 。
  • 32. #-----------------------# # the model parameters: # #-----------------------# # the model parameters: pars <- c(riverZoo = 0.0, # river zooplankton conc g =-0.05, # /day growth rate meanFlow = 100*3600*24, # m3/d, mean river flow ampFlow = 50*3600*24, # m3/d, amplitude ( 振幅) phaseFlow = 1.4) # - phase of river flow ( 位相) #--------------------------# # Initialising morphology: # #--------------------------# # parameters defining the morphology # cross sectional surface area is a sigmoid function of estuarine distance nbox <- 100 Length <- 100000 # m dx <- Length/nbox # m IntDist <- seq(0,by=dx,length.out=nbox+1) # m Dist <- seq(dx/2,by=dx,length.out=nbox) # m ↓ 流路の面積 IntArea <- 4000 + 76000 * IntDist^5 /(IntDist^5+50000^5) # m2 Area <- 4000 + 76000 * Dist^5 /(Dist^5+50000^5) # m2 Volume <- Area*dx # m3 #--------------------------# # Transport coefficients: # #--------------------------# # parameters defining the dispersion coefficients # a linear function of estuarine distance Eriver <- 0 # m2/d Esea <- 350*3600*24 # m2/d E <- Eriver + IntDist/Length * Esea # m2/d 移流定数を一次関数式から求める Estar <- E * IntArea/dx # m3/d
  • 33. #----------------------------------------------------------# # estuarine advective-diffusive transport and growth/decay # #----------------------------------------------------------# require(deSolve) Zootran <-function(t,Zoo,pars) { with (as.list(pars),{ Flow <- meanFlow+ampFlow*sin(2*pi*t/365+phaseFlow)   波動関数式から流速を求める seaZoo <- approx(fZooTime, fZooConc, xout=t)$y   線形補間により求める海側境界におけるプランクトン密度 Input <- +Flow * c(riverZoo, Zoo) + -Estar* diff(c(riverZoo, Zoo, seaZoo))   flux divergence equation の A*J dZoo <- -diff(Input)/Volume + g *Zoo   flux divergence equation ( C=Zoo) list(dZoo) }) } #-----------------------# # the forcing function: # #-----------------------# # Time and measured value of zooplankton concentration at sea boundary   観測値 fZooTime = c(0, 30,60,90,120,150,180,210,240,270,300,340,367) fZooConc = c(20,25,30,70,150,110, 30, 60, 50, 30, 10, 20, 20)
  • 34. #----------------------# # RUNNING the model: # #----------------------# ZOOP <- rep(0,times=nbox)   反復ボックス 0 ~ 100 の初期値はそれぞれ 0 times <- 1:365   タイムスケール 1~365 (日) out <- ode.band(times=times,y=ZOOP (初期条件) ,func=Zootran,parms=pars,nspec=1) 1~365 日のタイムスケール、初期状態 (0,…,0 )で関数 Zootran を計算。パラメータは pars を用いる。 解くのは動物プランクトン濃度 (Zoo) に関して。 Ode.band は一次元 reaction-transfer model の積分方法。 #------------------------# # PLOTTING model output: # #------------------------# # Plot zooplankton; first get the data par(oma=c(0,0,3,0)) # set margin size (oma) par(oma=c(0,0,3,0)) # set margin size filled.contour(x=times,y=Dist/1000,z=out [,-1],    コンターの設定 color= terrain.colors,xlab=&quot;time, days&quot;, ylab= &quot;Distance, km&quot;,main=&quot;Zooplankton, mg/m3&quot;) mtext(outer=TRUE,side=3,&quot;Marine Zooplankton in the Scheldt&quot;,cex=1.5)
  • 35. ?
  • 36. 生物は摂取して呼吸し、成長して生産する( the organisms ingest, respire, grow and reproduce. )。摂取速度はサイズが大きくなるに従い線形的に減少し、食糧量にも制限される(半飽和濃度定数 Ksfood で表す)。摂取したほんの一部が同化される。 同化された食物は①増体( increase of biomass )、②生産( reproduction )、③維持管理(基礎代謝) (respiration) に使われる。 Respiration は基礎代謝であり、個体重量に一次依存する。  同化と呼吸の総和が正ならば増体や繁殖に使われている。  生産は個体重量が生産重量 (reproductive weight) を超えてから始まる。生産 ( 卵の生産)に使われる割合は個体重量と共に大きく (hyperbolically) 増加する。最大でも比率は 1 未満である。そうなったら成熟に達していても増体が継続する。  最後に個体重量の変化速度、卵重量、食糧供給量を計算する。後者に関しては培地中の菌体数を考慮する。関数は変化速度と 3 つの変数に回帰する。?  脱皮中はエネルギー消費により生物重量が減少する。重量減少は体長の相対成長関数で、体長は個体重量の相対成長関数である。  脱皮期間中の個体重量の抑制と定期的な移動のためモデルが不連続的に進行する。 Integrator ode は状態関数の変化に対応できないので必要である。 脱皮段階( TimeMolt )と生物を新しい培地に移す段階( TimeTransfer )の経過をおう。 Integrator はどちらかのイベントが起こるまで進行し( TimeOut )、状態関数は各時間にて積算過程の最終状況を再初期化する。  脱皮するなら個体重量を修正し( function Mouliting を用いて)、卵重量は 0 にする。そうして脱皮中の計算が行われる。  培地の移動に関して、食糧濃度( FoodInMedium )だけが変化し、 Moulting と同様に Transfertime の計算が行われる。
  • 38. Growth of a Daphnia individual # load package with the integration routine: library(deSolve) #----------------------# # the model equations: # #----------------------# model<-function(t,state,parameters) { with(as.list(c(state)),{ # unpack the state variables # ingestion, size-dependent and food limited 一個体重量あたりの摂取速度はサイズが大きくなるに従い線形的に減少し、食糧量にも制限される WeightFactor <- (IngestWeight-INDWEIGHT)/(IngestWeight-neonateWeight) MaxIngestion <- maxIngest*WeightFactor # /day Ingestion <- MaxIngestion*INDWEIGHT*FOOD / (FOOD + ksFood) 食糧の制限がかけられた摂取量 Respiration <- respirationRate * INDWEIGHT # ? gC/day   呼吸量 Growth <- Ingestion*assimilEff – Respiration   成長に使われる量
  • 39. # Fraction of assimilate allocated to reproduction if (Growth <= 0. | INDWEIGHT<reproductiveWeight) Reproduction <- 0. 生産力は 0 else { # Fraction of growth allocated to reproduction. WeightRatio <- reproductiveWeight/INDWEIGHT   個体重量に対する生産量 Reproduction <- maxReproduction * (1. - WeightRatio^2) } # rate of change dINDWEIGHT <- (1. -Reproduction) * Growth dEGGWEIGHT <- Reproduction * Growth dFOOD <- -Ingestion * numberIndividuals # the output, packed as a list list(c(dINDWEIGHT, dEGGWEIGHT, dFOOD), # the rate of change c(Ingestion = Ingestion, # the ordinary output variables Respiration = Respiration, Reproduction = Reproduction)) }) } # end of model #----------------------# # Moulting weight loss # #----------------------# Moulting <- function () { with(as.list(c(state)),{ # unpack the state variables # Relationship moulting loss and length refLoss <- 0.24 # ? gC cLoss <- 3.1 #- # Weight lost during molts depends allometrically on the organism length INDLength <- (INDWEIGHT /3.0)^(1/2.6) WeightLoss <- refLoss * INDLength^cLoss return(INDWEIGHT - WeightLoss) # New weight }) }