Ошибка пакета nleqslv: длина результата fn <> длина x - PullRequest
0 голосов
/ 25 марта 2019

Я решаю нелинейное уравнение, используя пакет 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]. Похоже, я должен получить числовое решение х [2].

1 Ответ

1 голос
/ 25 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...