以下是要解决的等式:
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。
答案 0 :(得分:2)
我可以重现你的困难,并告诉你我是如何克服它们的。首先,您不希望x
成为这些数据值的名称。您希望将它们分配给其他名称,因为R会选择x
作为curve
和uniroot
的默认形式参数,因此我选择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()
因此,通过查看曲线,您可以看到每个点附近的渐近行为,人们会期望分母中的“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