我正在尝试使用R包“ rootSolve”求解稳态1D模型。这是一个PDE系统。需要先从代数方程组中解出3个全局变量,然后参与其他变量的计算。
我试图将代数方程包含在具有“ multiroot”函数的模型的函数中,然后使用“ steady.1D”求解整个模型。
PMECmodel<- function(time=0,State,parms)
{
PinS<-State[1]
AinS<-State[2]
FinS<-State[3]
HinS<-State[4]
MinS<-State[5]
PinB<-State[6:(N+5)]
AinB<-State[(N+6):(2*N+5)]
FinB<-State[(2*N+6):(3*N+5)]
HinB<-State[(3*N+6):(4*N+5)]
X_F<-State[4*N+6]
X_A<-State[4*N+7]
X_M<-State[4*N+8]
X_E<-State[4*N+9]
...
# equation system of j, eta and qinB
ebalance<-function(x){
F1<-E_anode-Lf*x[1]/kbio/4-E_KA[9]-x[4]
F2<-E_anode-Lf*x[2]/kbio/4-E_KA[8]-x[5]
F3<-E_anode-Lf*x[3]/kbio/4-E_KA[7]-x[6]
F4<-3.36*10^3*X_E*(1-fs0[9])*x[7]*Lf-x[1]
F5<-3.36*10^3*X_E*(1-fs0[8])*x[8]*Lf-x[2]
F6<-3.36*10^3*X_E*(1-fs0[7])*x[9]*Lf-x[3]
F7<-qmax[9]*mean(AinB)/(mean(AinB)+Ks[9])*(1-fs0[9])*(1/(1+exp(-F*x[4]/R/T)))-x[7]
F8<-qmax[8]*mean(FinB)/(mean(FinB)+Ks[8])*(1-fs0[8])*(1/(1+exp(-F*x[5]/R/T)))-x[8]
F9<-qmax[7]*mean(HinB)/(mean(HinB)+Ks[7])*(1-fs0[7])*(1/(1+exp(-F*x[6]/R/T)))-x[9]
c(F1=F1,F2=F2,F3=F3,F4=F4,F5=F5,F6=F6,F7=F7,F8=F8,F9=F9)}
x<-seq(0,0.1,length.out=9)
sol_e<-multiroot(f=ebalance,start=x)
j_a<-sol_e$root[1]
j_f<-sol_e$root[2]
j_h<-sol_e$root[3]
eta_a<-sol_e$root[4]
eta_f<-sol_e$root[5]
eta_h<-sol_e$root[6]
qinB_a<-sol_e$root[7]
qinB_f<-sol_e$root[8]
qinB_h<-sol_e$root[9]
...
#rate of change of state variables
dPinS<- -X_F*qinS[1]-X_F*qinS[2]-As*Dp[1]/(24*L)*(PinS-PinB[N])
dAinS<- -X_M*qinS[6]+(1-Y[1])*qinS[1]*f_pa1*X_F+(1-Y[2])*qinS[2]*f_pa2*X_F+(1-Y[3])*qinS[3]*f_ha*X_A+(1-Y[4])*qinS[4]*f_fa*X_A-As*Dp[6]/(24*L)*(AinS-AinB[N])
dFinS<- -X_A*qinS[4]+(1-Y[2])*qinS[2]*f_pf*X_F-As*Dp[4]/(24*L)*(FinS-FinB[N])
dHinS<- -X_A*qinS[3]-X_A*qinS[5]+(1-Y[1])*qinS[1]*f_ph*X_F+Y_h2*sum(c(j_a,j_f,j_h))*As/F-As*Dp[3]/(24*L)*(HinS-HinB[N])
dMinS<- -X_M*qinS[5]-X_M*qinS[6]
dPinB<- diff(MassFlux_p)/thick
dAinB<- -X_E*qinB_a+diff(MassFlux_a)/thick
dFinB<- -X_E*qinB_f+diff(MassFlux_f)/thick
dHinB<- -X_E*qinB_h+diff(MassFlux_h)/thick
dX_F<- Y[1]*qinS[1]+Y[2]*qinS[2]-b_ina[1]/24*X_F
dX_A<- Y[3]*qinS[3]+Y[4]*qinS[4]-b_ina[3]/24*X_A
dX_M<- Y[5]*qinS[5]+Y[6]*qinS[6]-b_ina[5]/24*X_M
dX_E<- sum(Y[7:9]*c(qinB_h,qinB_f,qinB_a))-b_ina[7]/24*X_E-b_res[7]/24*X_E*(1/(1+exp(-F*mean(c(eta_a,eta_f,eta_h))/R/T)))
return(list(c(dPinS,dAinS,dFinS,dHinS,dMinS,dPinB,dAinB,dFinB,dHinB,dX_F,dX_A,dX_M,dX_E),
j_a=j_a,j_f=j_f,j_h=j_h,
eta_a=eta_a,eta_f=eta_f,eta_h=eta_h,
qinB_a=qinB_a,qinB_f=qinB_f,qinB_h=qinB_h,qinS=qinS,
MassFlux_p=MassFlux_p,MassFlux_a=MassFlux_a,MassFlux_f=MassFlux_f,MassFlux_h=MassFlux_h))
}
当我独立运行代数方程和multiroot()时,它可以工作。但是,当我尝试用steady.1D()求解整个模型时,有时会出现此错误:
stode中的错误(y,times,func,parms = parms,...): 模型函数必须返回一个值列表,其中第一个元素的长度= y的长度
有时Rstudio甚至因“ R session Aborted”而感到沮丧。
在PDE系统内部包括算法方程式系统是否合适?还是有解决这个问题的方法?
谢谢。