Scheme 什么是定点?
我正在重播早些时候的一些讲座。定点的概念让我有点困惑。定点过程:我应该这样考虑吗,“这是找到给定函数的定点的方法。”那么给定的Scheme 什么是定点?,scheme,numerical-methods,sicp,fixpoint-combinators,fixed-point-iteration,Scheme,Numerical Methods,Sicp,Fixpoint Combinators,Fixed Point Iteration,我正在重播早些时候的一些讲座。定点的概念让我有点困惑。定点过程:我应该这样考虑吗,“这是找到给定函数的定点的方法。”那么给定的f(2)=2 另外,为什么在中说明映射到x/y的新函数y是一个固定点?根据: 在数学中,函数的不动点(有时简称为不动点,也称为不变点)是函数域中由函数映射到自身的元素 因此,正如您所写,f(2)=2表示2是一个固定点,而f说明了什么是固定点,但这仍然留下了问题的另一部分: 另外,为什么映射到x/y的新函数y是一个固定点 讲师在你提到的那一点上讲得很快,但我认为他实际上是这
f(2)=2
另外,为什么在中说明映射到x/y
的新函数y
是一个固定点?根据:
在数学中,函数的不动点(有时简称为不动点,也称为不变点)是函数域中由函数映射到自身的元素
因此,正如您所写,f(2)=2
表示2
是一个固定点,而f
说明了什么是固定点,但这仍然留下了问题的另一部分:
另外,为什么映射到x/y的新函数y是一个固定点
讲师在你提到的那一点上讲得很快,但我认为他实际上是这么说的√x是多个函数的不动点,这是一个明显的函数√x是一个不动点
y↦x/y
自
√x=x/√x
但是,给定的计算固定点的程序不适用于此函数,因为其内部程序
iter
循环初始值,并将函数应用于初始值。因此,新值/旧值的顺序是(1,2),(2,1),(1,2),…当您在迭代函数中得到与上次相同的结果时。要理解这一点,请想象一个已知序列的正常函数:
想象一下函数f(x)=2^(n+1)-1
。它被称为梅森序列,你应该给它一个从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
,因此只有没有固定点的函数将永远循环。这是我的两分钱。这确实令人困惑
首先,简单的定义是:点x
是函数f
的“固定点”,如果f(x)=x
换句话说,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
关键的部分不是等待无限的评估链结束(永远不会结束),而是有一个记录评估步骤进展的惰性列表。然后,我们的价值观——无限列表——被逐步定义:首先,它根本没有定义;然后定义了它的第一个(head)元素,其余的仍然没有定义;然后定义了它的前两个元素;等:[1.0,13.0,7.4615383,5.406027,5.0152473,5.000023,5.0,5.0,5.0,5.0…]
正如数值收敛到某个数字,越来越接近“最终”值(永远无法达到,但距离越来越小),结果的无限列表也会收敛到其最终值,即定义了所有元素的完全定义的无限列表(当然,这是一个不可能的壮举),在定义上越来越接近最终值(简单地说,它的元素一个接一个地定义,但数学家喜欢它的复杂性)
与函数类似。如果
g(h,n)=n1;else->n*h(h,n-1)
则g(error)
是一个只为n<2
定义的一个参数的(当前)函数,与任何其他参数一样,它将发散(导致错误)。但是g(error)
是为所有n<3
定义的;g(error))
-对于所有的n<4
,等等。同样,我们有一个越来越明确的值的级数……因此级数的极限,即“极限值”,函数g
的不动点是这样一个函数f
,即f=g(f)
它是为任何n
定义的,不管多大。它巧合地是一个阶乘函数,定义时没有使用递归。因此,如果我计算x/y的不动点,我将使用新的x/y值,并将其重新添加到我的不动点过程中。它最终将变为0?这就是为什么它是f