科學計算基礎編程 — Python 版, 5/e (A Primer on Scientific Programming with Python, 5/e)

Hans Petter Langtangen 張春元 劉萬偉 毛曉光 陳立前 週會平 李暾 譯

買這商品的人也買了...

商品描述

本書通過數學和自然科學中的計算例子來講授計算機程序設計。
選擇語法簡單緊湊且功能強大的Python語言作為編程語言。
本書關注於問題的計算求解過程,而不是程序語言細節,
書中使用了大量的案例,並專注問題定義、分析和程序求解以及程序正確性驗證。
通過本書的學習,讀者將能使用程序員的方式進行思考,並能寫出正確優質的程序。

作者簡介

張春元

國防科技大學計算機學院副院長,博士,教授,博士生導師,
計算機體系結構專家,學術帶頭人,著有《計算機體系結構》等教材。


毛曉光

國防科技大學計算機學院計算機系副主任,博士,教授,博士生導師,著有《離散數學》等教材。

目錄大綱

第1章公式的計算1
1.1編程計算:第一個公式1
1.1.1用程序作計算器1
1.1.2程序和編程2
1.1.3編寫程序的工具2
1.1.4第一個Python程序3
1.1.5輸入程序文本時的警告3
1.1.6驗證結果4
1.1.7變量4
1.1.8變量名4
1.1.9Python中的保留字5
1.1.10註釋5
1.1.11指定文字和數字的輸出格式6
1.2計算機專業術語9
1.3計算另一個公式:攝氏度與華氏度的轉換12
1.3.1容易被忽略的錯誤:整數除法12
1.3.2Python中的對象13
1.3.3避免整數除法14
1.3.4算術運算符和優先級15
1.4求標準數學函數的值15
1.4.1示例:使用平方根函數15
1.4.2示例:計算sinh x17
1.4.3初窺舍入誤差17
1.5交互式計算18
1.5.1使用Python shell18
1.5.2類型轉換19
1.5. 3IPython20
1.6複數23
1.6.1Python中的複數運算23
1.6.2Python中的複函數24
1.6.3實數函數與復數函數的統一處理25
1.7符號計算26
1.7.1基本的微分和積分26
1.7.2方程求解27
1.7.3泰勒級數和其他28
1.8本章小結28
1.8.1本章主題28
1.8.2示例:球的軌跡31
1.8.3關於本書中的排版約定32
1.9習題33

第2章循環與列表41
2.1while循環41
2.1.1最直接的方法41
2.1.2while循環42
2.1.3布爾表達式43
2.1.4示例:累加求和45
2.2列表46
2.2.1列表的基本操作46
2.2.2for循環48
2.3列表和循環的替代實現50
2.3.1用while循環實現for循環50
2.3.2Range結構50
2.3.3用for循環對列表索引進行迭代51
2.3.4修改列表元素52
2.3.5列表推導式53
2.3.6同時遍歷多個列表53
2.4嵌套列表54
2.4.1表格: “行”或“列”構成的列表54
2.4.2打印對象55
2.4.3提取子列表56
2.4.4遍歷嵌套列表58
2.5元組60
2.6本章小結61
2.6.1本章主題61
2.6.2示例:分析列表數據64
2.6.3如何找到更多的Python信息66
2.7習題67

第3章函數與分支74
3.1函數74
3.1.1數學函數作為Python函數74
3.1.2了解程序執行過程75
3.1.3局部變量和全局變量76
3.1.4多參數78
3.1.5使用函數參數還是全局變量79
3.1.6非數學函數79
3.1.7返回多個值80
3.1.8求和81
3.1.9無返回值82
3.1.10關鍵字參數84
3.1.11文檔字符串85
3.1.12函數作為函數的參數87
3.1.13主程序89
3.1.14lambda函數89
3.2分支90
3.2.1ifelse語句90
3.2.2內嵌if語句92
3.3混合循環、分支、函數的生物信息學應用示例93
3.3.1DNA字符串中的字母計數93
3.3.2效率評估96
3.3.3驗證實現98
3.4本章小結99
3.4.1本章主題99
3.4.2示例:數值積分100
3.5習題104

