“uniroot”不起作用

时间:2015-12-03 17:41:52

标签: r sum equation-solving

以下是要解决的等式:

sum( (x-miu)/(1+l*(x-miu)) ) == 0

x是向量

x<- c(0.490239414, -0.041047069, -0.062440582, -0.020759616, -0.084667527,  0.006101447,  0.985401602, -0.665158752,  0.153003354,  0.515112122)

miu=0.1 

我尝试使用“uniroot”

a<-uniroot(function(l){sum((x-miu)/(1+l*(x-miu)))},c(-20,20))$root

我发现“a”是8.280825。但是,当我想用​​l代替l进行检查时,我找到了

sum((x-miu)/(1+a*(x-miu))) 

是-11257.84,而不是0。

1 个答案:

答案 0 :(得分:2)

我可以重现你的困难,并告诉你我是如何克服它们的。首先,您不希望x成为这些数据值的名称。您希望将它们分配给其他名称,因为R会选择x作为curveuniroot的默认形式参数,因此我选择x转换l 1}}并进一步使其成为ll,因为字母l与数字1非常相似所以:

ll<- c(0.490239414, -0.041047069, -0.062440582, -0.020759616, -0.084667527,  0.006101447,  0.985401602, -0.665158752,  0.153003354,  0.515112122)
miu=0.1

我试图用初始失败绘制函数:

curve(function(x){sum((ll-miu)/(1+ll*(x-miu)))}, -20,20)
Error in curve(function(x) { : 
  'expr' did not evaluate to an object of length 'n'

由于sum函数未“向量化”,因此问题顶部的数学表达式未被评估为求和。所以我决定使用Vectorize函数来创建一个函数,它的行为方式与我们计算(或至少用于绘图)的目的一样:

Vfunc <- Vectorize( function(x){sum((ll-miu)/(1+x*(ll-miu)))} )
png(); curve(Vfunc, -20,20); abline(h=0, lty=3, col="red"); dev.off()  

enter image description here

因此,通过查看曲线,您可以看到每个点附近的渐近行为,人们会期望分母中的“ll”值在(1+x*(ll-miu) == 0的解中创建简并,因此决定在非简并区间内寻求解决方案的适当范围。

> Vfunc(-15)
[1] -0.2580872   # Ooops, not far enough to the left, try another point.
> Vfunc(-18)
[1] 0.7168581  # better
> uniroot(Vfunc, c(-18,-5) )   
$root
[1] -16.72707

$f.root
[1] -3.477722e-06

$iter
[1] 7

$init.it
[1] NA

$estim.prec
[1] 6.103516e-05

> png(); curve(Vfunc, -20,20); abline(h=0, lty=3, col="red"); abline(v= -16.72707, col="blue"); dev.off()

> Vfunc(-16.72707)
[1] -4.13423e-06

enter image description here