Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News Sign UpSign In
| Download

Python Sequence

Project: FirstIPython
Views: 1362
Kernel: SageMath (stable)

程式的優勢就是可重複做有規律、結構的事。

程式很適合處理數學中,數列的問題。

在此節,將計算出以下堆垛的數量。

1(A). 等差數列 1,2,3,...,10

使用指令 seq_d1 = [i for i in range(1,11)],

要使用 seq_d1 來顯示結果。

  • range(1,11) 的結果是不包含 11 的。

  • [... for ...] for 前面放數列的一般項表示式

  • 變數名稱可以更換。例如 [k for k in range(1,11)] 也會得到相同結果。

seq_d1 = [i**3 for i in range(1,11)] print(seq_d1) print(sum(seq_d1))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] 3025

1(B). 公差為 2 的等差數列 1, 3, ..., 19

seg_d2 為公差為 2 的等差數列,共 10 項。

  • range 的第三個參數為增量,例如 range(1,21,2) 表示每次 +2

  • range 只有兩個參數時,預設增量為 1。

seq_d2 = [i for i in range(1,21,3)] seq_d2 sum(seq_d2)
70

1(C). 公差為 -3 的等差數列

seq_d3 為首項 40 ,公差為 -3 的等差數列,共 10 項。

  • 只要把 range(40,1,-3) 的參數改為 -3 。

seq_d3 = [i for i in range (40,1,-3)] seq_d3
[40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4]

2(A). 數列的總和

seq_d1, seq_d2 的總和,記為 sum_d1, sum_d2

  • 使用 sum(seq_d1) 即可計算一個數列的總和。

sum_d1 = sum(seq_d1) sum_d2 = sum(seq_d2) print(seq_d1, "的總和為" , sum_d1) print(seq_d2, "的總和為" , sum_d2)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 的總和為 55 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 的總和為 100

2(B). 平方級數 1+ 4 + 9 + .... + 100

seq_s1 為平方項構成的數列: 1 ,4, 9, ..., 100 用 sum(seq_s1) 計算其總和

seq_s1 = [i**2 for i in range(1,11)] print(seq_s1, "的總和為" , sum(seq_s1))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 的總和為 385

3(A). 調和數列 : 1, 1/2, 1/3, 1/4,..., 1/10

調和數列(Harmonic series) 是指「倒數」構成的數列,

請定義一個函數 sumHarm(nn),此函數會回傳下列的數值

sumHarm(n)=11+12++1n\mbox{sumHarm}(n) = \dfrac{1}{1} + \dfrac{1}{2} + \cdots + \dfrac{1}{n}

請計算其 sumHarm(4), sumHarm(16), sumHarm(256) 的值

def sumHarm(n): temp = [1/i for i in range(1,n+1)] return sum(temp) print("%6.3f %6.3f %6.3f" %(sumHarm(4),sumHarm(16),sumHarm(256)))
2.083 3.381 6.124

3(B) list 內使用函數:製作調和數列總和的數列

製作數列 sumHarms: \langle sumHarm(1) , sumHarm(2)..., sumHarm(20) \rangle

  • 在 list 內的一般項也可以使用函數,

  • 使用 round(...,3) 來取其合的概數。

sumHarms = [sumHarm(i) for i in [3, 8, 10]] sumHarms
[1.8333333333333333, 2.7178571428571425, 2.9289682539682538]

4(A) 三角垛數列

計算 10 層三角垛的數量

def sumArith(n): temp = [i for i in range(1,n+1)] return sum(temp) def doubleSumArith(n): temp = [sumArith(i) for i in range(1,n+1)] return sum(temp) ariths = [i for i in range(1,11)] sumAriths = [sumArith(i) for i in range(1,11)] doubleSumAriths = [doubleSumArith(i) for i in range(1,11)] print(" n",' '.join(['%5d' %(n) for n in range(0,10)])) print(" sumArith",' '.join(['%5d' %(sumAriths[n]) for n in range(0,10)])) print("sumDouAri",' '.join(['%5d' %(doubleSumAriths[n]) for n in range(0,10)]))
n 0 1 2 3 4 5 6 7 8 9 sumArith 1 3 6 10 15 21 28 36 45 55 sumDouAri 1 4 10 20 35 56 84 120 165 220

4(B) 三角垛數列

