0

我正在尝试解决 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,然后会出现带有我上面写的消息的警告。

感谢您的任何帮助。

丽娜

4

2 回答 2

1

您实际上并没有像您编写fnewton. 我可以推荐(免责声明:我是作者)你看看ktsolve包吗?您可能会发现它会更轻松地为您提供您正在寻找的解决方案。您fnewton几乎可以按照所写的方式使用,只是您将一组命名的标量变量传递给函数。

如果您想解决(使用 nleqslv 或 ktsolve)各种输入“起点”,那么您应该将您的方法包装在循环或*apply函数中。

于 2014-04-10T18:05:49.903 回答
1

评论太长了。

如果没有你的数据,就不可能验证这一点,但是......

您正在传递fnewton(...)一个长度为 2 的向量,并期望一个长度为 2 的向量作为返回值。但是在您的函数中,d1并设置为长度为 2508 的向量。然后d2您尝试设置长度为 2508 的向量。R 不能这样做,因此它使用 RHS 中的第一个值并提供警告。y[1]y[2]

我建议你逐步完成你的函数,看看每一行在做什么。

无法提出解决方案,因为我不知道您要完成什么。

于 2014-04-10T17:53:21.220 回答