软件包nleqslv错误:fn结果的长度<> x的长度

时间:2019-03-25 03:28:33

标签: r

我正在使用软件包nleqslv求解非线性方程,但我不断收到错误:fn结果的长度<> x的长度!

我无法发现矢量长度可能存在问题的地方。有人知道我在代码中犯了什么错误吗?

library(nleqslv)

d_plus <- function(x)  (log(55.75/x[1])+(0.026 + x[2]^2 / 2) * 0.25) / (x[2]*0.5) + 0 * x[3]

d_minus <- function(x) (log(55.75/x[1])+(0.026 - x[2]^2 / 2) * 0.25) / (x[2]*0.5) + 0 * x[3]

F_C0 <- function(x) 55.75 * pnorm(d_plus(x)) - x[1] * exp(-0.026 * 0.25) * pnorm(d_minus(x)) + 0 * x[3]

eqn <- function(x) F_C0(x) - x[3]

nleqslv( c(40, 1, 17.35), eqn) 

我正在尝试求解x [2],我有x [1]和x [3]的输入。看来我应该得到x [2]的数值解。

1 个答案:

答案 0 :(得分:1)

您的示例不可复制,因为您没有显示所有代码:library(nleqslv)已丢失。请显示所有代码。

正如您对问题的第一条评论所述,您正在为eqn提供一个向量,但是函数d_plusd_minusF_C0返回标量。 这意味着函数结果的长度与输入的长度不同。

根据您的解释,您想解决x[2]。因此,呈现给nleqslv的函数必须采用标量作为输入并返回标量。

这可以通过以下方式实现:

library(nleqslv)

d_plus <- function(x)  (log(55.75/x[1])+(0.026 + x[2]^2 / 2) * 0.25) / (x[2]*0.5) + 0 * x[3]

d_minus <- function(x) (log(55.75/x[1])+(0.026 - x[2]^2 / 2) * 0.25) / (x[2]*0.5) + 0 * x[3]

F_C0 <- function(x) 55.75 * pnorm(d_plus(x)) - x[1] * exp(-0.026 * 0.25) * pnorm(d_minus(x)) + 0 * x[3]

eqn <- function(xpar) { x <- c(40,xpar,17.35);F_C0(x) - x[3] }

eqn(即您的x[2])的标量参数插入向量x中,其中的第一项和第三项是您在代码中提供的起始值。 然后运行这个

xstart <- 1
nleqslv( xstart, eqn) 

结果

$x
[1] 0.6815036

$fvec
[1] 6.18563e-11

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1

$nfcnt
[1] 5

$njcnt
[1] 1

$iter
[1] 5

阅读nleqslv的文档以了解这些内容的含义。 如您所见,nleqslv找到了解决问题的方法。