利用公式來計算三角數與三角垛

n(n+1)2,n(n+1)(n+2)6\dfrac{n(n+1)}{2}, \dfrac{n(n+1)(n+2)}{6}
def triNum(n): return n*(n+1)/2 def doubleTriNum(n): return n*(n+1)*(n+2)/(2*3) triNums = [triNum(i) for i in range(1,11)] doubleTriNums = [doubleTriNum(i) for i in range(1,11)] print(triNums) print(doubleTriNums)
[1.0, 3.0, 6.0, 10.0, 15.0, 21.0, 28.0, 36.0, 45.0, 55.0] [1.0, 4.0, 10.0, 20.0, 35.0, 56.0, 84.0, 120.0, 165.0, 220.0]

Ex1(A) 等比數列

請建立以下等比數列,各 10 項:

sq1:1,2,4,8,16,sq_1: 1,2,4,8,16,\cdotssq2:1.1,1.12,1.13,1.14,sq_2: 1.1,1.1^2,1.1^3,1.1^4,\cdotssq3:1,12,14,18,sq_3: 1,\frac{1}{2},\frac{1}{4},\frac{1}{8},\cdots
sq1 = [2**(i-1) for i in range(1,11)] sq2 = [1.1**(i-1) for i in range(1,11)] sq3 = [0.5**(i-1) for i in range(1,11)] print(" n",' '.join(['%6d' %(n) for n in range(0,10)])) print("sq1",' '.join(['%6d' %(sq1[n]) for n in range(0,10)])) print("sq2",' '.join(['%6.3f' %(sq2[n]) for n in range(0,10)])) print("sq3",' '.join(['%6.3f' %(sq3[n]) for n in range(0,10)]))
n 0 1 2 3 4 5 6 7 8 9 sq1 1 2 4 8 16 32 64 128 256 512 sq2 1.000 1.100 1.210 1.331 1.464 1.611 1.772 1.949 2.144 2.358 sq3 1.000 0.500 0.250 0.125 0.062 0.031 0.016 0.008 0.004 0.002

Ex1(B) 等比數列

請先試著列出公比為 1.1 1.1 、首項 1.11.1 的等比數列,並找出 1.1n<21.1^n < 2 的最小整數 nn 值。

請先試著列出公比為 1.1 1.1 、首項 1.11.1 的等比數列,並找出 1.1m<101.1^m < 10 的最小整數 mm 值。

  • 在條列前,先試當作些估計合理的範圍。

  • 之後,可利用條件迴圈來讓程式更快找出此解。

  • 也可以利用對數的概念來計算出 n 值

ex1b1 = [1.1**(i) for i in range(1,11)] ex1b2 = [1.1**(i) for i in range(20,30)] print("b1",' '.join(['%2d: %5.2f' %(n,ex1b1[n]) for n in range(0,10)])) print("b2",' '.join(['%2d: %5.2f' %(n+20,ex1b2[n]) for n in range(0,10)]))
b1 0: 1.10 1: 1.21 2: 1.33 3: 1.46 4: 1.61 5: 1.77 6: 1.95 7: 2.14 8: 2.36 9: 2.59 b2 20: 6.73 21: 7.40 22: 8.14 23: 8.95 24: 9.85 25: 10.83 26: 11.92 27: 13.11 28: 14.42 29: 15.86

Ex2(A) 級數和

請試著計算以下級數至第 10 項, 100 項 1000 項

ex2a1:1+12+14++12n\mbox{ex2a1}: 1+ \dfrac{1}{2} + \dfrac{1}{4} + \cdots + \dfrac{1}{2^n}

ex2a2:1+13+19++13n\mbox{ex2a2}: 1+ \dfrac{1}{3} + \dfrac{1}{9} + \cdots + \dfrac{1}{3^n}

ex2a3:1+122+132++12n\mbox{ex2a3}: 1+ \dfrac{1}{2^2} + \dfrac{1}{3^2} + \cdots + \dfrac{1}{2^n}

ex2a4:1+12+13++1n\mbox{ex2a4}: 1+ \dfrac{1}{\sqrt{2}} + \dfrac{1}{\sqrt{3}} + \cdots + \dfrac{1}{\sqrt{n}}

ex2a = [i/(2**i) for i in range(1,11) ] sum(ex2a)
1.98828125