为正态分布函数求解并找到x

时间:2014-02-06 02:49:06

标签: r quadratic

我正在尝试解决方程并从中找到x的值。我正在使用以下代码:

mu1 = 0
mu2 = 1
sigma1 = 0.5
sigma2 = 0.6
prior1 = 0.3
prior2 = 0.7

boundary = function(x) {
  return(( 1 / sqrt(2 * pi * sigma1)) * exp(-0.5 * ((x - mu1) / sigma1)^2)*prior1) - 
    ((1 / sqrt(2 * pi * sigma2)) * exp(-0.5 * ((x - mu2) / sigma2)^2)*prior2)
}
uniroot(boundary, c(-1e+05, 1e+07))

这不能给我正确的答案。我对R很新,我不确定uniroot到底是怎么运作的。

  • 有没有更好的方法来解决这个等式?
  • 是否有任何可用的解决方案(类似于MATLAB的solve()函数)?

1 个答案:

答案 0 :(得分:2)

您可以使用内置的dnorm()功能缩短代码(并尽量减少拼写错误的可能性):

curve(dnorm(x,mean=0,sd=0.5),from=-4,to=4)
curve(dnorm(x,mean=0,sd=0.6),add=TRUE,col=2)

如果我在合理的范围内尝试uniroot(),我会得到合理的答案:

uniroot(function(x) dnorm(x,0,0.5)-dnorm(x,0,0.6), c(0,5))  ## 0.546
uniroot(function(x) dnorm(x,0,0.5)-dnorm(x,0,0.6), c(-5,0)) ## -0.546

如果我尝试从巨大的值开始,计算将会下溢(无论是手动还是使用dnorm();高斯低于R的最小可表示的有价值(见?.Machine) 19和20。

dnorm(19,0,0.5)  ## 2e-314
dnorm(20,0,0.5)  ## 0

在某些情况下,你可以使用log=TRUE中的dnorm()来计算对数概率,而不是在计算中使用它,但是在这里(如许多贝叶斯计算中)你有点卡住,因为你必须减去结果。