我的起始值有什么问题

时间:2016-05-31 17:05:19

标签: r

我在R中使用nleqslv包来解决非线性方程组。 R代码如下:

require(nleqslv)

x <- c(6,12,18,24,30)

NMfun1 <- function(k,n) {
     y <- rep(NA, length(k))

     y[1] <- -(5/k[1])+sum(x^k[2]*exp(k[3]*x))+2*sum(k[4]*x^k[2]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x))))

     y[2] <- -sum(log(x))-sum(1/(k[2]+k[3]*x))+sum(k[1]*x^k[2]*exp(k[3]*x)*log(x))+2*sum(k[1]*k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)*log(x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x))))

     y[3] <- -sum(x/(k[2]+k[3]*x))+sum(k[1]*x^(k[2]+1)*exp(k[3]*x))-sum(x)+2*sum(k[4]*x^k[2]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x))))

     y[4] <- -(5/(1-k[4]))+2*sum(exp(-k[1]*x^k[2]*exp(k[3]*x))/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x))))

     return(y)

}

kstart <- c(0.05, 0, 0.35, 0.9)

NMfun1(kstart)

nleqslv(kstart, NMfun1, control=list(btol=.0001),method="Newton")

获得的k的估计值是; 0.04223362 -0.08360564 0.14216026 0.37854908 但是k的估计值是  大于零。

1 个答案:

答案 0 :(得分:2)

确定。因此,如果当然存在,你想要真正大于0的解决方案。 创建一个新函数,在将输入参数传递给NMfun1之前对其进行平方。然后使用包searchZeros中的nleqslv函数来搜索解决方案。喜欢这个

NMfun1.alt <- function(k0,n) NMfun1(k0^2,n)

3 use set.seed for reproducibility
set.seed(413)

# generate 100 random starting values
xstart <- matrix(runif(4*100,min=0,max=1), nrow=100,ncol=4)
z <- searchZeros(xstart,NMfun1.alt)
z
ksol <- z$x^2
ksol

# in this case there are two solutions
NMfun1(ksol[1,])
NMfun1(ksol[2,])

此代码的最后4个非注释行的输出为

> ksol <- z$x^2
> ksol
            [,1]     [,2]       [,3]        [,4]
[1,] 0.002951051 1.669142 0.03589502 0.001167185
[2,] 0.002951051 1.669142 0.03589502 0.001167185
> NMfun1(ksol[1,])
[1]  3.231138e-11  3.602561e-13 -4.665268e-12 -1.119105e-13
> NMfun1(ksol[2,])
[1]  1.532663e-12  1.085046e-14  6.894485e-14 -2.664535e-15

您将看到对象z中包含的解决方案具有负面元素。这是平方的。 从这个实验看来,您的系统只有一个积极的解决方案。