第4章用戶輸入和錯誤管理120
4.1提出問題和讀入應答120
4.2從命令行讀取121
4.2.1在命令行上提供輸入121
4.2.2可變數量的命令行參數122
4.2.3關於命令行參數的進一步理解123
4.3將用戶文本轉換為活躍對象123
4.3.1神奇的eval函數124
4.3.2神奇的exec函數127
4.3.3將字符串表達式轉換為函數129
4.4命令行上的參數名值對130
4.4.1argparse模塊的基本用法130
4.4.2將數學表達式作為值131
4.5從文件中讀取數據133
4.5.1逐行讀取文件134
4.5.2其他讀取文件的方法135
4.5.3讀取文本和數字的混合文件137
4.6將數據寫入文件138
4.6.1示例:將表格寫入文件139
4.6.2標準輸入和輸出作為文件對象140
4.6.3文件到底是什麼142
4.7錯誤處理144
4.7.1異常處理145
4.7.2產生異常148
4.8圖形化的用戶界面150
4.9製作模塊151
4.9.1示例:銀行存款利息152
4.9.2將函數收集在模塊文件中153
4.9.3測試塊153
4.9.4驗證模塊代碼155
4.9.5獲取輸入數據156
4.9.6模塊中的文檔字符串158
4.9.7使用模塊158
4.9.8發布模塊161
4.9 .9使軟件在互聯網上可用161
4.10Python 2和Python 3的代碼162
4.10.1Python 2和Python 3的基本差異162
4.10.2將Python 2代碼轉換為Python 3代碼163
4.11本章小結165
4.11.1本章主題165
4.11.2示例:二分查找168
4.12習題175

第5章數組計算和曲線繪圖182
5.1向量182
5.1.1向量的概念182
5.1.2向量的數學運算183
5.1.3向量算術和向量函數184
5.2Python程序中的數組185
5.2.1用列表來收集函數數據185
5.2.2Numerical Python的數組基礎186
5.2.3計算坐標和函數值187
5.2.4向量化188
5.3繪製函數曲線190
5.3.1用Matplotlib實現MATLAB風格的繪圖190
5.3.2Matplotlib和Pyplot前綴194
5.3.3SciTools和Easyviz195
5.3.4製作動畫200
5.3.5製作視頻204
5.3.6用文本字符繪製曲線205
5.4繪製高難度函數206
5.4.1分段定義函數206
5.4.2快速變化函數208
5.5更高級的函數向量化209
5.5.1StringFunction對象向量化209
5.5.2Heaviside函數向量化210
5.5.3帽狀函數向量化213
5.6Numerical Python數組深入剖析215
5.6. 1複製數組215
5.6.2原地運算216
5.6.3數組分配217
5.6.4廣義索引217
5.6.5數組類型檢測218
5.6.6數組生成的緊湊語法219
5.6.7形狀操作219
5.7數組的高性能計算219
5.7.1標量實現方式220
5.7.2向量化實現方式221
5.7.3節省內存的實現方式221
5.7.4內存使用分析222
5.7.5CPU時間分析223
5.8高維數組224
5.8.1矩陣與數組224
5.8.2Python的二維數值數組225
5.8.3數組計算228
5.8.4矩陣對象228
5.9一些常見的線性代數運算229
5.9.1逆、行列式和特徵值229
5.9.2乘積230
5.9.3範數230
5.9.4和與極值230
5.9.5索引232
5.9.6轉置和上/下三角部分232
5.9.7求解線性方程組233
5.9.8矩陣的行列操作233
5.9.9計算矩陣的秩234
5.9.10符號化線性代數235
5.10繪製標量和向量場237
5.10.1安裝237
5.10.2曲面繪圖238
5.10.3參數化曲線239
5.10.4等高線239
5.10.5梯度向量場240
5.11Matplotlib240
5.11.1曲面繪圖241
5.11.2等高線繪圖241
5.11.3向量場繪圖243
5.12Mayavi243
5.12.1曲面繪圖244
5.12.2等高線繪圖245
5.12.3向量場繪圖247
5.12.4一個3D標量場及其梯度場247
5.12.5動畫249
5.13本章小結249
5.13.1本章主題249
5.13.2示例:動畫函數251
5.14習題254

