我正在尝试使用两个应该具有唯一解决方案的参数来优化(最小化)函数。
foo <- function(x) {
x1 <- x[1]
x2 <- x[2]
t=5-sqrt((0-x1)^2+(0-x2)^2);
u=4-sqrt((0-x1)^2+(4-x2)^2);
v=3-sqrt((3-x1)^2+(0-x2)^2);
return(sum(t,u,v))
}
optim(c(0,0), foo)
那些喜欢中学数学的人可能会认识到笛卡尔坐标(x,y)坐标平面上两点之间距离的公式。写入函数foo,使得x1是x坐标,x2是我想要找到的点的y坐标。在这种情况下,这一点是(3,4)。但是,我的输出很糟糕:
optim(c(0,0), foo)
$par
[1] -3.938866e+54 1.293779e+54
$value
[1] -1.243772e+55
$counts
function gradient
501 NA
$convergence
[1] 1
$message
NULL
知道出了什么问题吗?
答案 0 :(得分:1)
原样,你的函数没有最小值,因为t,u和v随着x1和x2越来越远离三个固定点(0,0),(0,4)和(3,0)而减小。 / p>
似乎你想要找到一个点(x1,x2)来最小化到这三个点的距离。如果是这种情况,则应将f定义为:
foo <- function(x) {
x1 <- x[1]
x2 <- x[2]
t = 5 + sqrt((0-x1)^2+(0-x2)^2);
u = 4 + sqrt((0-x1)^2+(4-x2)^2);
v = 3 + sqrt((3-x1)^2+(0-x2)^2);
return(sum(t,u,v))
}
请注意,唯一的更改是-sqrt
到+sqrt
。
答案不是你想要的点(3,4),最小值是三角形内有三个点作为顶点的点。
解决方案:
> z
$par
[1] 0.7510095 0.6954136
$value
[1] 18.76643
$counts
function gradient
59 NA
$convergence
[1] 0
$message
NULL
答案 1 :(得分:1)
主要问题是3和4被翻转。另一个是你的差异签署了。但是例行程序也可以收敛到不是绝对最小值的局部最小值。代替:
foo <- function(x) {
t=5-sqrt((0-x[1])^2+(0-x[2])^2);
u=3-sqrt((0-x[1])^2+(4-x[2])^2);
v=4-sqrt((3-x[1])^2+(0-x[2])^2);
return(sum(abs(t),abs(u),abs(v)))
}
optim(c(4,0), foo)