我想更详细地分析对数增长曲线。特别是我想知道当斜率变为> 0(这是滞后阶段之后的增长起点)时的时间点。 因此,我使用R的grofit包为我的生长数据拟合了一个对数函数。我得到了三个参数的值(lambda,mu,maximal assymptote)。 现在我想,我可以使用对数增长函数的一阶导数来设置mu = 0(生长期间任何时间点的斜率),这样就可以求解时间(x)的等式。我不确定这是否可行,因为mu = 0在曲线开始时的较长时间范围内是正确的(并且没有唯一的时间点)。但也许我可以通过设mu = 0.01来近似于那一点。这应该更具体。 无论如何,我使用Deriv包来找到对数函数的一阶导数:
Deriv(a /(1 + exp(((4 * b)/ a)*(c-x)+2)),“x”)
其中a = assymptote,b =最大斜率,c = lambda。
结果我得到了:
{。e2< - exp(2 + 4 *(b *(c - x)/ a))
4 * (.e2 * b/(.e2 + 1)^2)}
或者在正常的写作中:
F'(X)=(4 * EXP(2 +((4B(CX))/ A))* B)/((EXP(2 +((4B(CX))/ A))+ 1 )^ 2)
现在我想用f'(x)= 0.01解决x的这个函数。任何人都可以告诉我,如何做到最好?
另外,您对我的思维方式或我使用的R函数有什么评论吗?
谢谢。 安
答案 0 :(得分:1)
使用根求解函数比使用优化函数更合适。 我举两个包的例子。
为一系列值绘制函数也是一个好主意。 像这样:
curve(fn,-.1,.1)
您可以看到使用基本R函数uniroot
会出现问题,因为它需要在间隔的端点处的函数值具有相反的符号。
使用像这样的包nleqslv
library(nleqslv)
nleqslv(1,fn)
给出
$x
[1] 0.003388598
$fvec
[1] 8.293101e-10
$termcd
[1] 1
$message
[1] "Function criterion near zero"
<more info> ......
使用包fsolve
pracma
library(pracma)
fsolve(fn,1)
给出
$x
[1] 0.003388585
$fval
[1] 3.136539e-10
两个软件包给出的解决方案彼此非常接近。
答案 1 :(得分:0)
可能不是最好的方法,但您可以使用optim
函数来查找解决方案。检查下面的代码,我基本上试图找到最小化abs(f(x) - 0.01)
x的起始种子值可能很重要,optim
函数可能不会收敛某些种子。
fn <- function(x){
a <- 1
b<- 1
c <- 1
return( abs((4*exp(2+((4*b*(c-x))/a))*b)/ ((exp(2+((4*b*(c-x))/a))+1)^2) - 0.01) )
}
x <- optim(10,fn)
x$par
答案 2 :(得分:0)
非常感谢您的努力。不幸的是,上述解决方案都不适合我:-( 我用老式的方式解决问题(铅笔+纸+数学书)。 祝你有美好的一天 安