第6章字典與字符串269
6.1字典269
6.1.1創建字典269
6.1.2字典操作270
6.1.3示例:多項式作為字典271
6.1.4具有默認值和排序的字典273
6.1.5示例:在字典中存儲文件數據276
6.1.6示例:在嵌套字典中存儲文件數據277
6.1.7示例:讀取和繪製在特定日期記錄的數據281
6.2字符串285
6.2.1字符串常見操作285
6.2.2示例:讀取數值對289
6.2.3示例:讀取坐標292
6.3從網頁讀取數據294
6.3.1關於網頁294
6.3.2如何編程訪問網頁295
6.3.3示例:讀取純文本文件296
6.3.4示例:從HTML提取數據298
6.3.5處理非英文文本298
6.4讀寫電子表格文件301
6.4.1CSV文件301
6.4.2讀取CSV文件302
6.4.3處理電子表格數據303
6.4.4寫入CSV文件303
6.4.5用Numerical Python數組表示數值單元格304
6.4. 6使用更高級的NumericalPython功能305
6.5分析DNA的示例306
6.5.1計算頻率306
6.5.2分析頻率矩陣313
6.5.3尋找鹼基頻率315
6.5.4將基因轉換成蛋白質318
6.5.5有的人可以喝牛奶,而有的人則不能323
6.6編寫兼容Python 2和Python 3的代碼324
6.6.1Python 2和Python 3之間更多的差異324
6.6.2將Python 2代碼轉換成
Python 3代碼325
6.7本章小結325
6.7.1本章主題325
6.7.2示例:文件數據庫328
6.8習題331

第7章Python類簡介337
7.1簡單函數類337
7.1.1挑戰:帶參數的函數337
7.1.2將函數表示為類339
7.1. 3self變量343
7.1.4另一個函數類的例子344
7.1.5另一種函數類的實現345
7.1.6無構造方法的類347
7.1.7閉包349
7.2更多關於類的例子350
7.2.1銀行賬戶350
7.2.2電話簿352
7.2.3圓354
7.3特殊方法355
7.3.1call特殊方法355
7.3.2示例: Automagic差分356
7.3.3示例: Automagic積分360
7.3.4將實例轉換為字符串362
7.3.5使用特殊方法的電話簿363
7.3.6支持加法的對象364
7.3.7示例:多項式的類364
7.3.8多項式的精美打印367
7.3.9算術運算和其他特殊方法369
7.3.10字符串轉換的特殊方法369
7.4示例:平面中向量的類371
7.4.1對向量的一些數學運算371
7.4.2實現371
7.4.3用法373
7.5示例:複數類374
7.5.1實現374
7.5.2非法操作376
7.5.3複數與實數混合運算376
7.5.4動態類型、靜態類型、強類型、弱類型和Duck類型377
7.5.5應用於右操作數的特殊方法378
7.5.6檢查實例379
7.6靜態方法和屬性380
7.7本章小結381
7.7.1本章主題381
7.7.2示例:區間運算383
7.8習題387

