2016-10-13 5 views
0

Я пытаюсь использовать пакет deSolve для набора ODE с уравнениями в качестве вспомогательных переменных. Я продолжаю получать ошибку, когда число производных не совпадает с вектором начальных условий. Что я должен изменить?Решение ODE с deSolve в R-числе ошибок производных

# rm(list=ls()) 
library(deSolve) 

exponential=function(t,state,parameters){ with(as.list(c(state,parameters)), { 

    #Aux. Var. 
    fX2 = pmax(0,1-(1-(d2/r12)*(X2/K2))) 
    fX1 = X1/(X1+k1); 

    # equations (ODE) 
    dX1 = C-((d1)*(X1))-(r12)*(X2)*fX2*fX1 # differential equaion 
    dX2 = r12*(X2)*fX2*fX1-((d2)*(X2)) 

    return(list(c(dX1, dX2))) 
    }) 
} 

# -- RUN INFORMATION 

# Set Initial Values and Simulation Time 
state = c(X1=2,X2=0.01,K2= 10) 
times=0:100 

# Assign Parameter Values 
parameters = c(d1=0.001, d2=0.008, r12=0.3,C=0.5,k1= 0.001) 

for (i in 1:length(times)){ 
    out= ode(y=state,times=times,func=exponential,parms=parameters) 
    } 

Error in checkFunc(Func2, times, y, rho) : 
    The number of derivatives returned by func() (2) must equal the length of 
the initial conditions vector (3)** 

ответ

1

ошибка происходит от return в вашей определенной функции: Ваш входной параметр y имеет длину 3, но возвращать только 2 значения обратно, это ошибка. Вы можете решить вашу проблему с

return(list(c(X1, X2, K2))) 

Другая возможность состоит в том, чтобы принять K2 с параметрами, то ваш старый return был прав. Вы должны решить, является ли K2 переменной или параметром.

И BTW: Почему цикл for с временем? На мой взгляд, это не обязательно, потому что ОДУ решаются в интервале времени, который вы отправили в функцию ode.

out= ode(y=state,times=times,func=exponential,parms=parameters)