2016-06-15 6 views
1

私はODEと協力しており、rk(x, times1, func1, parms)rk(x, times2, func2, parms)を20回積み重ねる(更新する)ので、新しい実行は前の実行の結果から始まります。前もって感謝します!ここでODE:タイムライン内の2つの代替関数

require(deSolve) 
func1 <- function(t, x, parms) { 
    with(as.list(c(parms, x)),{ 

    drN = k*(No-N) - (Np+Tp) + r*(Np+Tp) 
    drNp = L1*Np - r*Np - (s+k)*Np 
    drTp = L2*Tp - r*Tp - (s+k)*Tp 
    res <- c(drN, drNp, drTp) 
    list(res) 
    }) 
} 

func2 <- function(t, x, parms) { 
    with(as.list(c(parms, x)),{ 

    drN = k*(No-N) - (Np+Tp) + r*(Np+Tp) + 1 
    drNp = L1*Np - r*Np - (s+k)*Np + 1 
    drTp = L2*Tp - r*Tp - (s+k)*Tp + 1 
    res <- c(drN, drNp, drTp) + 1 
    list(res) 
    }) 
} 

times1 <- seq(0, 200, length = 200) 
times2 <- seq(0, 20, length = 200) 

parms <- c(L1=0.4, L2=0.3, No=1.3, k=0.5, r=0.3, s=0.2) 
x <- c(N = 0.4, Np = 0.01, Tp = 0.01) 


out <- rk(x, times1, func1, parms) + rk(x, times2, func2, parms) + 
    rk(x, times1, func1, parms) + rk(x, times2, func2, parms) + 
    rk(x, times1, func1, parms) + rk(x, times2, func2, parms) + 
    rk(x, times1, func1, parms) + rk(x, times2, func2, parms) #this is what I tried, but failed 


plot (out) 
+0

私はポイントを得ることはありません。 'rk(x、times1、func1、parms)'と 'rk(x、times2、func2、parms)'を20回実行することができ、常に同じ結果になります。 各実行後に状態変数 'x'を更新しますか? もしそうでなければ 'rk(...)'の1つに20を乗じることができます( 'times1'と' times2'の場合) –

+0

こんにちは!私は状態変数を累積(更新)するので、それぞれの新しい実行が以前の実行の結果で始まるようにrk(x、times1、func1、parms)とrk(x、times2、func2、parms)を20回交互にしたい。 – kumbu

+0

これはあなたのコードに関与していない! –

答えて

0

は私の迅速な解決策ではなく、エレガントですが、作業:

out_list <- list() 
combined <- matrix(data = c(0,0,0,0), ncol = 4) 
time_sum <- 0 

for(i in seq(1,20,2)){ 

    out1 <- rk(x, times1, func1, parms) 

    out_list[[i]] <- out1 
    x <- out1[200,2:4] 

    ## sum up timeline 
    time_sum <- c(time_sum, time_sum[length(time_sum)]+out1[,"time"]) 

    out2 <- rk(x, times2, func2, parms) 

    out_list[[i+1]] <- out2 
    x <- out2[200,2:4] 

    ## sum up timeline 
    time_sum <- c(time_sum, time_sum[length(time_sum)]+out2[,"time"]) 

    ## combine both ODEs 
    combined <- rbind(combined, rbind(out1, out2)) 

} 

## remove first column and "time" from combined matrix 
combined <- combined[-1,] 
time_sum <- time_sum[-1] 

## plot ---- 
matplot(time_sum,combined[,2:4], type = "l") 

よろしく、
J_F

関連する問題