你也许到处听说黄金分割点这个名词,如果知道“斐波那契数列”,也许知道斐波那契数列和黄金分割的关系。今天有图不但通过程序寻找黄金分割点,更让大家看到更多的关于黄金分割的有趣的东西。
黄金分隔点是数学和工程等诸多领域都存在的一个奇妙的数字,学过初中的朋友都知道黄金分隔的约数是0.618,精确度稍微高一点可以记为:0.6180339887 4989484820 4586834366 由于按此比例设计的造型十分美丽,因此被广泛应用于建筑、设计、工程等。
在数学上可以轻松做到黄金分割点,下图中的C点是AB线段的黄金分割点。
此图中的 AC:AB 约等于 0.618
其实还隐藏了一个黄金分割 BC:AC 约等于 0.618 为什呢?
BC:AC=(1-0.618):0.618 约等于 0.618
是不是很奇妙?
下面看看大名鼎鼎的斐波那契数列:1、1、2、3、5、8、13、21、34……n、m、(n+m)、(m+(n+m))……
我们可以清晰地看到这个数列的规律是从1开始,从第二项开始,后面的数字等于前面相邻两个数字之和。
那么这个黄金分割点和斐波那契数列有什么关系呢?当我们仔细研究发现斐波那契数列相邻的两个数字之商越来约接近黄金分割点:0.618……
也许我们觉得那样计算很麻烦,特别是让我们一个非常接近黄金分隔的数字时,我们要计算很大的两个数字之商方能最接近这个黄金分隔,所以我们可以借助QBasic程序来实现。依据数列我们可以尝试写出一下程序
cls
a=1
b=1
for i=1 to 10
a=a+b
b=a+b
next i
print a/b
end
此处的for i=1 to 10是让我们的a、b相互加多少此循环,10并不算多,这个数字越大,得到的斐波那契数列的值越大,最后相邻项值越接近黄金分割。但是我们不能设定的太大,因为太大计算机需要计算很久。我们不许要设定很大的数字已经可以证明到这一点了。
运行结果,如下图
你也许想看到更多的位数,这是我们今天所要给大家所介绍的关于数据精度的问题,qbasic中有以下常用的数据类型供我们使用:
INTEGER:整型;
LONG:长整型
SINGLE:单精度型
DOUBLE:双精度型
STRING:字符串型
我们可以用DIM as语句来指定一个变量属于上述几种类型,从而可以给我们的变量适当的类型和精度。
依据此例我们可以给 a/b 提高一点精确度来看到后面的位数,如我们可以将 a/b 赋值给一个变量,并在程序的开始给这个变量定义一个双精度的变量数据类型。
cls
dim x as double
a=1
b=1
for i=1 to 10
a=a+b
b=a+b
next i
x=a/b
print x
end
运行结果:
如果我们将其中的循环变量10改的稍大一些,得到的数字更接近真实的黄金分隔数值。
下面我们来验证一下文章开头所说的那个有趣问题: BC:AC=(1-0.618):0.618 约等于 0.618
此程序中,经过n次循环之后,a/b如果约等于 AC/AB 的话 那么BC/AC应该表示为(b-a)/a,我们可以将此例子在程序中做一验证,看看是否也是约等于0.618呢?
cls
dim x as double
a=1
b=1
for i=1 to 10
a=a+b
b=a+b
next i
x=(b-a)/a
print x
end
运行的结果和上图稍微有些差别,但是基本不差,设想如果a、b足够大的话,a/b的结果和(b-a)/a的结果是非常接近的。
其实我们仔细观察就可以发现 b-a 其实就是 a 前面的数值,那么它和a也是相邻的,依旧符合黄金分隔点的估计:斐波那契数列的相邻两个数值之比接近黄金分割点。
另外还有一个小秘密:其实我们将a和b的初始值随意设,只要经过a+b这样的循环运算,都不影响我们最终的黄金分隔的值,例如你可以将a设为100,或者将b设为1000,虽然所得结果和我们上面的数字不一样了,但如果我们逐步调大循环的次数,终究也是非常接近黄金分割的值。这个有趣的发现留给大家自己去玩。
留给大家一个作业,我们今天讨论这么多黄金分割点的问题,那么请问如何计算斐波那契数列的第N项的值呢?后面有时间,我给大家作答,需要提醒的是,前面的a=1和b=1已经列出两项了,而关键的把握有两点:1、需要循环几次?2、N是奇数还是偶数?(奇数和偶数的判断用if语句吧)
今天我们主要讨论黄金分割问题的分析解决过程,从开始的粗略,到后面的逐步分析,涉及到了数据类型的定义是新的内容,你有什么建议可以留言,更多内容参考有图编写的qbasic教程。
楼主最近还看过