浮点求逆器和稳定性

144 阅读3分钟

f是实数区间I上的一个单调的、严格的凸函数,设g是它的逆。例如,我们可以有f**(x)=e**xg**(x)=logx

现在,假设我们将结果四舍五入到N位数。也就是说,我们不是用fg工作,而是用f**Ng**N其中

fN(x) = round*(f**(x*),N)

gN(x) = round(g*(x*),N)

和round*(y*,N)是将数字y四舍五入到N个有效数字[1]。

这就是我们用浮点运算实现我们的函数fg时发生的情况。我们实际上并没有得到fg的值,而是得到了f**Ng**N.

我们假设fg是反的,但一般来说f**Ng**N不会是完全的反值。然而,在某种意义上说,函数f**Ng**N就像反相一样。哈罗德-戴蒙德[2]证明,如果来回应用f**Ng**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更多的次数,数值就会保持不变。

与连接的联系

戴蒙德的稳定性定理看起来很像一个关于伽罗瓦连接的定理。我的第一反应是,戴蒙德的定理只是一个关于伽罗瓦连接的更一般的定理的一个特例,但它不是。

一对单调的函数FG形成了一个伽罗华连接,如果对于F域中的所有aG域中的所有b

F*(a*)≤b⇔ aG**(b)。

FG形成一个伽罗瓦连接,并定义

H*(x*) =G(F*(x*) )。

那么

H(H*(x*) ) =H*(x*)。

这个结果类似于戴蒙德的结果,而且更有力。它说我们只需经过一次往返就能得到稳定,而不是两次。

问题是,虽然函数fg形成了一个伽罗华连接,但函数f**Ng**N并非如此。然而,戴蒙德证明,f**Ng**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.