数列与 的探究
课程介绍
目標
本节的 python + Math ,带大家来算算数列与用数列来探索 。
数列就是体现程式“重复运算”的特性,要使用数列就需要理解抽象出“规律形式”的能力。
本节先从 Python 的 list 结构来探索数列,最后来用以下数列观察数列如何逼近 。
課程架構
前言与故事:
list 与数列:[15,5,16,16,28,32,51,38,26]
range 与等差数列:
for-loop 与三角垛数列:
import math 与 pi 的探讨 :
核心知識
語法
熟練 list 的用法: [2i+1 for i in range(1,n)]
熟練對 list 求和: sum([i for i in range(1,101) ])
了解格式化輸出: "1/{0:5} = {1:9.7f}".format(i,1.0/i)
引入函式庫:import math,
數學
能製造等差數列並求其和
能了解無窮數列有收斂與發散的區別
pi 的數列近似表達
思維與能力
能觀察數列的關係,並寫出其表示式
能分辨遞迴與迴圈的分別並了解其使用時機
課程內容
0 前言与故事
0.a Lotus 123
本次的 Python + Math 要来谈数列。操作数列是我早期接触电脑的回忆。在 14 岁时(1995)时,有了一台黑白的二手电脑,可能是 386 或 486 的电脑,电脑有个试算表软体叫 Lotus123 ,那时电脑也没什么游戏,我只是用试算表来做些计算。
0.b 神秘有趣的数学
那时还蛮喜欢跑书店,就是员林车站对面的金石堂书店,我还记得二楼有个书架,摆放些科普书,关于数学的书也没几本,但其中有本很吸引国二时的注意,就是这本孙文先编译的《神秘有趣的数学》。
里面列举很多数学的各方面的知识,也没什么证明,但就提些比较特别的结论。有章节提到了数列,谈到
又提到
0.C 用 Loutus 初次探索数列
如同这书名,这对 14 岁的我就是感到神秘有趣,那时让我印象深刻的还有
竟然左式的无理数会等于右式的有理数之和!我当时拿到 Lotus 时,就想到可以去验证他,那时看到荧幕上出现结果与 很靠近时,也真的很感动。有些事,虽然你理智上已经觉得他是正确,但实际操作见证时,就还是有不同层次的感觉。
算完平方的调和数列后,我就开始探索以下这数列:
竟然发现这串数列会靠近 而不是发散的情况,就感到很兴奋,我还记得隔天是周日早上,就拿着这自以为是新发现的成果去找数学老师。 现在想想也蛮好笑的,事隔 24 年这段天真的过程,还烙印在我脑海中。
1. list 与数列:[15,5,16,16,28,32,51,38,26]
1.a list 为一堆有顺序的资料:[1,2,3,4,5]
在 Python 中,list 是一串有顺序的资料,要制造 list 的方法很简单,就是把一串资料用 [ ] 包住,例如 [1,2,3,4,5]。
而 list 的结构,有包含些基本运算,例如 sum 求总和。
请执行以下程式码,并观察其结果
执行完后,更新数列为 1,4,9,16,25 并重新执行观察其结果。
以下为 1984 年后,中国队每届奥运金牌数量,请计算其总和。
15,5,16,16,28,32,51,38,26
1.b 计算数列平均
要求得数列的项数可以用 len 指令
请用 len(gold) 求上述数列共几项
在计算完总和后,要求平均,可以用 sum(a)/len(a).
其中 len 表示数列的长度(length), 也就是项数。
请计算 1984 年后,中国对奥运金牌的平均获奖数。
除了 sum, len 外,也有 max, min
也有个 sorted 函数可以排序
请计算 1,4,9,16,25 的平均
计算前请估算平均是否大於中位数 9
1.c 调整输出格式
当有多资料要输出时可利用 print
请分别输出以下两个数列的总和:
c1: 1, 2, 3, 4, 5
c2: 1, 8,27,64,125
可以在一个 print 内,输出多个资料,并用 , 分隔。 例如:
要在上述的输出再加入文字,可利用 format 的格式
1.d 取得数列的个别项与子数列
利用 index 可以取得某一元素在数列的位置(index)。
注意 list 的第一项的 index 为 0。
请找出 gold 的最大值在 list 的位置
请利用 1984 为第一项对应的年份,则最大值发生在那一年。(奥运四年举办一次)
若要取得数列 xxx 的第 k 项可用 xxx[k]
请执行以下程式,观察其 index 与这数在数列的位置
利用 [-1] 则可以由后往前数
若 index 中放入不在 index 的范围内的数 则会有错误讯息。
【习题1a】数列的建立
以下哪些是 Python 内可以正确建立 list 的方式。
【习题1b】计算平均
请完成以下程式来计算 [1,2,4,8,16,32,64] 的数列的总和与平均。
【习题1c】判断 index
请先想想以下程式码执行的结果。再执行一次程式来验证
【习题1d】奥运会金牌
以下为美国在 1984年后奥运会获得金牌的数量
83,36,37,44,37,36,36,46,46
请计算其平均获奖数,并列出其在 2008 年的获奖数
2 利用 for 製造有规律数列
2.a range 的使用
当我们想要运算 1+2+3+...+100 时,若直接输入 [1,2,3,4,...,100] 也太麻烦。
在 python 就要善用 range 这指令,你尝试输入以下指令来观看其结果
注意这数列的首项、末项为多少?
这数列共有几项?
在 for 前面的式子,就是數學上的一般項。
当要输出偶数数列时就用 2*k 来表示 要输出 2的次方数列时就用 2**k 来表示
2.b Range 的参数省略
若要产生奇数数列该如何制造呢?
以下哪些可以制造出 1,3,5,7,9呢?
请执行程式前先想想
在上述数列中, 使用 range(5) 其实与 range(0,5) 相同。
也就是当 range 只有一个参数时,只规定上界,而初始值为 0
已知西元 1900 年為鼠年,请列出 1900 年以後,生肖屬鼠的出生年。
2.c Range 的第 3 个参数
对於先前的 1,3,5,7,9 初了使用 2k+1, 2k-1 来表示外,
还可使用 Range 的第三个参数来调整。
执行前先想想,以下哪些可产生 1,3,5,7,9
利用 range 的第三个参数,请输出一个 1900 到 2050 的鼠年。
并统计共几个鼠年。
2.d 計算 1+2+...+10000 会花很久吗?
計算 1~100 個連續整數和
在上述求和中,其实计算机是逐项相加。
虽然计算机的计算速度很快,但项数很多时,还是要占很多空间,与时间。
试着将项数改为 来观察其计算时间。
此时数学就扮演着重要角色
等差数列的和可用公式 来得到,
其推导的过程为『倒写相加』
对电脑而言,利用公式来计算,会比直接生成数列快很多。
所以多些数学背景是可以大大提升程式的执行效率。
【试验】请调整不同的 n 值来计算以下等差的求和
【习题2a】等差数列
请试着用 list 的 for 来制造数列 1,4,7,10,...,31 并算其总和与平均
【习题2b】龙年
请试着写出一个数列来列出出 1900~2050 的龙年?(注意,1900年为鼠年,那哪年为龙年呢?)
解答中给了三种表示法,你可比较哪种表示法适合此题的叙述。
【习题2c】哈雷彗星
哈雷彗星的轨道周期约为 76 年。此慧星在 1608 年时被观测过,则接下来 10 次被观测的年份约为哪些年。
【习题2d】西洋棋与米粒
传说中,西洋棋的发明人向国王要了如下的奖赏
在第 格放入 粒米、在第 格放入 粒米、在第 格放入 粒米、 在第 格放入 粒米、
请计算所有米粒的数量和。
承上,假设每碗饭有 2000 颗米、每人一天吃了 3 碗饭,则这些米可供地球上 70 亿人吃多久?
3 for-loop 与三角垛数列 1 + (1+2) + (1+2+3) + (1+2+3+4)
3.a for-loop 来观察 1+3+5+...+(2n-1)
在前一节,要观察一个数列在不同项数时的变化,需重覆输入并修正程式码
上述程式码有很多重覆的结构,可用 for-loop 来简化。
请输入以下程式码
3.b 三角垛
利用 for 回圈,可以来计算出以下三角垛的数量。
第一层是 1 个、
第二层 1+2 个、两层共 1+(1+2)= 4 个。
第三层 1+2+3 个、三层共 1+(1+2)+(1+2+3) = 10 个。
第四层 1+2+3+4 个、四层共 1+(1+2)+(1+2+3)+(1+2+3+4) = 20 个。
请问累积到第五层共多少个?
上式中的 sum([k for k in range(1,i+1)])
其實就是等差數列
因此程式码可改写如下
对于上述的 for-loop 也可用 list 的方式呈现
3.c 三角垛 与 for-loop
可对 triDuo 再用一层 for 来比较不同的 n 值
对上述的总和其实也可用公式 来计算
请写个数列来显示
上列的总和竟然也可写为 !!!
用數學的 表達有如下關係:
3.d 一尺之棰,日取其半,万世不竭
请计算以下数列的总和:
可利用 {:2d}、{:10.8f} 来调整输出格式
【习题3a】立方和数列
请写个回圈比较以下两个数列的关系
【习题3b】n角数
(1) 下图为三角数,其圆圈的数量可表示为公差为 1 的数列和。
(2) 下图为四角数,其圆圈的数量可表示为公差为 3 的数列和。
(3) 下图为五角数,其圆圈的数量可表示为公差为 2 的数列和。
先观察第 2 层比第 1 层多 4 个,共 1 + 4 = 5 个。
先观察第 3 层比第 2 层多 7 个,共 1 + 4 + 7 = 12 个。
先观察第 4 层比第 3 层多 10 个,共 1 + 4 + 7 + 10 = 22 个。
(4) 下图为六角数,请列出每边有 个数的六角数。
先观察第 2 层比第 1 层多 5 个,共 1 + 5 = 6 个。
先观察第 3 层比第 2 层多 9 个,共 1 + 5 + 9 = 15 个。
先观察第 4 层比第 3 层多 13 个,共 1 + 5 + 9 + 13 = 28 个。
請列出一个表格显示 數量為 的 三角數、四角數、五角數、六角數。
【习题3c】四角垛
而 n 阶四角垛的总个数为 ,也可用公式来求 。
请分别用数列的和与数学公式来验证上述公式。
【补充】上述图形也可表示
利用公式来代换也可得到
【习题3d】等比数列
请计算以下数列的总和
输出时利用 {:10.8f} 来控制小数点以下有 8 位。
【数学】当 时, 的极限为 .
4 import math 与 pi 的探讨 :
4.a 调和数列
请计算下列算式到第 n 项的总和
File "<ipython-input-5-db2c7e9d8ac6>", line 2
seqH = [float(???) for k in range(Integer(1),N+Integer(1))]
^
SyntaxError: invalid syntax
请利用 for 上述数列在 n = 10, 100, 1000, 10000 项的总和变化
将上述输出结果格式化
这个调和数列是发散数列。
但这数列的近似值为
请比较这两个数值的差。(要用 log 需要 import math)
4.b 调和平方数列
请计算比较下列算式到第 n 项的总和
请比较此数列的总和与 的差距
4.c 交错数列
下列 的近似数列公式为 格雷果理在 1671 年发现,而莱布尼兹在 1674 年发现。
请先输出 1,-1,1,-1,1,-1,1 的数列
请输出 的数列
请输出 的数列
4.d 用乘法来估算 pi
约翰沃利斯在 1655 年发现了沃利斯乘积,是欧洲第二个无穷项圆周率公式。
请验算计算以下数列,先试着列出 2,2,4,4,6,6 与 1,3,5,7,9,13
使用 for-loop 将上述数逐项连乘再相除
利用 pyplot 来绘制 pyplot
【习题4a】Telescope 数列
请计算以下数列到 100, 1000, 10000 项的总和
请判断,此数列是否收收敛或发散?
【习题4b】交错数列与 ln
请写个函式来观察 与 的差距。
并用 matplotlib.pyplot 来绘制其收敛情况
Python 中, 要用 math.log(2) 来输出
【习题4c】Viete 的 pi 的逼近式
以下為 1593 年,由 Francois Viete 發現可用以下無窮數列來逼近 pi 的值的。請利用迴圈來計算其求 項的值。
【习题4d】多重根式与黄金比例
请用回圈计算以下数列 ,并比较此数列与 的关系。