我用R写了以下代码,用于最陡爬坡
x <- c(1,2,3,4,5,6,7,8,9,10)
y <- c(1.3,1.9,2.4,2.5,2.4,2.5,2.6,2.7,2.7,2.7)
del <-0.01
tol <- 0.00001
b1 <- 2
b2 <- 2.5
sum1 = 0
sum2 = 0
sum3 = 0
sum4 = 0
accept= FALSE
post <- function(b1,b2){
for (i in 1:10) {
sum1 = sum1 + (y[i]*exp(1-exp(-x[i]/b2)))
sum2 = sum2 + exp(2-2*exp(-x[i]/b2))
sum3 = sum3 + y[i]*x[i]*exp(1-(x[i]/b2))-exp(-x[i]/b2)
sum4 = sum4 + x[i]*exp(2-(x[i]/b2)-2*exp(-x[i]/b2))
}
f = function(b1,b2){
(-0.01*(b1+b2))+(100*b1*sum1)-(50* sum2*(b1)^2)
}
db1 = function(b1,b2){
-0.01+(100*sum1)-(100*b1*sum2)
}
db2 = function(b1,b2){
-0.01+(100*(b1/b2)^2*sum4)-(100*(b1/(b2)^2)*sum3)
}
while (accept==FALSE){
b1_new = del*db1(b1,b2) + b1
b2_new = del*db2(b1,b2) + b2
db1_new = db1(b1_new,b2_new)
db2_new = db2(b1_new,b2_new)
}
if(abs(db1_new) > abs(db1(b1,b2)) & abs(db2_new) < abs(db2(b1,b2))){
accept=TRUE
del = del/2
db1_new = db1(b1_new,b2_new)
db2_new = db2(b1_new,b2_new)
new_point = c(db1(b1_new,b2_new),db2(b1_new,b2_new))
}
}
print(c(b1,b2))
这段代码没有更新我的值,我不确定代码有什么问题。任何帮助都是感激的
我已经尝试多次更改此代码,但似乎总是得到一个错误或值不更新。我希望在代码
之后打印新值首先,在代码的任何地方都不调用函数。您可能想呼叫new_point <- post(b1, b2)
。
其次,你的函数接受参数b1
和b2
,但是当你在代码中使用变量时,它们是局部的。这意味着在函数中改变b1和b2不会改变全局变量。
b <- 10
modb <- function(b) {
b <- 20
}
modb()
print(b)
…将打印10
。
第三:你正在计算代码中称为db1_new
和db2_new
的变量,但你没有返回它们。这并不意味着代码根本不返回任何内容,它会返回:它返回最后计算的表达式的值(可能是new_point
),但这可能不是您想要的。您应该显式地指定返回值,例如使用return(c(db1_new, db2_new))
。
第四,语句while(accept == FALSE) { ... }
永远不会结束,因为您没有在循环中更改accept
的值。希望对你有帮助。