请更正最陡上升的R代码

ntjbwcob  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(138)

我用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))

此代码没有更新我的值,我不确定代码有什么问题。任何帮助都将不胜感激
我已经尝试改变这个代码很多次,但是似乎总是得到一个错误或值不更新。我期待新的值打印后的代码

yhuiod9q

yhuiod9q1#

首先,在代码的任何地方都不调用函数,你可能想调用new_point <- post(b1, b2)
第二,你的函数接受参数b1b2,但是当你在代码中使用这些变量时,它们是局部变量,这意味着在函数中改变b1和b2不会改变全局变量。

b <- 10
modb <- function(b) {
 b <- 20
}
modb()
print(b)

...将打印10
第三:你在代码中计算了名为db1_newdb2_new的变量,但是你没有返回它们,这并不意味着代码根本不返回任何东西,而是:它返回最后一个表达式的值(可能是new_point),但这可能不是你想要的。你应该明确地指定返回值,例如return(c(db1_new, db2_new))
第四,while(accept == FALSE) { ... }语句永远不会结束,因为您没有在循环中更改accept的值。

相关问题