Ваш пример не воспроизводится, так как вы не показали весь свой код: 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
нашел решение вашей проблемы.