我在R中编写了一个数值模型,用于生态系统,并使用" lsoda"来自deSolve包。 我的模型有14个状态变量。 我定义了模型,设置得很好,并根据这个给出持续时间:
nyears<-60
ndays<-nyears*365+1
times<-seq(0,nyears*365,by=1)
状态变量的变化率(例如变量的变化率&#34; A1&#34;&#34; dA1&#34;)根据状态变量的现有值计算(在时间= t)和一组参数。 简化示例:
dA1<-Tf*A1*(ImaxA*p_sub)
其中Tf,ImaxA和p_sub是参数,A1是时间= t的状态变量。
当我解决模型时,我使用像这样的lsoda求解器:
out<-as.data.frame(lsoda(start,times,model,parms))
有时候(取决于我的参数组合),模型运行在我指定的整个持续时间内完成,但有时它会停止标记(仍然让我输出直到解算器&#34;崩溃&#34;) 。当它&#34;崩溃&#34;时,会显示以下消息:
DLSODA- At current T (=R1), MXSTEP (=I1) steps
taken on this call before reaching TOUT
In above message, I1 = 5000
In above message, R1 = 11535.5
Warning messages:
1: In lsoda(start, times, model, parms) :
an excessive amount of work (> maxsteps ) was done, but integration was not successful - increase maxsteps
2: In lsoda(start, times, model, parms) :
Returning early. Results are accurate, as far as they go
当其中一个状态变量呈指数级变大或趋于非常接近于零时,通常会出现这种情况,但有时当看似没有太多变化发生时,它会崩溃。我可能错了,但是由于状态变量的变化率变得太大了吗?如果是这样,为什么它也会崩溃&#34;什么时候没有快速的变化? 有没有办法可以让解算器使用指定的参数值完成任务,可能有更宽松的误差容差?
答案 0 :(得分:1)
谢谢大家的贡献。我查看了一些速率,并且在崩溃时,模型在两个代谢状态之间切换 - 并且这个二进制开关的快速速率导致求解器停止 - 因为变化率太大而拒绝解决方案。我通过引入状态之间的逐渐切换(使用逻辑曲线)而不是这个二进制开关来修复我的模型。我知道我没有提供原始问题的足够信息,所以感谢您提供的帮助!