2016-05-31 74 views
-5

我在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

如果你想估计正整数,你的问题是你的方法,而不是你的初始值。 (也就是说,如果你想估计正整数,为什么你从非整数值开始?) – Gregor

+0

也许试试'nloptr'包,它是用于非线性编程的问题。 – Gregor

+0

软件包'nleqslv'没有强制整数值解决方案的选项。它试图找到解决方程系统的真正有价值的解决方案。你怎么知道有一个整数值解决方案?如果有解决方案,您必须寻求解决问题的方法! – Bhas

回答

2

好的。所以如果它们存在的话,你需要真正大于0的解决方案。 在将输入参数传递给NMfun1之前,先制作一个新的函数。然后使用包nleqslv中的searchZeros功能来搜索解决方案。像这样

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的解决方案有消极的因素。这是平方。 从这个实验看来,你的系统只有一个正解。

+0

非常感谢Bhas先生。你是最棒的。 – Soma

+0

Bhas,我尝试过使用你的方法,但它不适用于我。我想为searchZeros函数创建一个新脚本?我如何使用NMfun1脚本创建一个新脚本?谢谢 – Soma

+0

你是什么意思“..它不适合我“?我在回答中给出的代码应附加到您的原始代码中。 'searchZeros'在'nleqslv'包中。 – Bhas