阅读this问题让我思考:对于给定的函数f
,我们怎么知道这种形式的循环:
while (x > 2)
x = f(x)
会停止任何值x
吗?有一些简单的标准吗?
(f(x) < x
的{{1}}似乎没有帮助,因为该系列可能会收敛。)
具体来说,我们可以为x > 2
和sqrt
答案 0 :(得分:5)
对于这些功能,ceil(f(x))<x
x > 2
的证明就足够了。你可以做一次迭代 - 得到一个整数,然后通过简单的归纳进行。
对于一般情况,最好的想法是使用well-founded induction来证明这个属性。然而,正如Moron在评论中指出的那样,在一般情况下这可能是不可能的,在许多情况下,正确的排序很难找到。
编辑,回复Amnon的评论:
如果你想使用有根据的归纳法,你必须定义另一个严格的命令,这是有根据的。如果您提到的功能并不难:您可以x << y
当{且仅ceil(x) < ceil(y)
<<
,其中sqrt
是此新订单的符号。当然,这个顺序对于大于2的数字是有充分根据的,并且log
和{{1}}都在减少 - 所以你可以应用有根据的归纳。
当然,在一般情况下,这样的订单更难以找到。这在某种程度上也与Hoare logic中的完全正确性断言有关,您需要在每个循环结构上保证类似的义务。
答案 1 :(得分:3)
当迭代序列收敛时,有一个一般定理。 (收敛序列可能不会在有限数量的步骤中停止,但它越来越接近目标。你可以通过在序列中走得足够远而尽可能接近目标。)
如果f是收缩映射,则序列x,f(x),f(f(x)),...将收敛。即,存在正常数k&lt;这样,对于所有x和y,| f(x) - f(y)| &lt; = k | x-y |。
答案 2 :(得分:2)
(对于x> 2的f(x)&lt; x似乎没有帮助,因为该系列可能会收敛)。
如果我们在这里谈论花车,那不是真的。如果所有x > n
f(x)
严格小于x
,则在某个时间点会达到n
(因为任意两个数字之间只有有限数量的浮点值)
当然这意味着您需要使用浮点运算证明f(x)
实际上小于x
(即证明它小于x在数学上是不够的,因为那时f(x) = x
当差异不足时,浮动可能仍然是真的。)
答案 3 :(得分:2)
没有通用算法来确定函数f
和变量x
是否会在该循环中结束。暂停问题可以解决这个问题。
对于sqrt
和log
,我们可以安全地做到这一点,因为我们碰巧知道这些函数的数学属性。比如,sqrt
接近1,log
最终变为负数。所以条件x < 2
在某些时候必须是假的。
希望有所帮助。
答案 4 :(得分:1)
在一般情况下,所有可以说的是,当遇到x i ≤2时,循环将终止。这并不意味着序列会收敛,也不意味着它被限制在2以下。它只意味着序列包含一个不大于2的值。
也就是说,任何包含收敛到严格小于2的值的子序列的序列将(最终)停止。这就是序列x i + 1 = sqrt(x i )的情况,因为x收敛于1.在y i + 1 <的情况下/ sub> = log(y i ),在为 R 的元素变为未定义之前,它将包含一个小于2的值(尽管它在扩展复平面上定义良好) , C * ,但我不认为它会一般收敛,除了可能存在的任何稳定点(即z = log(z))。最终这意味着你需要对序列进行一些前期分析,以更好地理解其行为。
将序列x i 收敛到点z的标准测试是给出ε&gt;在0中,存在n,使得对于所有i> n,| x i - z | &LT; ε。
另外,请考虑Mandelbrot Set, M 。对 M 中元素的 C 中特定点c的测试是序列z i + 1 = z i < / sub> 2 + c是无界的,只要有| z i |就会出现这种情况。 &GT; 2. M 的某些元素可能会收敛(例如0),但很多元素不会收敛(例如-1)。
答案 5 :(得分:1)
不确定。对于所有正数x
,以下不等式成立:
log(x) <= x - 1
(这是真实分析的一个非常基本的结果;它足以观察log
的二阶导数对于所有正x
总是负的,所以函数是向下凹的,并且{ {1}}与x-1
处的函数相切。从此基本上可以看出,您的x = 1
循环必须在第一个while
步骤中终止 - 尽管实际上它终止的速度远远快于此。
类似的论点将确定ceil(x) - 2
的结果;具体来说,您可以使用以下事实:
f(x) = sqrt(x)
所有正面sqrt(x) <= x/(2 sqrt(2)) + 1/sqrt(2)
。
如果你问这个结果是否适用于实际程序,而不是数学上,答案会有点细微差别,但并不多。基本上,许多语言实际上对x
函数没有硬性准确度要求,因此如果您的特定语言实现具有绝对可怕的数学库,则此属性可能无法保持。也就是说,它需要是一个非常非常糟糕的库;该属性适用于log
的任何合理实施。
答案 6 :(得分:0)
我建议阅读提供有用指针的this wikipedia entry。没有关于f的额外知识,没有什么可说的。