【问题标题】:Return a vector from an optimized function从优化的函数返回一个向量
【发布时间】:2022-02-04 18:30:09
【问题描述】:

我编写了一个函数来求解穿孔管道中的流量 - “solver_fun”。 我优化此功能以获得针对特定条件的最佳解决方案。 我的问题是我对优化的 Q_out_vec 感兴趣,所以我可以在不同的函数中使用它。但是,当我在solver_fun 中包含return() 函数时,优化函数不起作用并给出错误消息。

solver_fun <- function (h_ini) {
  h_vec [length (submain_length)] <- h_ini
  
  for (i in lateral_number:1) {
    v_out_vec [i] <- v_out (h_vec [i + 1], connector_k, is_open_vec [i])
    
    Q_out_vec [i] <- Q_out (v_out_vec [i], connector_A)
    
    if (i == lateral_number) {
      Q_total_vec [i] = Q_out_vec [i]
    } else {
      Q_total_vec [i] = Q_total (Q_out_vec [i], Q_total_vec [i + 1])
    }
    hf_vec [i] <-
      hf (lateral_spacing, submain_D, submain_C, Q_total_vec [i])
    h_vec [i] <-
      h (h_vec [i + 1], hf_vec [i], submain_slope, lateral_spacing)
  }
  output<-list(Q_out_vec);
  #return (output);
  h_diff <- abs(h_vec [1] - hin)
}
sol <- optimize(solver_fun, lower=0, upper=2);

在这种形式下优化是有效的,但是当我在 return() 函数之前删除 # 时,我得到: 优化错误(solver_fun,lower = 0,upper = 2): “优化”中的无效函数值

任何帮助将不胜感激。 谢谢

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    无法测试您的代码。看来您使用的是全局空间中的h_vec。最好将它作为参数传递给solver_fun

    无论如何。函数optimize 必须最小化一个值,solver_fun 返回。如果返回向量,optimize 自然会产生错误。您可以通过在 solver_fun 函数调用中使用附加参数来解决此问题。大概是这样的:

    solver_fun <- function (h_ini, return_vect = FALSE) {
      h_vec [length (submain_length)] <- h_ini
      
      for (i in lateral_number:1) {
        v_out_vec [i] <- v_out (h_vec [i + 1], connector_k, is_open_vec [i])
        
        Q_out_vec [i] <- Q_out (v_out_vec [i], connector_A)
        
        if (i == lateral_number) {
          Q_total_vec [i] = Q_out_vec [i]
        } else {
          Q_total_vec [i] = Q_total (Q_out_vec [i], Q_total_vec [i + 1])
        }
        hf_vec [i] <-
          hf (lateral_spacing, submain_D, submain_C, Q_total_vec [i])
        h_vec [i] <-
          h (h_vec [i + 1], hf_vec [i], submain_slope, lateral_spacing)
      }
      output<-list(Q_out_vec);
    
      if (return_vect) {
        return (output)
      }
      h_diff <- abs(h_vec [1] - hin)
    }
    
    sol <- optimize(solver_fun, lower=0, upper=2)
    

    然后您可以使用优化的h_ini 运行solver_fun 并将您的Q_out_vec 作为输出:

    out_vec <- solver_fun(sol$objective, return_vect = TRUE)
    

    【讨论】:

    • 此解决方案完美运行!这是一个美丽的旁路
    • sdabach,太好了,如果有用,请考虑支持并接受我的回答。
    • 声望达到 15 点我会的
    猜你喜欢
    • 2012-08-31
    • 2021-12-28
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 2014-10-01
    相关资源
    最近更新 更多