第8章隨機數和簡單的遊戲401
8.1生成隨機數401
8.1.1種子401
8.1.2均勻分佈的隨機數402
8.1.3可視化分佈情況402
8.1.4隨機數生成的向量化403
8.1.5計算平均值和標準差404
8.1.6高斯或正態分佈406
8.2生成整數407
8.2.1隨機整數函數407
8.2.2示例:投擲骰子408
8.2.3根據列表生成隨機數410
8.2.4示例:從整副牌中選牌411
8.2.5示例:牌的類實現413
8.3計算概率416
8.3.1蒙特卡羅模擬的原理416
8.3.2示例:投擲骰子416
8.3.3示例:從帽子中取球419
8.3.4基因的隨機變異421
8.3.5示例:限制人口增長的政策426
8.4簡單遊戲428
8.4.1猜數字428
8.4.2擲兩個骰子429
8.5蒙特卡羅積分432
8.5.1蒙特卡羅積分的推導432
8.5.2標準蒙特卡羅積分的實現433
8.5.3通過隨機點來計算區域面積437
8.6單維度的隨機遊走438
8.6.1基本實現438
8.6.2可視化439
8.6.3以差分方程表示隨機遊走439
8.6.4計算粒子位置的統計量440
8.6.5向量化實現440
8.7兩維度的隨機遊走442
8.7.1基本實現442
8.7.2向量化實現443
8.8本章小結444
8.8.1本章主題444
8.8.2示例:隨機增長446
8.9習題451

第9章面向對象編程463
9.1繼承與類層次463
9.1.1Line類463
9.1.2初試Parabola類464
9.1.3使用繼承的Parabola類464
9.1.4檢查類之類型466
9.1.5屬性與繼承: hasa與isa關係467
9.1.6將超類作為接口468
9.2數值微分類470
9.2.1計算微分的類470
9.2.2驗證472
9.2.3構建靈活的主程序474
9.2.4擴展475
9.2.5基於函數的實現478
9.2.6基於函數式編程的實現478
9.2.7由單個類實現的數值微分方法479
9.3數值積分類481
9.3.1數值積分方法481
9.3.2用於積分的類481
9.3.3驗證485
9.3.4使用類層次486
9.3.5關於面向對象編程488
9.4用於繪圖的類489
9.4.1使用對象集合489
9.4.2幾何對象的類的例子497
9.4.3通過遞歸增強功能501
9.4.4對圖形進行縮放、平移和旋轉504
9.5用於DNA分析的類506
9.5.1表示區域的類506
9.5.2表示Gene的類507
9.5.3子類512
9.6本章小結513
9.6.1本章主題513
9.6.2示例:輸入數據讀取器514
9.7習題519

附錄A數列和差分方程526
A.1用差分方程構建數學模型526
A.1.1利息計算527
A.1.2用差分方程處理階乘問題529
A.1.3斐波那契數529
A.1.4生物群體的增長531
A.1.5邏輯增長531
A.1.6償還貸款532
A.1.7使用差分方程來求積分533
A.1.8使用差分方程計算泰勒級數535
A.1.9投資與生活536
A.1.10牛頓迭代法537
A.1.11反函數539
A.2對聲音編程541
A.2.1將聲音寫入文件542
A.2.2從文件讀取聲音542
A. 2.3播放多個單音543
A.2.4數列產生的音樂544
A.3習題546

附錄B離散微積分簡介555
B.1離散函數555
B.1.1正弦函數555
B.1.2插值557
B.1.3求近似值557
B.1.4概括558
B.2用有限差分來實現微分559
B.2.1正弦函數微分559
B.2.2網格上的差分560
B.2.3歸納561
B.3用求和實現積分562
B.3.1子區間劃分563
B.3.2子區間積分564
B.3.3子區間求和564
B.3.4歸納565
B.4泰勒級數567
B.4.1函數在某一點附近的近似值567
B.4.2指數函數近似567
B.4.3更高精度的展開567
B.4.4近似的精度569
B.4.5再論導數571
B. 4.6更準確的差分近似572
B.4.7二階導數574
B.5習題576

附錄C微分方程計算簡介579
C.1入門案例579
C.2指數增長581
C.3邏輯增長585
C.4單擺585
C.5疾病傳播模型588
C.6習題589

