Разрешить ODE в R - изменение переменной во времени - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь получить систему ODE, в которой переменная (FA2) меняется с через каждый временной шаг для работы.У меня есть следующий код.

Примечание: FA2 определяется как FA2 = b + a * i и не может быть больше 90

Функция модели:

model <- function(times, y, pars) {
  with(as.list(c(pars, y)), {
    # set up vector of FA2 values   
    FA2_1=c()
    for (i in 1:90){
      FA2_1[i]=b+i*a
    }
    FA2_1=c(b,FA2_1)
 # make ifelse statement   
    FA=ifelse(FA2_1>=90,90,FA2_1)
    FA2=c()
     for (i in 1:length(times)){
      FA2[i]=ifelse(times[i]>TR,FA[i],FA[1])
    }

# the ode system
dS <- -k1*S-(1/T1s)*S-S*(1-cos(FA1*pi/180))/TR 
dP <-  k1*S-(1/T1p)*P-P*(1-cos(FA2*pi/180))/TR 

list(c(dS,dP))
  })
}

y = c(S = 1 ,P=0) # initial values

parms=c(k1=0.016,T1p=57,T1s=36) # pars

times=c(0,2,4,6,8,10) # time vector

a=1 # can be any positive value this is just an example
b=12 # can be any positive value this is just an example
TR=2 # can be any positive value
FA1=1 # cen be any positive value

Output :

  out1=ode(y, times, model,parms)
    out1=data.frame(out1)

В настоящий момент проблема заключается в том, что решатель игнорирует различные значения FA2 из оператора ifelse и просто выбирает первый элемент FA2[1]=12из вектора FA2.

Я пытался просто дать функции оператор

FA2=ifelse(times>=2,FA[2],FA[1])

вместо оператора, объявленного в функции, как:

FA2=c()
   for (i in 1:length(times)){
          FA2[i]=ifelse(times[i]>TR,FA[i],FA[1])
        }

и маленький ifelse оператор без цикла, кажется, заставляет решатель реагировать на изменение значений a.однако мне нужно больше, чем просто первое значение вектора FA, когда временные шаги меняются.У кого-нибудь есть идеи, как решить эту проблему?

...