用R中的optim求z的最大点处的x和y

用R中的optim求z的最大点处的x和y,r,optimization,R,Optimization,我有一个函数,x和y同时变化。在x和y的指定范围内绘制此函数的结果如下图所示(请参见下图完整的R代码) 问题: 我想知道在R中使用优化命令(optim,nlm,等等),如何在该函数的z最大点处获得x和y的值? 这是我的R代码: Data = c( 182, 201, 221, 234, 237, 251, 261, 266, 267, 273, 286, 291, 292, 296, 296, 296, 326, 352, 359, 365 ) x = seq(200,

我有一个函数,
x
y
同时变化。在
x
y
的指定范围内绘制此函数的结果如下图所示(请参见下图完整的R代码)

问题: 我想知道在R中使用优化命令(
optim
nlm
,等等),如何在该函数的
z
最大点处获得
x
y
的值?

这是我的R代码:

Data = c( 182, 201, 221, 234, 237, 251, 261, 266, 267, 273, 
          286, 291, 292, 296, 296, 296, 326, 352, 359, 365 )

x = seq(200, 340, len = 30)

y = sqrt( seq(800, 8500, len = 30) )

f = function(x, y) Reduce(`*`, Map(dnorm, x = Data, mean = list(x), sd = list(y)))

z = outer(x, y, f)

persp(x, y, z , theta = 55, phi = 15, expand = 0.5, ticktype = "detailed", col = 'gold')

下面是一个非常简单的原始代码,用于解决优化问题的第一步:

Data = c( 182, 201, 221, 234, 237, 251, 261, 266, 267, 273, 
          286, 291, 292, 296, 296, 296, 326, 352, 359, 365 )

f = function(x) Reduce(`*`, Map(dnorm, x = Data, mean = list(x[1]), sd = list(x[2])))*(-10^50)

optim(c(200,100),f, method="BFGS", control=list(maxit=100000))

$par
[1] 277.59967  48.28371

$value
[1] -9981.604

$counts
function gradient 
    1723     1693 

$convergence
[1] 0

$message
NULL

正如我在上面所写的,这是一个非常原始的代码,只是为了开始思考您的问题。我选择了查看your图形的初始值:函数的最大值在x轴上为250到300,y轴上为100到200。我反转了函数的符号,因为
optim
执行最小化。我乘以10^5,因为你的函数取的值很低(见图表的z轴),这可能是数值问题的根源。更好的办法是优化函数的对数。