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

在R中实现类Excel规划求解:函数最小化问题

如何通过调整x和y最小化vectorb与vectorc的偏差?

刚好碰到过类似的非线性参数优化问题,用R自带的optim()工具就能轻松搞定。先把问题再明确下:

  • 已知两个向量:
    vectora <- c(111, 245, 379, 516, 671)
    vectorb <- c(38, 54, 62, 67, 108)
  • 初始参数:x=80,y=0.8
  • 生成vectorc的公式:vectorc <- vectora^y/(1+(vectora^y-1)/x)
  • 要最小化的偏差:对应元素绝对差之和 sum(abs(vectorb - vectorc))

解决方案:用R的optim()函数实现参数优化

步骤1:定义目标函数

首先我们需要把"计算偏差"的逻辑封装成一个函数,输入是包含x和y的参数向量,输出是对应的偏差值:

objective_function <- function(par) {
  # 从参数向量中提取x和y
  x <- par[1]
  y <- par[2]
  
  # 定义已知向量
  vectora <- c(111, 245, 379, 516, 671)
  vectorb <- c(38, 54, 62, 67, 108)
  
  # 生成vectorc
  vectorc <- vectora^y / (1 + (vectora^y - 1)/x)
  
  # 计算并返回偏差
  return(sum(abs(vectorb - vectorc)))
}

步骤2:设置初始参数并运行优化

我们用给定的初始值c(80, 0.8)作为起点,调用optim()函数进行最小化。因为目标函数是绝对值之和(非光滑函数,不可导),Nelder-Mead算法是最合适的选择(optim()默认就是这个算法):

# 初始参数
initial_par <- c(80, 0.8)

# 运行优化
optim_result <- optim(par = initial_par, fn = objective_function)

步骤3:查看优化结果

运行完后,我们可以提取优化后的参数和最小偏差:

# 输出结果
cat("优化后的x值:", round(optim_result$par[1], 4), "\n")
cat("优化后的y值:", round(optim_result$par[2], 4), "\n")
cat("最小偏差值:", round(optim_result$value, 4), "\n")

额外说明

  • 如果你的x和y有取值范围限制(比如必须大于0),可以用method="L-BFGS-B"并指定lower和upper参数,比如:
    # 假设x>0,y>0
    optim_result <- optim(par = initial_par, fn = objective_function, 
                          method = "L-BFGS-B", lower = c(0.001, 0.001))
    
  • 如果你想尝试其他优化算法,可以查看?optim的帮助文档,里面列举了所有支持的方法及其适用场景。

内容的提问来源于stack exchange,提问作者user7353167

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:43