附錄D一個完整的微分方程工程591
D.1問題描述:物理中的運動和力591
D.1.1物理問題591
D.1.2求解算法592
D.1.3數學模型推導592
D.1.4算法推導594
D.2程序編寫及測試594
D.2.1算法實現594
D.2.2回調函數597
D.2.3製作模塊599
D.2.4驗證600
D.3可視化602
D.3.1同步計算及繪圖602
D.3.2若干應用604
D.3.3關於Δt的選取606
D.3.4在子圖中對若干量進行比較606
D.3.5比較近似解與精確解607
D.3.6誤差隨Δt減小而變化的情況608
D.4習題610

附錄E編程求解微分方程612
E.1標量常微分方程612
E.1.1右手邊函數示例613
E.1.2前向歐拉方法613
E.1.3函數實現614
E.1.4驗證實現615
E.1.5從離散解到連續解616
E.1.6轉換數值方法617
E.1.7類實現方式617
E.1.8邏輯增長的函數方法實現621
E.1.9邏輯增長的類方法實現622
E.2常微分方程組624
E.2.1數學問題624
E.2.2常微分方程組示例625
E.2.3函數實現626
E.2.4類實現628
E.3ODESolver類層次結構629
E.3.1數值方法629
E.3.2求解器層次結構的構造630
E.3.3後向歐拉方法633
E.3.4驗證635
E.3.5示例:指數衰減636
E.3.6示例:具有問題類和求解器類的Logistic方程638
E. 3.7示例:振盪系統645
E.3.8應用:球的軌跡647
E.3.9ODESolver的進一步開發649
E.4習題649

附錄F調試672
F.1使用調試器672
F.2如何調試675
F.2.1程序編寫和調試的方法675
F.2.2應用實例677
F.2.3從代碼分析器獲取幫助688

附錄G提高Python運行效率的技術690
G.1用Python編寫蒙特卡羅模擬的代碼690
G.1.1計算問題690
G .1.2Python實現的標量版本690
G.1.3Python實現的向量化版本691
G.2將標量Python代碼移植到Cython692
G.2.1最直接的Cython實現692
G.2.2改良的Cython實現695
G.3將Python /Cython代碼移植到C代碼中697
G.3.1編寫C程序697
G.3.2通過f2py將循環移植到C代碼中697
G.3.3通過Cython將循環移植到C代碼中699
G.3.4效率比較699

附錄H技術主題701
H.1獲取Python701
H.1.1需要的軟件701
H .1.2在MacOS X和Windows平台上安裝軟件702
H.1.3Anaconda與Spyder702
H.1.4VMWare Fusion虛擬機703
H.1.5Windows雙重啟動705
H.1.6Vagrant虛擬機705
H.2如何編寫和運行Python程序706
H.2.1文本編輯器706
H.2.2終端窗口707
H.3Web服務: SageMathCloud與Wakari 708
H.3.1SageMathCloud簡介708
H.3.2Wakari簡介708
H.3.3安裝自己的Python包708
H.4IPython Notebook的使用709
H.4.1啟動IPython Notebook709
H.4.2混編文本、數學、代碼和圖形709
H.5運行Python程序的不同方式710
H.5.1在IPython中運行Python程序711
H.5.2在UNIX中運行Python程序711
H.5.3在Windows中運行Python程序712
H.5.4在MacOS X中運行Python程序713
H.5.5製作完整的獨立可執行文713
H.6在Python中執行操作系統命令713
H.7可變數量的函數參數716
H.7.1可變數量的位置參數717
H.7.2可變數量的關鍵字參數719
H.8評估程序執行效率721
H.8.1測量時間721
H.8.2分析Python程序性能722
H.9軟件測試723
H.9.1測試函數需要遵循的約定724
H.9.2編寫測試函數及預先計算數據724
H.9.3編寫測試函數以及獲得精確數值解725
H.9.4測試函數魯棒性726
H.9.5自動執行測試728
參考文獻730