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

如何优化二元函数?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

额外实用提示

  1. 初始值调整:optim()对初始值比较敏感,如果收敛结果不理想,可以尝试不同的初始值(比如c(2,1)、c(1,2)等)。
  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")
  1. 拟合效果验证:可以用最优参数计算拟合值,和原始数据对比:
# 提取最优参数
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:28:29