65.9K
CodeProject 正在变化。 阅读更多。
Home

持续分数趣谈

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (8投票s)

2012年7月8日

CPOL

5分钟阅读

viewsIcon

45751

downloadIcon

414

演示了持续分数的计算及其用途。

引言   

连分数在很多方面都非常重要,因为它们在许多实际问题中都有应用,例如您想用一个近似分数来描述某事,或者您只是想用分数替换十进制数或双精度数。   

背景         

像在数学中一贯的那样,连分数的历史相当复杂。连分数的早期踪迹可以追溯到公元前 306 年。还发现了其他记录表明,印度数学家 Aryabhata 使用连分数来求解线性方程。

在西方世界,直到 17 世纪,William Brouncker 和 John Wallis 开始提出某种形式的连分数。荷兰数学家和天文学家 Christiaan Huygens 于 1687 年首次将该理论付诸实践,并撰写了一篇论文,解释如何使用渐近分数来获得最佳有理近似值来表示齿轮比。这些近似值使他能够选择具有最佳齿数的齿轮,因为他将要建造一个机械行星仪。   

连分数的表示和计算 

如何写连分数呢?好吧,让我们看一个简单的二次方程:      

x^2 - bx -1 = 0          

移项并除以 X,就可以这样重写:      

x = b + 1/x         

我们注意到左边有一个 X 的公式,右边也有一个 X。现在我们将右边的 X 替换为右边的公式。听起来很复杂,但这是进行一次替换后的结果:        

x = b + 1/(b + 1/x)         

我们可以无限次地进行此操作,得到一个连分数。如果我们代入 b = 1,我们将得到黄金分割比。 (要得到这个数字,只需在提交的程序中输入 (sqrt(5)-1)/2)。 

连分数的通用表示如下,其中 x 是一个数字(无理数或有理数),系数 a0、a1 等都是正整数。      

以这种方式书写连分数非常复杂,因此它们通常表示为系数序列,如下所示:     

       

有限数字将有有限的分数集,而无理数(sqrt(2))可以通过在中途停止于某个系数之一来得到有理近似表示。这称为连分数的n阶渐近分数。      

要计算 an 的数字,您只需执行以下操作:  

a0 = Math.Floor(some decimal number)    

我们还必须将剩余的数字存储在临时变量 b 中: 

b = some decimal number - Math.Floor(some decimal number)   

a1 = 1/(b)     

如果我们继续这样做,如下面的代码所示,我们将得到所有期望的展开: 

Private Function GetSeriesExpantion(ByVal input As Decimal, ByVal NrFraction As Integer) As Integer
    Dim intput As Decimal = input
    Dim temp_dec As Integer
    For i As Integer = 0 To NrFraction
        temp_dec = CInt(Math.Floor(intput))
        intput = intput - Math.Floor(intput)
        If Not intput = 0 Then
            intput = 1 / intput
        Else
            intput = 0
        End If
    Next
    Return temp_dec
End Function    

为了得到最终的 n 阶渐近分数,我设计了一个自定义的分数结构,它可以将一个整数加到一个分数上,结果将显示在程序中的 an 序列下方。 

连分数实战       

为什么要费这么大劲?好吧,事实证明连分数比 10 位数字系统(例如 Pi 的 314/100)能产生更好的近似值。
您还应该注意到,分数近似越好,An 序列中的数字越大,就越早得到。因此,最坏的情况是展开中的所有数字(在 An 序列中)都为 1。 

一个级数可以在一个很大的数字处终止的例子显示在第一个程序演示图中。这个结果是由 Ramanujan 发现的,他是一位非凡的数学天才。他研究了连分数,并发现了用于 pi 的近似公式。 

pi = (2143/22)^(1/4)          

这个结果精确到小数点后 8 位,这对于任何实际用途都应该足够好了!要了解为什么这个近似值如此有效,您应该注意文章开头的示例图。它显示了 pi^4 的连分数的展开,可以看到数字 a5 超过 16000,如果我们截断连分数的展开,我们将得到 Ramanujan 的 pi 近似公式中的数字。 

总结连分数的用途: 

  • 使用渐近分数可以创建误差很小的比例模型  
  • 与其他技术相比,它们的收敛速度相当快。       
  • 我们已经看到它们具有许多计算上的优点 
  • 它们能准确地表示所有实数    
  • 截断后能产生良好的近似值    
  • 它们易于比较   
  • 它们对数字 10 没有奇怪的偏好  

为什么我们不经常看到它们被使用?(我看到 codeproject 网站上有其他文章将十进制数转换为分数,这也应该通过使用连分数来完成。) 

历史  

本文所有解释都很大程度上基于下面引用的参考资料,我的贡献很小,因为我只编写了能够方便地计算它们的程序。   

求值器就是我之前为 复数 编写的那个,因为我没有权限发布摘自 "Programming Microsoft Visual Basic .NET" (2003) - Francesco Balena (pages 505 - 509.) 的带有双精度数的代码。求值器应该替换成一个接受十进制数的,以获得更准确的结果。  

参考文献       

在 fora.tv 上可以免费观看 Professor John Barrow 关于连分数的精彩视频,如果您想了解更多,请务必观看。本文部分内容来自他的视频:      

http://fora.tv/2010/11/16/Gresham_Professor_John_Barrow_Continued_Fractions   

以及 Barrow 网站上的一些描述:     

http://plus.maths.org/content/chaos-numberland-secret-life-continued-fractions 

其他一些有用的网站:      

http://archives.math.utk.edu/articles/atuyl/confrac/     

http://en.wikipedia.org/wiki/Continued_fraction      

http://www-math.mit.edu/phase2/UJM/vol1/COLLIN~1.PDF 

© . All rights reserved.