我用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))
此代码没有更新我的值,我不确定代码有什么问题。任何帮助都将不胜感激
我已经尝试改变这个代码很多次,但是似乎总是得到一个错误或值不更新。我期待新的值打印后的代码
1条答案
按热度按时间yhuiod9q1#
首先,在代码的任何地方都不调用函数,你可能想调用
new_point <- post(b1, b2)
。第二,你的函数接受参数
b1
和b2
,但是当你在代码中使用这些变量时,它们是局部变量,这意味着在函数中改变b1和b2不会改变全局变量。...将打印
10
。第三:你在代码中计算了名为
db1_new
和db2_new
的变量,但是你没有返回它们,这并不意味着代码根本不返回任何东西,而是:它返回最后一个表达式的值(可能是new_point
),但这可能不是你想要的。你应该明确地指定返回值,例如return(c(db1_new, db2_new))
。第四,
while(accept == FALSE) { ... }
语句永远不会结束,因为您没有在循环中更改accept
的值。