本書面向工程和科學(xué)專業(yè)的學(xué)生,介紹編程工具和數(shù)值方法,旨在幫助學(xué)生掌握計算問題求解技巧。書中第 一部分介紹基本的Python編程概念,使用簡單的例子快速將新的概念付諸實踐;第二部分涵蓋算法和數(shù)值分析的基礎(chǔ)知識,幫助學(xué)生在實際設(shè)置中快速應(yīng)用結(jié)果。
由于編程已經(jīng)成為工程、科學(xué)、醫(yī)學(xué)、媒體、商業(yè)、金融和許多其他領(lǐng)域的重要組成部分,因此對于科學(xué)家和工程師來說,掌握基本的計算機編程基礎(chǔ)是能夠提升自身競爭力的。這本書向擁有不同背景的學(xué)生介紹編程,并提供編程和數(shù)學(xué)工具,這些工具將為他們的職業(yè)生涯提供非常大的幫助。
本書的大部分內(nèi)容借鑒了加州大學(xué)伯克利分校E7課程“面向科學(xué)家和工程師的計算機編程導(dǎo)論”的標準教學(xué)資料。這門課是工程學(xué)院的大多數(shù)理工科新生以及其他學(xué)科(包括物理、生物、地球和認知科學(xué))本科生的選修課。該課程最初是用Matlab講授的,但隨著最近伯克利數(shù)據(jù)科學(xué)運動的趨勢,數(shù)據(jù)科學(xué)部同意并支持將該課程轉(zhuǎn)變?yōu)槊嫦騊ython的課程,以便為來自不同領(lǐng)域的學(xué)生提供進一步學(xué)習(xí)數(shù)據(jù)科學(xué)課程的預(yù)備知識。本課程有兩個基本目標:
向沒有接觸過編程的理工科學(xué)生介紹Python編程;
介紹各種用于解決科學(xué)和工程問題的數(shù)值分析工具。
這兩個目標反映在本書的兩個部分中:
Python編程簡介;
數(shù)值方法簡介。
本書是根據(jù)Timmy Siauw和Alexandre M. Bayen撰寫的《面向工程師的MATLAB編程和數(shù)值方法導(dǎo)論》一書編寫的。本書最初是出于交互目的而在Jupyter Notebook中編寫的,然后轉(zhuǎn)換為LaTeX。書中的大多數(shù)代碼來自Jupyter Notebook代碼單元,可以直接在筆記本單元中運行。所有Jupyter Notebook代碼都可以在pythonnumericalmethods.berkeley.edu中找到。
因為本書涵蓋的主題頗為廣泛,所以沒有把每一個主題講得很深入。即使用整個學(xué)期來講本書,每章也最多占用兩個課時。這本書旨在為學(xué)生提供廣泛的編程知識和數(shù)學(xué)詞匯,以供學(xué)生進行擴展,而非深入學(xué)習(xí)。
我們相信,就像學(xué)習(xí)一門新的外語一樣,學(xué)習(xí)編程也可以很有趣,而且很有啟發(fā)性。我們希望你在學(xué)習(xí)本書的過程中會贊同我們的看法。
背景知識
本書旨在向那些幾乎沒有計算機編程經(jīng)驗的學(xué)生介紹編程和數(shù)值方法。我們希望這一宗旨能反映在本書的節(jié)奏、基調(diào)和內(nèi)容上。為了達到編程的目的,我們假設(shè)讀者具備以下背景知識:
了解計算機顯示器和鍵盤、鼠標等輸入設(shè)備;
了解在大多數(shù)操作系統(tǒng)中用于存儲文件的文件夾結(jié)構(gòu)。
對于本書的第二部分,我們假設(shè)讀者具備以下背景知識:
高中代數(shù)和三角學(xué);
入門級大學(xué)微積分。
就是這樣了!本書中若出現(xiàn)超出上述背景知識的內(nèi)容,那必定是我們的問題。如果因概念不明確而產(chǎn)生了知識上的混淆,我們事先表示歉意。
章節(jié)組織
第一部分介紹編程的基本概念。第1章介紹Python和Jupyter Notebook。第2~7章介紹編程的基礎(chǔ)知識,熟練掌握這些章節(jié)的內(nèi)容可以獲得足夠的背景知識,從而幾乎可以對任何想象的東西進行編程。第8章介紹如何基于計算機程序運行速度來描述程序的復(fù)雜度。第9章介紹計算機如何表示數(shù)字及其對算術(shù)運算的影響。第10章介紹養(yǎng)成良好編程習(xí)慣的有用技巧,掌握這些技巧可以減少代碼中的錯誤,并且易于查找錯誤。第11章介紹如何長期存儲數(shù)據(jù)以及如何使Python的結(jié)果在Python之外(即其他程序中)有用。第12章介紹Python的繪圖功能,可生成圖形和圖表,這對于工程師和科學(xué)家可視化結(jié)果非常有用。第13章介紹Python并行編程的基礎(chǔ)知識,并行編程可利用當今計算機的多核
設(shè)計。
第二部分概述對工程師有幫助的各種數(shù)值方法。第14章簡要介紹線性代數(shù)。盡管線性代數(shù)本質(zhì)上是理論性的,但它是理解許多高級工程主題的關(guān)鍵。第15章討論特征值和特征向量(它們是工程學(xué)和科學(xué)中的重要工具),以及如何利用它們。第16章是關(guān)于最小二乘回歸的,這是一個數(shù)學(xué)術(shù)語,是將理論模型擬合到觀測數(shù)據(jù)的一種方法。第17章是關(guān)于推斷數(shù)據(jù)點之間的函數(shù)值的,會介紹一種稱為“插值”的框架。第18章介紹用多項式近似函數(shù)的思想,這對于簡化復(fù)雜函數(shù)很有用。第19章講了兩種算法,用于求函數(shù)的根,即求f(x)=0中的x,其中f是一個函數(shù)。第20章和第21章分別介紹近似函數(shù)的導(dǎo)數(shù)和積分的方法。第22章和第23章介紹一種數(shù)學(xué)模型,稱為常微分方程,這兩章著重于不同的問題,分別是初值問題和邊值問題,并介紹了幾種求解方法。第24章介紹離散傅里葉變換和快速傅里葉變換的概念及其在數(shù)字信號處理中的使用。
如何閱讀此書
學(xué)習(xí)編程就是練習(xí),練習(xí),再練習(xí)。就像學(xué)習(xí)一門新語言一樣,如果不將其內(nèi)化并不斷加以利用,就無法真正掌握。
我們建議在閱讀本書時,打開Jupyter Notebook或交互式網(wǎng)站,并運行書中提供的所有示例。相比于像讀小說一樣“通讀”全文,花時間去理解每個例子中Python所做的事情,將會獲得更大的回報。
就本書而言,應(yīng)該首先閱讀并理解第1章至第5章,因為它們涵蓋編程的基礎(chǔ)知識。第6章到第11章可以按任何順序閱讀。如果你想提高解決問題的能力,則有關(guān)繪圖和并行編程的第12章和第13章是必讀章節(jié)。在第二部分中,應(yīng)該首先閱讀第14章,因為后續(xù)各章都依賴于線性代數(shù)的概念。其余章節(jié)可以按任何順序閱讀,我們建議先閱讀第17章和第18章,再閱讀第19章和第20章。
在整本書中都有用黑體標出的文字,當你遇到這些文字時,需要花時間記憶它們并根據(jù)上下文理解其含義。
為了使書中內(nèi)容更加清晰,我們設(shè)計了不同的文本塊。這些文本塊具有不同的功能,示例如下。
嘗試一下!這是書中最常見的塊,其中通常會簡短地描述問題或操作。我們強烈建議你在Python中“嘗試”這些內(nèi)容。
提示!該塊提供了一些建議,我們相信這些建議能使編程更容易。請注意,這些塊不包含理解書中關(guān)鍵概念所需的新知識。
示例:這些塊是新概念的具體示例,旨在幫助你思考新概念,但不一定需要進行試驗。
警告!在編程時可能會遇到很多陷阱,這些塊將幫助你避免混亂、養(yǎng)成不良習(xí)慣或誤解關(guān)鍵概念。
發(fā)生了什么?這些塊深入細節(jié),以幫助你理解Python執(zhí)行程序時發(fā)生的事情。
結(jié)構(gòu):在編程中保留了一些標準的架構(gòu),用于執(zhí)行常見和重要的任務(wù)。這些塊概述這些架構(gòu)并介紹如何使用它們。
每章末尾都有兩個部分?偨Y(jié)部分列出當前章的要點,這些內(nèi)容能幫助你直觀地了解剛剛所學(xué)的內(nèi)容。習(xí)題部分提供的練習(xí)將幫助你強化所學(xué)的概念。
最后一點,在Python中有很多方法可以做同樣的事情。乍看這似乎是一個有用的特性,但當任務(wù)很簡單時,它可能會讓學(xué)習(xí)Python變得困惑,或者因給編程新手提供過多的可能性而讓他們不知所措。本書對于要執(zhí)行的任務(wù)只提供一種方法,這樣可確保初學(xué)者少走彎路,同時也不會被無關(guān)緊要的信息所淹沒。對于某個任務(wù),你可能會發(fā)現(xiàn)不同于本書所給方法的解決方案,而且兩者解決問題的效果相同,甚至你的方案效果更好!我們鼓勵你找到這些替代方法,并根據(jù)我們提供的工具,自己判斷哪種方法更好。
希望你喜歡這本書!
為什么選擇Python
Python是一種高級通用計算機語言,適用于許多應(yīng)用程序。它對初學(xué)者很友好,希望你會發(fā)現(xiàn)它簡單易學(xué),并且很有趣。該語言本身非常靈活,這意味著在構(gòu)建功能方面沒有硬性規(guī)定,你會發(fā)現(xiàn)有多種方法可以解決相同的問題。也許它的強大之處在于擁有一個強大的用戶社區(qū),有很多軟件包可以直接插入而且只需投入很少的精力。隨著持續(xù)流行的趨勢,Python適合當今數(shù)據(jù)科學(xué)的目標。Python是免費的(開放源代碼),并且大多數(shù)軟件包也是免費使用的。開源編程語言的思想使學(xué)習(xí)曲線產(chǎn)生了巨大的變化。你不僅可以免費使用這些軟件包,還可以從其他用戶開發(fā)的這些軟件包的源代碼中學(xué)習(xí)許多高級技能。我們希望你能喜歡這里介紹的Python知識,并在工作和生活中使用它。
Python和軟件包版本
本書是使用Python 3編寫的。下面列出了本書中使用的軟件包及各自的版本。隨著這些軟件包的不斷開發(fā),你可能會添加、刪除或更改軟件包的某些功能:
jupyter,1.0.0
ipython,7.5.0
numpy,1.16.4
scipy,1.2.1
h5py,2.9.0
matplotlib,3.1.0
cartopy,0.17.0
joblib,0.13.2
致 謝
Python Programming and Numerical Methods
編寫本書初稿的時候,加州大學(xué)伯克利分校工程學(xué)教授的標準通用語言是Matlab,它的起源可以追溯到2005年左右。那之后便迎來了當前的數(shù)據(jù)科學(xué)、機器學(xué)習(xí)時代, Python作為一種普遍使用的語言出現(xiàn)在整個工程行業(yè)。因此,初稿是作為加州大學(xué)伯克利分校E7課程的一部分編寫的,該課程向?qū)W生介紹編程和數(shù)值分析。
如果沒有同事、研究生導(dǎo)師團隊(GSI)、評分員和行政人員的幫助,這本書就永遠不會寫出來,他們幫助我們完成了每學(xué)期向數(shù)百名學(xué)生講授E7課程的艱巨過程。此外,如果沒有耐心閱讀本書并給出反饋的學(xué)生的幫助,本書也將永遠無法完成。在多次教授E7課程的過程中,我們與數(shù)千名學(xué)生、數(shù)十個研究生導(dǎo)師團隊和評分員以及十幾名同事和管理人員進行了互動,鑒于涉及的人數(shù)較多,對于那些可能遺漏的人,我們深表
歉意。
我們非常感謝同事Panos Papadopoulos、Roberto Horowitz、Michael Frenklach、Andy Packard、Tad Patzek、Jamie Rector、Raja Sengupta、Mike Cassidy和Samer Madanat教授的指導(dǎo)。尤其感謝Roberto Horowitz、Andy Packard、Sanjay Govindjee和Tad Patzek教授分享了他們在課堂上使用的內(nèi)容,這些內(nèi)容對本書的編寫做出了貢獻。我們還要感謝Rob Harley和Sanjay Govindjee教授在教授E7課程時使用了本書的初稿,并向我們提供了有助于改進的反饋。課程的順利進行,讓作者有了編寫本書的時間和精力。眾多行政人員承擔(dān)了大量后勤工作,使課程的管理井井有條。我們特別感謝Joan Chamberlain、Shelley Okimoto、Jenna Tower和Donna Craig。
特別值得一提的是,土木與環(huán)境工程系副主任Bill Nazaroff在2011年指定第二作者授課。如果沒有這項任務(wù),這本書的幾位作者就沒有機會一起工作并撰寫本書。眾所周知,E7課程是加州大學(xué)伯克利分校工程學(xué)院最難教的課程。然而,在我們教授這門課的多個學(xué)期里,課程一直順利進行,這主要歸功于我們有幸與才華橫溢的研究生導(dǎo)師團隊合作。這幾年在授課的過程中,一系列具有傳奇色彩的研究生導(dǎo)師團隊負責(zé)人為塑造課程做出了貢獻,并為學(xué)生提供了有意義的體驗。特別是Scott Payne、James Lew、Claire Saint-Pierre、Kristen Paris
譯者序
前言
致謝
第一部分 Python編程簡介
第1章 Python基礎(chǔ) 2
1.1 開始使用Python 2
1.1.1 設(shè)置工作環(huán)境 2
1.1.2 運行Python代碼的
三種方法 5
1.2 Python作為計算器 7
1.3 包管理 11
1.3.1 使用包管理器管理包 11
1.3.2 從源代碼中安裝包 13
1.4 Jupyter Notebook簡介 13
1.4.1 啟動Jupyter Notebook 14
1.4.2 筆記本 15
1.4.3 如何關(guān)閉筆記本 15
1.4.4 關(guān)閉Jupyter Notebook
服務(wù)器 15
1.5 邏輯表達式和運算符 16
1.6 總結(jié)和習(xí)題 18
1.6.1 總結(jié) 18
1.6.2 習(xí)題 18
第2章 變量和基本數(shù)據(jù)結(jié)構(gòu) 20
2.1 變量和賦值 20
2.2 數(shù)據(jù)結(jié)構(gòu)—字符串 22
2.3 數(shù)據(jù)結(jié)構(gòu)—列表 26
2.4 數(shù)據(jù)結(jié)構(gòu)—元組 28
2.5 數(shù)據(jù)結(jié)構(gòu)—集合 30
2.6 數(shù)據(jù)結(jié)構(gòu)—字典 31
2.7 numpy數(shù)組 33
2.8 總結(jié)和習(xí)題 40
2.8.1 總結(jié) 40
2.8.2 習(xí)題 40
第3章 函數(shù) 42
3.1 函數(shù)基礎(chǔ) 42
3.1.1 Python 內(nèi)置函數(shù) 42
3.1.2 定義自己的函數(shù) 42
3.2 局部變量和全局變量 49
3.3 嵌套函數(shù) 52
3.4 lambda函數(shù) 53
3.5 函數(shù)作為函數(shù)的參數(shù) 54
3.6 總結(jié)和習(xí)題 55
3.6.1 總結(jié) 55
3.6.2 習(xí)題 55
第4章 分支語句 59
4.1 if-else語句 59
4.2 三元運算符 65
4.3 總結(jié)和習(xí)題 65
4.3.1 總結(jié) 65
4.3.2 習(xí)題 65
第5章 迭代 69
5.1 for循環(huán) 69
5.2 while循環(huán) 74
5.3 推導(dǎo)式 76
5.3.1 列表推導(dǎo)式 76
5.3.2 字典推導(dǎo)式 77
5.4 總結(jié)和習(xí)題 77
5.4.1 總結(jié) 77
5.4.2 習(xí)題 77
第6章 遞歸 81
6.1 遞歸函數(shù) 81
6.2 分而治之 85
6.2.1 漢諾塔問題 85
6.2.2 快速排序 87
6.3 總結(jié)和習(xí)題 88
6.3.1 總結(jié) 88
6.3.2 習(xí)題 89
第7章 面向?qū)ο缶幊獭?4
7.1 面向?qū)ο缶幊毯喗椤?4
7.2 類和對象 95
7.2.1 類 95
7.2.2 對象 97
7.2.3 類屬性與實例屬性 98
7.3 繼承、封裝和多態(tài) 99
7.3.1 繼承 99
7.3.2 封裝 102
7.3.3 多態(tài) 103
7.4 總結(jié)和習(xí)題 103
7.4.1 總結(jié) 103
7.4.2 習(xí)題 103
第8章 復(fù)雜度 105
8.1 復(fù)雜度和大O表示法 105
8.2 復(fù)雜度問題 107
8.3 分析器 108
8.3.1 使用魔術(shù)命令 108
8.3.2 使用Python分析器 109
8.3.3 使用line分析器 110
8.4 總結(jié)和習(xí)題 111
8.4.1 總結(jié) 111
8.4.2 習(xí)題 111
第9章 數(shù)字的表示 113
9.1 baseN和二進制 113
9.2 浮點數(shù) 114
9.3 舍入誤差 118
9.3.1 表示誤差 118
9.3.2 浮點運算導(dǎo)致的舍入誤差 118
9.3.3 舍入誤差的累積 119
9.4 總結(jié)和習(xí)題 120
9.4.1 總結(jié) 120
9.4.2 習(xí)題 120
第10章 錯誤、良好的編程實踐
和調(diào)試 123
10.1 錯誤類型 123
10.2 避免錯誤 125
10.2.1 規(guī)劃你的程序 125
10.2.2 經(jīng)常進行測試 126
10.2.3 保持代碼整潔 126
10.3 異!128
10.4 類型檢查 130
10.5 調(diào)試 132
10.5.1 在遇到異常時激活
調(diào)試器 132
10.5.2 在運行代碼前激活
調(diào)試器 134
10.5.3 添加斷點 135
10.6 總結(jié)和習(xí)題 136
10.6.1 總結(jié) 136
10.6.2 習(xí)題 136
第11章 讀寫數(shù)據(jù) 137
11.1 文本文件 137
11.1.1 寫入文件 137
11.1.2 附加文件 138
11.1.3 讀取文件 138
11.1.4 處理數(shù)字和數(shù)組 139
11.2 CSV文件 140
11.2.1 寫入和打開CSV文件 141
11.2.2 讀取CSV文件 142
11.2.3 numpy之外 142
11.3 pickle文件 142
11.3.1 寫入pickle文件 142
11.3.2 讀取pickle文件 143
11.3.3 讀取Python 2的pickle
文件 143
11.4 JSON文件 143
11.4.1 JSON格式 143
11.4.2 寫入JSON文件 144
11.4.3 讀取JSON文件 144
11.5 HDF5文件 145
11.5.1 讀取HDF5文件 146
11.6 總結(jié)和習(xí)題 147
11.6.1 總結(jié) 147
11.6.2 習(xí)題 147
第12章 可視化和繪圖 148
12.1 二維繪圖 148
12.2 三維繪圖 156
12.3 使用地圖 161
12.4 動畫和電影 165
12.5 總結(jié)和習(xí)題 167
12.5.1 總結(jié) 167
12.5.2 習(xí)題 167
第13章 Python并行化 173
13.1 并行計算基礎(chǔ)知識 173
13.1.1 進程和線程 174
13.1.2 Python的GIL問題 174
13.1.3 使用并行計算的缺點 174
13.2 多進程 174
13.2.1