R语言optim()函数报错:参数param缺失无默认值的解决咨询
解决optim()函数参数传递的错误问题
嗨,我一眼就看到问题出在哪啦~你在调用optim()的时候,给fn和gr参数传的是函数调用结果(加了括号的Time_1()和D_Time()),但optim()需要的是函数本身(不带括号)——它会自动把par里的初始猜测值传给这些函数,所以你现在的写法相当于直接调用了没有传参的Time_1()和D_Time(),自然会报参数缺失的错误。
修正步骤:
- 移除函数名后的括号:把
fn = Time_1()改成fn = Time_1,gr = D_Time()改成gr = D_Time,让optim()拿到函数对象,而不是函数执行后的结果。 - 补充Brent方法的边界(可选但推荐):因为你用的是单变量优化的Brent方法,指定
lower和upper可以让优化更稳定,根据你的问题场景,X1的合理范围应该是0到25,所以加上这两个参数。
修正后的完整代码:
# 定义T的函数 Time_1 <- function(param){ ((sqrt(param^2 + 225))/10) + ((sqrt(((25-param)^2) + 100))/2) } # 定义(dT/dX1)的函数 D_Time <- function(param){ (param / (10*(sqrt(param ^ 2 + 225)))) + ((param- 25) / (2*sqrt((25 - param) ^ 2 + 100))) } start_guess <- 1 # 初始猜测值 # 修正后的optim调用 mle_param <- optim(par=start_guess, fn = Time_1, gr = D_Time, method = 'Brent', lower = 0, upper = 25) # 查看最优解和最小时间 print(paste("使T最小的X1值:", mle_param$par)) print(paste("最小时间T:", mle_param$value))
补充说明:
- 你的导数函数
D_Time是正确的,我核对过啦,和手动求导的结果一致~ - 运行修正后的代码后,
mle_param$par就是你要找的最优X1,mle_param$value对应的是最小时间T。
内容的提问来源于stack exchange,提问作者Cecilia
相关产品推荐
相关产品推荐

