2016-08-01 52 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

searchZeros()的結果中沒有g元素。因此,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從函數nleqslv中填入output$termcd。在nleqslv的幫助文件中,它表示1代表output$termcd意味着已經達到了收斂。總之,如果函數沒有檢測到收斂,它只是停止,沒有任何進一步的信息,並返回NULL

編輯:向nleqslv的創作者道歉,案件與我之前所說的相反(儘管通過搜索NULL找不到)。

+0

感謝您的致歉!我盡最大努力正確記錄內容。我會看看我能否在手冊中更加明確。 – Bhas

+0

不錯的選擇。加一。 – akrun