R语言绘制二元函数图像及求解最优值时报错问题咨询
问题原因
两个报错均来自函数入参形式和调用函数的传参规则不匹配:
outer()要求传入的目标函数必须接收两个独立参数(分别对应x、y网格的取值),当前定义的fb仅接收1个长度为2的向量参数,无法接收outer传入的第二个Y参数,因此触发报错。optim()默认会将待优化的所有参数打包为单个向量传入目标函数,出现argument "y" is missing是因为中途为适配outer修改过fb的入参定义,将单向量入参改成了x、y两个独立入参,和optim的传参逻辑不兼容。
可直接运行的修复代码
多变量函数可视化部分
保留适配optim的单向量入参版本的fb,调用outer时通过匿名函数做参数转换,不需要修改原函数定义:
# 原目标函数定义,单向量入参,适配optim调用 fb <- function(x) { 5*x[1]^2 + 2*x[1]*x[2] + 4*x[2]^2 + 4*x[1] - 2*x[2] - 2 } x <- -50:50 y <- -50:50 # 套匿名函数完成参数格式转换,适配outer传参规则 z <- outer(x, y, function(xi, yi) fb(c(xi, yi))) # 可视化示例,按需选择绘图函数 persp(x, y, z, theta = 35, phi = 20, col = "aliceblue", ticktype = "detailed") # 或者绘制等高线图 contour(x, y, z, nlevels = 30)
最大值求解部分
将fb恢复为单向量入参的形式即可直接调用optim,fnscale参数设置为任意负数即代表最大化目标函数,不需要绑定函数值量级:
opt_result <- optim( par = c(0, 0), fn = fb, control = list(fnscale = -1) ) # 提取结果 # 最优点坐标:opt_result$par # 对应最大值:opt_result$value
验证参考:该函数为凸二次函数,解析解为x1=-10/19≈-0.526,x2=6/19≈0.316,和optim数值计算结果一致。
内容的提问来源于stack exchange,提问作者MusterHere
相关产品推荐
相关产品推荐

