【发布时间】:2015-11-07 22:00:25
【问题描述】:
假设 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 的解比 optim 函数通过比较平方和给出的解要好。我想知道如何使用其优化技术使 R 更准确。我也试过nlm()函数,没有成功。
使用的 pi 值是 3.1415926535897931 - 我认为 pi 的准确性不是 optim 函数没有产生最优解的原因
【问题讨论】:
-
我并不真正关心这个特殊的问题,而是关心如何提高 R 优化技术的准确性
-
R 认为这些数字没有什么不同:
all.equal(theta$value, sumsq(c(6,75,89,226)))并且等于零all.equal(theta$value,0)。您能否缩放函数以使数值求解器的差异更加明显? -
我猜这个问题有几个解决方案。我怀疑如果您采用不同的起始条件,您会发现不同的最小值。这将是数值优化问题的特征,与 R 无关。
-
但这很奇怪——我可以暴力破解自然数的解决方案,226^4 次迭代并得到结果(一个简单的解决方案)。肯定有一种方法可以提高 optim 寻找的准确性吗?
-
基本上你正在尝试寻找 f(a)+f(b)+f(c)+f(d)=pi 的解决方案。我不是数学家,但我认为可以安全地假设有无限数量的组合(a、b、c、d)可以满足这个条件。鉴于此,找到您正在寻找的一个组合只是一个巧合。
标签: r precision floating-accuracy