假设f(k)= exp(k / 200)-1并且我们想要最小化(f(a)+ f(b)+ f(c)+ f(d)-pi)^ 2。解决方案应为a = 6,b = 75,c = 89,d = 226.此解决方案的平方和为~8e-17。
sumsq <- function(theta, n=200) {
f <- function(k) exp(k/n) - 1
(f(theta[1]) + f(theta[2]) + f(theta[3]) + f(theta[4]) - pi)^2
}
theta <- optim(par=c(10, 90, 70, 300), fn=sumsq)
# theta$par = 62.97 106.89, 78.64, 189.82
# theta$value = 6.32e-10
# sumsq(c(6,75,89,226)) = 8.20e-17
很明显,a = 6,b = 75,c = 89,d = 226的解比优化函数通过比较平方和得到的解更好。我想知道如何通过其优化技术使R更准确。我也尝试过nlm()函数,但没有成功。
使用的pi的值是3.1415926535897931 - 我认为pi的准确性不是优化函数没有产生最优解的原因
答案 0 :(得分:2)
正如评论者所说,这不是optim
准确性的问题,而是optim
使用的算法可能不适合您的特定问题。 R中有very many个优化包和接口;我使用rgenoud
软件包获得了良好的结果,使用fitdist
软件包(我认为默认情况下使用optim
)来改进基于最大可能性的参数估算。
另一个问题当然是,你所提出的问题实际上是否具有全局最小值,可以与你可以指定/ R可以检测的数值公差内的其他局部最小值区分开来。 6.32e-10和8.20e-17都非常小,远远超出了我认为可以接受的数字公差......但我不知道你的领域。
答案 1 :(得分:2)
这不是一个很好的最小化问题。有无数可能的解决方案。其中之一是
a=b=c=d=200*log(1+pi/4)
在数值上大约是
115.92829021682383
如果插入数字,则此情况下的残差sumsq
为零(在数值精度范围内)。
如果要强加的话,问题可能要复杂得多,例如,只允许自然或仅允许整数的限制。在这种情况下,您的组合(及其排列)可能是最好的,但目前我不知道如何验证这一点。存在这种约束时的最小化将是质量上不同的问题,这对于数学家来说可能是有趣的。在任何情况下,通常的数值优化算法都不允许引入这样的约束。
答案 2 :(得分:1)
我使用了“BFGS”方法:
sumsq <- function(theta, n=200) {
f <- function(k) exp(k/n) - 1
(f(theta[1]) + f(theta[2]) + f(theta[3]) + f(theta[4]) - pi)^2
}
theta <- optim(par=c(10, 90, 70, 300), fn=sumsq, method="BFGS")
查看结果:
> theta
$par
[1] -2.629695 71.159586 52.952260 246.174513
$value
[1] 4.009243e-22
$counts
function gradient
19 8
$convergence
[1] 0