固定点是什么?

4
我正在重新观看SICP的一些早期讲座。固定点的概念有点令我困惑。固定点过程:我应该这样考虑它,“这是找到给定函数的固定点的方法。”那么,如果给定f(2)= 2呢?
另外,在this lecture中为什么要声明一个将映射到x / y的新函数y是一个固定点?

4个回答

2

所以如果我计算 x / y 的定点值,我使用 X / Y 的新值,并将其重新插入到我的定点过程中。它最终会变成0吗?这就是为什么它是一个定点的原因吗? - runners3431
y = x / y2 = 2 / 1 -> 步骤1 让y = 2 1 = 2 / 2 -> 让y = 1 2 = 2 / 1 - runners3431
@runners3431,你能把问题表述得更清楚一些吗?表达式“x / y”有两个变量。你可以谈论一个变量函数的固定点。其中一个变量xy应该是常数吗? - Joshua Taylor
刚刚将其添加到主要描述中。 - runners3431

2
Just Ethier's answer讲解了什么是不动点,但这仍然留下了你问题的另一部分:
引用: 也就是说,为什么新函数y映射到x / y是一个不动点?
讲师在你提到的那个地方说话很快,但我认为他实际上是在说√x是不止一个函数的不动点,而且一个明显的函数,其中√x是不动点,就是
y↦x/y
因为
√x = x / √x
然而,给定的计算不动点的过程对于这个函数不起作用,因为它的内部过程iter在初始值和应用于初始值的函数上循环。因此,新/旧值序列为(1,2),(2,1),(1,2),...

Joshua,我知道这是一个老问题,但是你能否详细说明一下“因此新/旧值的序列为(1,2),(2,1),(1,2)…”?我理解(至少我认为是这样)√x=x/√x映射到自身,从而进入无限循环(即我们将无法通过替换得到√x的定义,因为√x包含在定义中)。但我很难理解(1,2),(2,1),(1,2),…来自哪里。 - user8554766
2
如视频中 @FilippW. 讲师所说,如果我们使用 g(y) = x / y 并通过重复应用 g 来计算值的处理过程,从 1 开始; 在情况 x = 2 的情况下,我们得到:g(1) = 2; g(2) = 1; g(1) = 2 再次循环,整个过程只是“振荡”-在这两个值之间循环。而“do-until”过程则使用它们的一对 - g 的参数和其结果。 - Will Ness
@WillNess,很高兴再次看到您的留言 =)一如既往的精彩解释,现在我懂了!非常感谢! - user8554766

1
这是我的看法。它确实可能会让人感到困惑。
首先,简单地定义:如果f(x) == x,则点x是函数f的“不动点”。
换句话说,x = f(x)。
上述内容有任何意义吗?似乎不太可能。毕竟,它使用了正在定义的值。
但是,x不一定是一个简单的数字。它可以是一个函数或一个懒惰的无限列表,并且f可以部分地定义它。然后,通过重复评估...
x = f(x) = f( f(x)) = f( f( f(x))) = f( f( f( f(x)))) = ....

价值越来越被定义。现在这确实让我们想起了通过迭代计算计算固定点 f(y) = (y + n/y)/2 的数字示例。
n=25; f(1.0)=13.0; f(13.0)=7.4615383; f(7.4615383)=5.406027;
      f(5.406027)=5.0152473, f(5.0152473)=5.0152473; f(5.0152473)=5.0

关键的部分不是等待无限的评估链完成(它永远不会完成),而是拥有一个惰性列表记录评估步骤的进展。然后,我们的值——无限列表正在逐步定义:首先它根本没有定义;然后它的第一个(头)元素被定义,其余部分仍未定义;然后定义了它的前两个元素;等等等等:[1.0,13.0,7.4615383,5.406027,5.0152473,5.000023,5.0,5.0,5.0 ...]
就像数值正在收敛到某个数字,越来越接近“最终”值(虽然从未真正达到,但距离越来越小),无限结果列表也正在收敛到其最终值,即具有所有元素定义的完全定义的无限列表(当然,这是一项相当不可能的壮举),在“定义度”上越来越接近该最终值(简单地说,一个接一个地定义其元素,但数学家喜欢把它弄得复杂)。
同样的,对于函数也是如此。如果g(h,n) = n<2 -> 1 ; else -> n*h(h,n-1),那么g(error)是一个柯里化的单参数函数,仅在n < 2时定义,因为对于任何其他参数,它都会发散(引起错误)。但是g(g(error))对于所有的n < 3是有定义的;g(g(g(error)))对于所有的n < 4是有定义的,以此类推。我们又一次有了越来越多被定义的数值序列……因此,该序列的极限值,即“最终值”,函数g的不动点是这样一个函数f,满足f = g(f),可以为任何n进行定义,无论其大小。巧合的是,这是一个阶乘函数,没有使用递归定义。

1
当你在迭代函数中得到与上次相同的结果时,就会出现这种情况。为了理解这一点,想象一个已知序列的普通函数:
想象函数 f(x) = 2^(n+1)-1。它被称为 Mersenne 序列,你应该从 0 开始输入索引,它将生成序列 1, 3, 7, 15, 31, ... (基本上每个 2 的幂次方减 1)
现在你可以通过将函数变成迭代形式来生成相同的序列。迭代版本是 f(x) = 2x + 1。现在 x 不再是索引,而是前一个结果。你从 0 开始,并得到 1, 3, 7, 15, 31, ...
现在这个函数没有固定点,因为应用它的结果总是大于它的参数。我们可以说它会爆炸。
回答你的第一个问题。在SICP视频中,他们谈论了平方根。n的平方根是迭代函数f(x) = n/x的不动点,因为sqrt(x^2) = x它不映射到其他函数。
一个一般的不动点函数就像他们定义的不动点,即你迭代一个函数直到你输入的值等于(或足够接近)下一个计算出的数字。
现在我们看到,我们无法从Mersenne找到一个不动点,我们知道我们需要平均阻尼n/x使其收敛,但有些函数实际上可以自行收敛,比如f(x) = x/4 + 1收敛到3/2。请注意,即使你将其平均阻尼,它仍将变为3/2,因此只有没有不动点的函数才会永远循环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接