此算法通过在下限和上限之间迭代来查找给定值n
,类似于二进制搜索。如何改进此算法?一些细节。值n
几乎总是小于1.0,但这不是边界条件。但是,它永远不会少于0.
def approx_value(n, lower_bound, upper_bound, precision = 0.001):
approx = (lower_bound + upper_bound) / 2.0
while (abs(approx - n) > precision):
if n > approx:
lower_bound = approx
else:
upper_bound = approx
approx = (lower_bound + upper_bound) / 2.0
return approx
def approx_value_no_bounds(n, precision = 0.0001):
approx = 1.0
while (abs(approx - n) > precision):
if approx > n: #decrease volatility
return approx_value(n, 0.0, approx)
else:
approx *= 2
return approx
我知道这看起来很奇怪,因为已经提供了n
的值,但算法并不完整。基本上,n
是一个复杂方程的解,无法以封闭形式求解approx
,所以我是迭代地做的。最终,此算法将使用approx
与值n
比较函数的值,并返回approx
它是否足够接近输入变量。
我希望将运行时间保持在O(log(n))
,这就是为什么我在二进制搜索之后对它进行了一些建模,尽管只是因为上限不一定是立即知道的。
答案 0 :(得分:3)
这听起来像是一个典型的优化问题。这些都经过深入研究,并且有几种众所周知的算法。一些简单但合理有效的Newton's method或gradient descent。
如果上述方法对您的功能效果不佳,您也可以尝试使用nonlinear-simplex算法。
此处的运行时间与精度权衡取决于您尝试解决的功能的性质。
答案 1 :(得分:1)