You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将网格搜索与ode模型关联以寻找aux参数的最优组合?

如何将网格搜索与ode模型关联以寻找aux参数的最优组合?

看起来你已经搭好了ODE模型和参数网格,接下来要做的就是把这两者串联起来,计算每个参数组合对应的模型输出,再根据你定义的「最优」标准挑出最好的那组参数。我一步步给你说怎么做:

第一步:明确你的「最优」标准

首先得先定义清楚什么是你要的「最优」——是让最终时刻(t=30)的sK值最大?还是让net_f的累积值最小?这里我先假设你的目标是最大化t=30时的sK值,你可以根据自己的需求随时调整目标指标。

第二步:封装模型计算函数

写一个小函数,输入一组aux参数,运行你的ODE模型,然后返回你关心的目标值:

# 定义计算目标值的函数
compute_target <- function(params) {
  # 将输入的参数转换为aux的格式
  aux <- c(aH = params[["aH"]], aRel = params[["aRel"]], 
           aRes = params[["aRes"]], aS = params[["aS"]])
  # 运行ODE模型
  out <- data.frame(ode(times = time, y = stock, parms = aux, func = model, method = 'euler'))
  # 返回t=30时的sK值(这里是我们的优化目标,可替换)
  return(out$sK[out$time == 30])
}

第三步:遍历参数网格计算目标值

接下来我们要遍历你用crossing生成的参数网格d,给每一行参数计算对应的目标值。这里有两种常用方法:

方法1:Base R的apply函数

# 给参数网格添加target列,存储每个组合的目标值
d$target <- apply(d, 1, compute_target)

方法2:Tidyverse的purrr包(更直观)

如果你习惯用tidyverse风格的代码,可以用pmap_dbl来遍历每一行参数:

library(tidyverse)
d <- d %>%
  mutate(target = pmap_dbl(., compute_target))

第四步:筛选最优参数组合

现在参数网格里已经有了每个组合的目标值,直接找到目标值最优的那一行即可:

# 最大化目标值用which.max,最小化用which.min
best_params <- d[which.max(d$target), ]
print(best_params)

一些补充说明

  1. 调整优化目标:如果你的目标不是最终时刻的sK,只需要修改compute_target里的返回值就行,比如:
    # 例子1:返回整个时间序列中sK的平均值
    return(mean(out$sK))
    # 例子2:返回net_f的累积总和
    return(sum(out$net_f))
    
  2. 优化计算速度:你的参数网格有10×10×10×10=10000个组合,计算可能需要一点时间。如果想提速,可以:
    • 先缩小参数范围(比如从0.2到0.8,步长0.1)减少组合数
    • 用并行计算,比如用parallel包的mclapply代替apply,或者furrr包实现并行遍历

备注:内容来源于stack exchange,提问作者user11806155

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:00:31