Как решить систему алгебраических уравнений внутри системы pde? - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь решить стационарную 1D модель с помощью пакета R «rootSolve». Это система PDE. Существуют 3 глобальные переменные, которые необходимо заранее решить из системы алгебраических уравнений, а затем участвовать в вычислении других переменных.

Я попытался включить алгебраическое уравнение в функцию модели с функцией «multiroot», а затем решить всю модель с помощью «stable.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 () независимо, это работает. Но когда я пытаюсь решить всю модель с помощью устойчивых 1D (), иногда получаю эту ошибку:

Ошибка в stode (y, times, func, parms = parms, ...): функция модели должна возвращатьсписок значений, из которых первый элемент имеет длину = длина y

, а иногда Rstudio даже преуменьшает значение «R сессия прервана».

Подходит ли включение системы алгебраических уравнений внутрисистема PDE? Или есть какой-нибудь подход к этой проблеме?

Заранее спасибо.

...