如何找到方程等于零的位置

时间:2015-03-27 19:19:11

标签: r

假设我有一个功能,我发现这样的二阶导数:

xyr <- D(expression(14252/(1+exp((-1/274.5315)*(x-893)))), 'x')

D2 <- D(xyr, 'x')

它让我回归,类型'语言':

-(14252 * (exp((-1/274.5315) * (x - 893)) * (-1/274.5315) * (-1/274.5315))/(1 + 
    exp((-1/274.5315) * (x - 893)))^2 - 14252 * (exp((-1/274.5315) * 
    (x - 893)) * (-1/274.5315)) * (2 * (exp((-1/274.5315) * (x - 
    893)) * (-1/274.5315) * (1 + exp((-1/274.5315) * (x - 893)))))/((1 + 
    exp((-1/274.5315) * (x - 893)))^2)^2)

如何找到等于0的位置?

2 个答案:

答案 0 :(得分:6)

使用图形/解算器有点笨拙,因为你的初始函数形式如下:

f(x) = c / ( 1 + exp(ax+b) )

您派生两次并求解f''(x) = 0

f''(x) = c * a^2 * exp(ax+b) * (1+exp(ax+b)) * [-1 + exp(ax+b)] / ((1+exp(ax+b))^3)

这相当于分子等于0 - 因为acexp()1+exp()总是正数,唯一可以相等的术语零是:

exp(ax+b) - 1 = 0

所以:

x = -b/a

此处a =-1/274.5315b=a*(-893)。所以x=893

只是数学;)

++:

  • 从应用数学家的角度来看,与使用求解器或优化相比,闭合形式/半封闭形式解决方案总是更好。你获得了速度和准确性。
  • 从pur数学家的角度来看,它更优雅!

答案 1 :(得分:3)

您可以在使用衍生表达式创建函数后使用uniroot

f = function(x) eval(D2)
uniroot(f,c(0,1000))  # The second argument is the interval over which you want to search roots.

#Result:
#$root
#[1] 893

#$f.root
#[1] -2.203307e-13

#$iter
#[1] 7

#$init.it
#[1] NA

#$estim.prec
#[1] 6.103516e-05