r-我在if条件下得到了一个缺失值错误


realfunction1<-function(x){
(5*x[1]-x[2])^4+(x[1]-2)^2+x[1]-(2*x[2])+12
}
func1gradient <- function(gradient){
x<-0
y<-0
x <- (20*(5*gradient[1]-gradient[2]))^3+2*(gradient[1]-2)+1
y <- (-4*(5*gradient[1]-gradient[2]))-2

gradient[1]<-x
gradient[2]<-y
return(gradient)
}
DFP<-function(Error,xk){

k <- 0
i <- 1
alpha<-seq(from=-100,to=100,by=0.005)
H0 <- matrix(c(1,0,0,1), nrow=2, byrow=TRUE)
Hk <- H0
repeat{

dk <- (-1)*(Hk%*%func1gradient(xk))

if(abs(dk[1]) <= Error && abs(dk[2]) <= Error){ ####ERROR LINE

return(xk)

}else{

for(i in i:40001){

vectortofindmin<-matrix(c(1:40001),nrow=40001)

variables <- xk+(alpha[i]*dk)

f1valuetutucu<-matrix(c(1:40001),nrow=40001)

f1valuetutucu[i] <- realfunction1(variables)
}

indexalpha<-which.min(f1valuetutucu)


xknew <- xk + (alpha[indexalpha]*dk)

pk <- xknew - xk

qk <- func1gradient(xknew) - func1gradient(xk)


## A
divisionval<-(t(pk)%*%qk)
divisionmatix<-matrix(c(divisionval,divisionval,divisionval,divisionval),nrow=2)

A <- (pk%*%t(pk))/divisionmatrix

###

divisionval2<-t(qk)%*%Hk%*%qk
divisionmatrix2 <- matrix(c(divisionval2,divisionval2,divisionval2,divisionval2),nrow=2)        
B <- (Hk%*%qk)%*%t(Hk%*%qk)/divisionmatrix2
####
Hknew <- Hk + A + B          
Hk <- Hknew
xk<-xknew
} 
}
}
DFP(Error=1e3,xk=matrix(c(33,12),nrow=2))

这是我的全部代码,我尝试了代码的每一行,它运行得很好,但我在if行";缺少需要TRUE/FALSE的值"如果(abs(dk[1](<=错误&amp;abs(dk[2](<=错误(";。有人能帮忙吗?为什么我收到这个错误消息?(我写错误=1e3,但我稍后会减少错误量,我正在努力达到工作功能:(

这个代码代表了davidon-fletcher-powell方法的算法。如果你有任何补充或建议。我将不胜感激。

我做了两件事:

  1. 修复了@Jan指出的拼写错误;和

  2. 将快速tryCatch(...)browser()插入到repeat循环中。

    iserr <-  tryCatch({if (abs(dk[1]) <= Error && abs(dk[2]) <= Error) 1;F;}, error=function(e) TRUE)
    if (iserr) {browser();1;}
    

    (在真正的if语句之前(

之后,我运行了您的DFP(...),它弹出了一个调试会话。然后我分解了if条件:

(abs(dk[1]) <= Error && abs(dk[2]) <= Error)
# [1] NA

这就是您收到错误的原因。(如果你用错误消息[r] missing value where TRUE/FALSE needed搜索SO,你会发现你的确切错误在很多问题中都有讨论。(

但你需要知道为什么这个条件不是真正的真/假,所以我们可以看看一些因变量。以下所有内容都会以某种形式提醒我(尽管xk可能还可以?(:

dk
#      [,1]
# [1,]  NaN
# [2,]  NaN
xk
#               [,1]
# [1,]  4.16513e+145
# [2,] -5.07341e+115
func1gradient(xk)
#                [,1]
# [1,]            Inf
# [2,] -8.330259e+146
Hk
#      [,1] [,2]
# [1,]  NaN  NaN
# [2,]  NaN  NaN

我不会解释为什么每个所谓的数字变量都包含意外值,因为这需要一些关于你在这里做什么的领域知识。你可能会发现Inf并不完全符合预期,但我预计NaN会让你感到惊讶。

仔细检查你的逻辑和代码,找出每一个都出了什么问题。

在函数中使用新数学时,我经常包含一些if语句,这些语句要么提前停止,要么让我进入browser()调试会话。例如,

if (any(is.null(z), is.nan(z), is.na(z))) { browser(); 1; }

在你做一些可以把零、非常正、非常低或非常负的数字变成非数字的事情之前,检查一下各种成分可能是一件好事。(为了解决R中调试的一些细微差别,browser();1;有点像黑客。(

稍有不同的策略可能是:

if (!isTRUE(is.finite(z))) { browser(); 1; }

这应该更积极地启动调试会话。

您应该在生产中避免使用这种类型的代码(例如browser()(,但在开发新的基于R的东西和/或学习R的细微差别时,它可以为您节省许多小时。

相关内容

  • 没有找到相关文章

最新更新