我正在使用软件包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]的数值解。
答案 0 :(得分:1)
您的示例不可复制,因为您没有显示所有代码:library(nleqslv)
已丢失。请显示所有代码。
正如您对问题的第一条评论所述,您正在为eqn
提供一个向量,但是函数d_plus
,d_minus
和F_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
找到了解决问题的方法。