设f是实数区间I上的一个单调的、严格的凸函数,设g是它的逆。例如,我们可以有f**(x)=e**x而g**(x)=logx。
现在,假设我们将结果四舍五入到N位数。也就是说,我们不是用f和g工作,而是用f**N和g**N其中
fN(x) = round*(f**(x*),N)
和
gN(x) = round(g*(x*),N)
和round*(y*,N)是将数字y四舍五入到N个有效数字[1]。
这就是我们用浮点运算实现我们的函数f和g时发生的情况。我们实际上并没有得到f和g的值,而是得到了f**N和g**N.
我们假设f和g是反的,但一般来说f**N和g**N不会是完全的反值。然而,在某种意义上说,函数f**N和g**N就像反相一样。哈罗德-戴蒙德[2]证明,如果来回应用f**N和g**N两次,在两次往返之后,数值就不再变化。
为了使之更精确,定义
hN(x) =g**N(fN(x)).
一般来说,hN(x)不等于x,但我们确实有以下情况。
h**N(h**N(hN(x) )) =h**N(hN(x) ).
我们从h中得到的值N**(x)得到的值可能不等于x,但在我们应用了h**N两次后,如果我们应用h**N更多的次数,数值就会保持不变。
与连接的联系
戴蒙德的稳定性定理看起来很像一个关于伽罗瓦连接的定理。我的第一反应是,戴蒙德的定理只是一个关于伽罗瓦连接的更一般的定理的一个特例,但它不是。
一对单调的函数F和G形成了一个伽罗华连接,如果对于F域中的所有a和G域中的所有b。
F*(a*)≤b⇔ a≤G**(b)。
让F和G形成一个伽罗瓦连接,并定义
H*(x*) =G(F*(x*) )。
那么
H(H*(x*) ) =H*(x*)。
这个结果类似于戴蒙德的结果,而且更有力。它说我们只需经过一次往返就能得到稳定,而不是两次。
问题是,虽然函数f和g形成了一个伽罗华连接,但函数f**N和g**N并非如此。然而,戴蒙德证明,f**N和g**N形成了某种较弱的伽罗华连接的数字类似物。
例子
下面的例子来自于[2]。请注意,这个例子是四舍五入到两个有效数字,而不是两个小数位。
from decimal import getcontext, Decimal
# round to two significant figures
getcontext().prec = 2
def round(x): return float( Decimal(x) + 0 )
def f(x): return 115 - 35/(x - 97)
def f2(x): return round(f(x))
def g(x): return 97 + 35/(115 - x)
def g2(x): return round(g(x))
def h2(x): return g2(f2(x))
N = 110
print(h2(N), h2(h2(N)), h2(h2(h2(N))))
这样就可以打印出
100.0 99.0 99.0
表明 它表明函数h2 满足Diamond定理,但它不满足上述对伽罗瓦组合的认定。也就是说,我们在两次往返后会稳定下来,但在仅仅一次往返后不会稳定。
相关文章
[1] 我们这里的 "数字 "不需要是基数10的数字。稳定性定理适用于任何子数b,只要b**N≥ 3.
[2] Harold G. Diamond.迭代下的舍入反数的稳定性.计算数学》,第32卷,第141号。1978年1月,第227-232页。
The postFloating point inverses and stabilityfirst appeared onJohn D. Cook.