2016-08-01 2 views
-3

Я намерен решить систему нелинейных уравнений с использованием пакета nleqslv. Ниже приведен сценарий R.Почему функция nleqslv возвращает вывод NULL?

library("nleqslv") 

require(nleqslv) 

x <- c(1.4,1.6,1.8,2) 

NMfun1 <- function(g) { 

    y <- numeric(3) 

    y[1] <- -(4/g[1])-(4*log(g[2]))-sum(log(x))+sum((g[2]*x)^g[1]*log(g[2]*x))+2*sum(g[3]*(g[2]*x)^g[1]*log(g[2]*x)*exp(-(g[2]*x)^g[1])*(1-g[3]*exp(-(g[2]*x)^g[1]))^(-1)) 

    y[2] <- -(4*g[1]/g[2])+sum(g[2]*x*(g[2]*x)^(g[1]-1))+2*sum(g[1]*g[3]*x*(g[2]*x)^(g[1]-1)*exp(-(g[2]*x)^g[1])*(1-g[3]*exp(-(g[2]*x)^g[1]))^(-1)) 

    y[3] <- (4/(g[3]-1))-2*sum(exp(-(g[2]*x)^g[1])*(1-g[3]*exp(-(g[2]*x)^g[1]))^(-1)) 

    y 

} 

gstart <- matrix(runif(3*100,min=0,max=1), nrow=100, ncol=3) 

ans <- nleqslv(gstart,NMfun1, method="Newton", global="dbldog") 

ans$g 

Я считаю, что я не делаю что-то в своем коде, потому что я продолжаю получать NULL после запуска кода. Мне нужна ваша помощь. Спасибо

+1

Пожалуйста, измените название! –

+1

Используйте параметры форматирования, указанные SO https://stackoverflow.com/editing-help, это поможет другим понять вопрос и помочь решить эту проблему. –

+0

Хорошо подходит для stackoverflow. Вы должны выбрать заголовок, чтобы объяснить свой вопрос. –

ответ

1

Элемент g не найден в searchZeros(). Следовательно, ans$g возвращает NULL.

См. here, внизу. Список, возвращенный с searchZeros(), не содержит элемента с именем g. Следующее - конец функции.

searchZeros <- function(x, fn, digits=4L, ...) { 

    ... 

    # return full precision solutions ordered with rounded ordering 
    res <- list(x=xsol[zidxo,,drop=FALSE], xfnorm=fnorm[idxcvg][notdups][zidxo], 
       fnorm=fnorm[idxcvg], idxcvg=idxcvg, idxxtol=idxxtol, 
       idxnocvg=idxnocvg, idxfatal=idxfatal, 
       xstart=solstart[zidxo,,drop=FALSE],cvgstart=xstartcvg) 
    res 
} 
+0

И возвращаемое значение также задокументировано в руководстве! Я хочу, чтобы люди внимательно читали руководства! – Bhas

1

С проблемой возникли проблемы. Во-первых, ваш код содержит очевидные недостатки, т. Е. G [2] может стать отрицательным, что приведет к тому, что в журнале обнаружен что-то отрицательное, которое не определено.

Внутри searchZeros есть линия if (!any(tcode == 1)) return(NULL). Объект tcode заполняется output$termcd от функции nleqslv. В файле справки nleqslv говорится, что 1 для output$termcd означает, что достигнута конвергенция. Таким образом, если функция не обнаруживает конвергенцию, она просто останавливается без какой-либо дополнительной информации и возвращает NULL.

Редактировать: Извинения перед создателями nleqslv, дело документировано в отличие от того, что я сказал ранее (хотя его невозможно найти, ища NULL).

+0

благодарит за извинения! Я делаю все возможное, чтобы правильно документировать вещи. Я посмотрю, могу ли я быть более явным в руководстве. – Bhas

+0

Хороший вариант. Плюс один. – akrun

Смежные вопросы