2017-01-14 8 views
3

私は現在、deSolveを使って常微分方程式の系を解くことに取り組んでおり、微分変数の値がゼロ以下にならないようにする方法があるかどうかは疑問でした。私は、ベクトル、データフレームなどで負の値をゼロに設定することについてのいくつかの記事を見てきましたが、これは生物学的モデルであり(T細胞数が負になるのは意味がありません)、これらの値が最終出力のネガを置き換えるだけでなく、結果を歪ませないように、開始するのをやめさせる必要があります。モデル(ODEシステム)の負の値をゼロに置き換える

+0

パラメータ制約をお探しですか? –

+0

それは助けるかもしれない - 私の主な問題は、パラメータではなく、独立変数とです。たとえば、MATLABの非負関数、またはx [1]が0未満にならないように実装できるコードなどはありますか? – Dorian

答えて

6

私の標準的なアプローチは、状態変数を非拘束スケールに変換することです。正の変数に対してこれを行う最も明白な/標準的な方法は、xではなく、log(x)のダイナミクスの方程式を書き留めることです。式我々はログ(I)する場合、我々は単純

gfun <- function(time, y, params) { 
    g <- with(as.list(c(y,params)), 
     c(-beta*S*I, 
      beta*S*I-gamma*I, 
      gamma*I) 
     ) 
    return(list(g)) 
} 

として勾配関数を記述しdS/dt = -beta*S*I; dI/dt = beta*S*I-gamma*I; dR/dt = gamma*Iある感染症の流行のための感受性、感染、回復(SIR)モデルと例えば

、私は状態変数ではなく(原則としてSでもこれを行うことができますが、実際にはSは境界に近づきにくい)、次にd(log(I))/dt = (dI/dt)/I = beta-gammaがあります。残りの方程式は、Iを参照するためにexp(logI)を使用する必要があります。したがって:

gfun_log <- function(time, y, params) { 
    g <- with(as.list(c(y,params)), 
     c(-beta*S*exp(logI), 
      beta-gamma, 
      gamma*exp(logI)) 
     ) 
    return(list(g)) 
} 
1

実際に値が負にならないが、モデルで負にならない場合は、モデルを変更するか、微分方程式を変更してこれが不可能であるようにする必要があります。他の言葉で:あなたのダイナミクス変数は派生しないでください。他のすべては、ソルバーの問題につながりますが、微分方程式の変更は気にしないでください。もし(Y)F一次元微分方程式Y =を有する

  • Yは、
  • 負なってはならないと仮定簡単例えば

  • あなたの最初のyは肯定的です。この場合

場合、Yのみ fが負になることができる(0)< 0したがって、あなたがしなければならないすべては、Fよう F(0)≥0それを修正することです(それはまだ滑らかです)。

1fに適切に変更されたsigmoid function(これは滑らかな機能ですべての論理演算を構成することができます)を掛けることができます。この方法では、ほとんどの値がyのに変更されず、yが0に近い場合、つまり、とにかく操作する場合にのみ、微分方程式が変更されます。

しかし、あなたのモデルを考えずにシグモイドを使用することをお勧めしません。あなたのモデルがy = 0の近くで完全に間違っている場合は、近くの値が既に役に立たない可能性が非常に高いです。あなたのシミュレーションがこの地形でのベンチャーであり、結果を意味のあるものにしたい場合は、これを修正する必要があります。

+0

残念ながら、私は変数が互いに相互作用するので、これが可能だとは思わない。例えば、特定の細胞タイプから得られるウイルス負荷の式は、dVB < - (k_b * x [7]) - (d_vb * x [1])であり、ここでk_b =ウイルス放出速度、x [7] =感染d_vb =ウイルス死亡率、x [1] =ウイルス量。私は無知である可能性がありますが、ある点の後で0未満にならないようにこれらの方程式を書き直す方法はありません(この場合、溶解感染細胞がなくなると)私がそれを防ぐために置くことができる制約です。 – Dorian

+0

@Dorian:相互作用する変数に対しても、このような制約を確実に実装できます。シグモイドを使用すると、すべての論理演算を実装できます。しかし、あなたが私のモデルを改善するならば、より確からしい方法があるでしょう。あなたのモデルが0で偽であれば、ほぼ確実に0に近い偽物なので、あなたの結果は役に立たないかもしれないので、これを検討することを強くお勧めします。私の編集も見てください。 – Wrzlprmft

+0

@Dorian:あなたのモデルを正しく理解していれば、dVBはx [1]の時間微分(すなわち、ẋ[1])であり、k_b、x [7]、およびd_vbは常に正です。したがって、方程式はx [1] = 0の場合、自動的に負でないdVB =ẋ[1]を持つため、x [1]が負にならないようにしています。したがって、あなたのモデルは、問題の問題を既に回避しています。 – Wrzlprmft

関連する問題