【发布时间】:2016-03-21 15:47:53
【问题描述】:
我在 R 中有一个简单的通量模型。它归结为两个微分方程,对模型中的两个状态变量进行建模,我们称它们为 A 和 B。它们被计算为四个分量通量flux1-flux4、5 个参数p1-p5 和第6 个参数of_interest 的简单差分方程,其值可以在0-1 之间。
parameters<- c(p1=0.028, p2=0.3, p3=0.5, p4=0.0002, p5=0.001, of_interest=0.1)
state <- c(A=28, B=1.4)
model<-function(t,state,parameters){
with(as.list(c(state,parameters)),{
#fluxes
flux1 = (1-of_interest) * p1*(B / (p2 + B))*p3
flux2 = p4* A #microbial death
flux3 = of_interest * p1*(B / (p2 + B))*p3
flux4 = p5* B
#differential equations of component fluxes
dAdt<- flux1 - flux2
dBdt<- flux3 - flux4
list(c(dAdt,dBdt))
})
我想写一个函数来取dAdt 对of_interest 的导数,将导出的方程设置为0,然后重新排列并求解of_interest 的值。这将是最大化函数dAdt 的参数of_interest 的值。
到目前为止,我已经能够在稳定状态下求解模型,跨越of_interest 的可能值,以证明应该有一个最大值。
require(rootSolve)
range<- seq(0,1,by=0.01)
for(i in range){
of_interest=i
parameters<- c(p1=0.028, p2=0.3, p3=0.5, p4=0.0002, p5=0.001, of_interest=of_interest)
state <- c(A=28, B=1.4)
ST<- stode(y=y,func=model,parms=parameters,pos=T)
out<- c(out,ST$y[1])
然后绘图:
plot(out~range, pch=16,col='purple')
lines(smooth.spline(out~range,spar=0.35), lwd=3,lty=1)
我如何分析求解在 R 中最大化 dAdt 的 of_interest 的值?如果解析解是不可能的,我怎么知道,以及如何通过数值求解?
更新:我认为这个问题可以通过 R 中的 deSolve 包解决,链接 here,但是我无法使用我的特定示例来实现它。
【问题讨论】:
-
您的模型似乎是 t 的函数,函数中的变量在哪里? dAdt 似乎在 of_interest 中也是线性的,这使得最大的惊喜。另外,什么是“出”?这是从哪里来的?
-
@Shape
t是一个时间步长,很抱歉漏掉了这个。这是因为模型会不断迭代直到达到稳定状态。out只是一个用于保存状态变量的向量,因此我可以通过时间绘制它们。stode代码块中的out是一个向量,用于存储函数在of_interest的各个级别上的稳定状态,以便绘制它们。我不知道该说什么,有一个最大值的事实令人惊讶。我已经绘制了输出,显然有一个最大值。 -
我很抱歉,你说的很对,看看这个:link 。这显然是可以解决的(在我担心会丢东西后,我切换到了 wolfram)。所以基本上,你想要最后一个怪物的 a 依赖
-
@Shape 这对于真正让它通过 wolfram/mathematica 运行非常有帮助,谢谢!我真正想要的是一种在 R 中解决这个问题的方法。
-
如果你想要一个程序来分析解决它,我认为 R 是不适合这项工作的工具。如果您需要免费工具,Octave 将是您的最佳选择。
标签: r optimization differential-equations calculus maximization