2017-12-20 13 views
-1

関数式の入力引数にどうしたらよいかわかりません。 2番目の入力をベクターにする必要はありますか?またはIF文が必要ですか?以下は私の現在のコードです。3つの微分方程式を同時にrで解く方法

ti <- 0 
X0 <- .0005 
S0 <- .04 
P0 <- 0 
umax <- .5 
Pmax <- .109 
ks <- .001 
m <- 1 
ms <- .008 
Yh <- 2 
Y <- 1 
tf <- 15 
Z <- c(S, P) 

Keq <- function(X, S, P) { 
    dX <- umax*X*(S/ks+S)*(1-(P/Pmax))^m 
    dS <- -(dX/Y) - (ms*X) 
    dP <- -(dX/Y) - (dX/Yh)+ms*X 
    return(c(dX, dS, dP)) 
} 

Y0 <- c(X0, S0, P0) 

Rx <- ode45(Keq, ti, tf, Y0) 
+0

ようこそ!残念ながら、コードにエラーがあります。変数「S」と「P」は欠落しています。彼らは何ですか? – akraf

+0

彼らは与えられておらず、私はそれらが単に従属変数であると言われました。私は初期値X0、S0、P0しか与えられませんでした。 – Tsolstice

答えて

0

このコードをどのように書くべきかわかりません。たとえば、ode45は、Rまたは私が知っているパッケージには存在しません。文字通りMatlabコードを翻訳していますか?

あなたの質問は不明です。このコードはエラーなしで実行され、の何かが出力されます。がんばろう。

特に、Keqの機能が入力として期待して、出力として返すべきものに関しては、助けになるかもしれません。

P.S. Best Practice guidelinesに続き、Minimal Reproducable Exampleの書き方についてのガイドを読んでいたなら、おそらく2,3時間以内に役立つ回答を得ていたでしょう。


コード:スタックオーバーフローへ

library(deSolve) # if you get an error, run install.packages('deSolve') once 
ti <- 0 
X0 <- .0005 
S0 <- .04 
P0 <- 0 
umax <- .5 
Pmax <- .109 
ks <- .001 
m <- 1 
ms <- .008 
Yh <- 2 
Y <- 1 
tf <- 15 
#Z <- c(S, P) 

Keq <- function(time, state, params) { 
    X <- state[1] 
    S <- state[2] 
    P <- state[3] 
    dX <- umax*X*(S/ks+S)*(1-(P/Pmax))^m 
    dS <- -(dX/Y) - (ms*X) 
    dP <- -(dX/Y) - (dX/Yh)+ms*X 
    return(list(c(dX, dS, dP))) 
} 

Y0 <- c(X0, S0, P0) 

x <- seq(1,100,0.1) 
Rx <- ode(Y0, x, Keq)