R中非线性方程组的求解

R中非线性方程组的求解,r,nonlinear-optimization,R,Nonlinear Optimization,我试图在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]

我试图在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")

my_data太长,无法发表评论

如果不了解你的数据,就不可能证实这一点,但是

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

我建议你逐步完成你的功能,看看每一行都在做什么

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

您并没有像编写
fnewton
那样的“方程组”。我可以推荐(免责声明:我是作者)您看看
ktsolve
软件包吗?你可能会发现它会让你更容易找到你想要的解决方案。除了将命名标量变量的集合传递到函数中之外,您几乎可以按照编写的方式使用
fnewton


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

谢谢您的评论!我写了一个循环,即使使用fnewton,它也能完美工作:)是的,这是我的问题,我不知道如何“告诉程序”,我实际上也希望我的答案长度为2508。我对R很陌生,所以它给我带来了一些问题,但是写一个循环解决了所有问题。谢谢你的评论。