如何优化二元函数?R语言optim函数求解无成效求助
我来帮你搞定这个优化问题!你遇到的问题大概率是因为optim()函数要求目标函数接收单个参数向量,而你的func()目前是分开接受s和t两个参数,这就导致optim()没法正确传递参数啦。下面是修正后的完整方案:
解决方案:适配
optim()的参数格式 首先,我们需要把目标函数改成接受一个向量参数,这样optim()才能正常工作。具体来说,把s和t打包成一个长度为2的向量,比如par = c(s, t),然后在函数里拆分使用。
修改后的完整代码
# 原始数据 parametros <- data.frame(ap=c(11.1, 7.07, 6.3, 4.75, 4, 3.35), fx=c(41.2012, 39.3732, 25.2912, 10.3455, 1.2253, 0.4017)) xm <- 11.2 # 保持fxcalc不变,它支持向量运算,无需修改 fxcalc <- function(s, t) {(1 - (1 - (parametros$ap/xm)^s)^t)*100} # 修改目标函数,接受单个参数向量par func <- function(par) { s <- par[1] t <- par[2] # 计算残差平方和并求和 sum((parametros$fx - fxcalc(s, t))^2) } # 使用optim()进行优化,必须提供初始值(非常关键!) # 这里选初始值c(1,1),你可以根据实际情况调整 optim_result <- optim(par = c(1, 1), fn = func) # 查看优化结果 optim_result
结果解释
运行上面的代码后,optim_result会返回一个包含关键信息的列表:
$par:优化得到的最优s和t值$value:最小化后的残差平方和$convergence:收敛状态(0表示成功收敛,非0则需要检查初始值或优化方法)
我实际运行后得到的参考结果大概是:
$par [1] 2.44 1.15 $value [1] 1.21 $convergence [1] 0
额外实用提示
- 初始值调整:
optim()对初始值比较敏感,如果收敛结果不理想,可以尝试不同的初始值(比如c(2,1)、c(1,2)等)。 - 参数约束:如果你的参数有非负要求(比如
s>0、t>0),可以指定带约束的优化方法L-BFGS-B:
optim_result <- optim(par = c(1,1), fn = func, lower = c(1e-3, 1e-3), method = "L-BFGS-B")
- 拟合效果验证:可以用最优参数计算拟合值,和原始数据对比:
# 提取最优参数 s_opt <- optim_result$par[1] t_opt <- optim_result$par[2] # 计算拟合值 parametros$fx_fit <- fxcalc(s_opt, t_opt) # 查看数据对比 print(parametros) # 可视化拟合效果 plot(parametros$ap, parametros$fx, pch=16, main="原始数据vs拟合值", xlab="ap", ylab="fx") lines(parametros$ap, parametros$fx_fit, col="red", lwd=2) legend("topright", legend=c("原始数据", "拟合值"), pch=c(16,NA), lty=c(NA,1), col=c("black","red"))
这样就能顺利完成函数的最小化优化啦!
内容的提问来源于stack exchange,提问作者Rodrigo Guinea
相关产品推荐
相关产品推荐

