在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
相关产品推荐
相关产品推荐

