我正在尝试解决R中的非线性方程组,但它一直给我这个错误"要替换的项目数不是替换长度的倍数"。
我的代码如下所示:
my_data <- Danske
D <- my_data$D
V <- my_data$V
r <- my_data$r
s <- my_data$s
fnewton <- function(x)
{
y <- numeric(2)
d1 <- (log(x[1]/D)+(r+x[2]^2/2))/x[2]
d2 <- d1-x[2]
y[1] <- V - (x[1]*pnorm(d1) - exp(-r)*D*pnorm(d2))
y[2] <- s*V - pnorm(d1)*x[2]*x[1]
y
}
xstart <- c(239241500000, 0.012396)
nleqslv(xstart, fnewton, method="Newton")
D,V,r和s是数值[1:2508]值,我认为这就是问题所在。如果我有单个值1x1,它可以很好地解决它,但是,如果我插入2508个值的向量,它只计算第一个x1和x2,然后出现上面写的消息警告。
感谢您的帮助。
丽娜
答案 0 :(得分:1)
评论太长了。
如果没有腼腆的数据,就无法验证这一点,但是......
您正在传递fnewton(...)
长度为2的向量,并期望长度为2的向量作为返回值。但是在您的函数中,d1
和d2
设置为长度为2508的向量。然后,您尝试将y[1]
和y[2]
设置为长度为2508的向量.R不能这样做,所以它使用RHS中的第一个值并提供警告。
我建议你逐步完成你的功能,看看每条线路在做什么。
无法提出解决方案,因为我不知道你想要完成什么。
答案 1 :(得分:1)
你没有像编写fnewton
那样的方程式“系统”。我可以推荐(免责声明:我是作者)你看一下ktsolve
包吗?您可能会发现它可以让您更轻松地找到您正在寻找的解决方案。您可以使用几乎所写的fnewton
,除非您将一组命名的标量变量传递给函数。
如果你想为各种输入'起始点'解决(使用nleqslv或ktsolve),那么你应该将你的方法包装在一个循环或*apply
函数中。