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](<=错误&;abs(dk[2](<=错误(";。有人能帮忙吗?为什么我收到这个错误消息?(我写错误=1e3,但我稍后会减少错误量,我正在努力达到工作功能:(
这个代码代表了davidon-fletcher-powell方法的算法。如果你有任何补充或建议。我将不胜感激。
我做了两件事:
-
修复了@Jan指出的拼写错误;和
-
将快速
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的细微差别时,它可以为您节省许多小时。