用Python物理建模的第一本書終於來啦
點擊標題下「異步圖書」可快速關注
今天這一本圖書,是全網第一本Python物理建模書。
他是一本用Python解決科學問題的實踐指南!
他有多牛,眾多世界知名大學教授推薦閱讀!
作者更像是耐心的潛水教練,手把手地從零開始教授編程新手,幫助他們克服學習中的障礙,回避各種陷阱。在閱讀完本書後,讀者應該能具有專業人士般的自信,駕馭Python解決數據分析、建模和可視化中的科學問題。本書適於作為任何場景下科學編程的教程。當然我也會使用它。
——Garnet Kin-Lic Chan,普林斯頓大學
作者以友好和簡明的方式編寫了這本使用Python進行科學編程的入門指南,但內容卻出人意料的全麵。本書不僅適用於計算科學家,也適用於那些需要繪製並分析實驗數據、求解方程數值或學習編程基礎的讀者。即便是有編程經驗的讀者,也會對書中那些激發思考的練習和指南產生興趣,從而更大程度地發揮Python的作用。
——Vinothan N. Moanharan,哈佛大學
對於剛剛起步做科學計算的物理研究人員而言,這是一本量身定製的Python教程。與我曾讀過的其他編程類圖書相比,我從這本書中更能感受到作者是誠心誠意地期望解決讀者可能會遇到的困惑和問題。本書對讀者給出了細致有效的指導,引導讀者實現形式化計算問題並求解的目標。
——Justin Bois,加州理工學院
作者針對如何使用Python進行科學編程而編寫了這本引人入勝的指南,內容細致透徹,側重於實用的問題。書中所使用的例子是經深思熟慮的,取自於日常的科研實踐,展示了每個計算科學家工具箱中應具備的核心概念和技術。本書內容構思精妙,有助於學生邁出最重要的一步,即朝著正確的方向開始編程。
——Cornelis Storm,埃因霍溫理工大學
本書全麵覆蓋了Python編程語言的基礎知識,側重於物理建模。對於本科生和以前從未接觸過編程的人而言,本書提供了非常有用的Python入門。
——Želijko Ivezič,華盛頓大學
本書為那些幾乎沒有編程經驗的人提供了非常優秀的入門指南。兩位作者采用一種清晰精確的方式,覆蓋了使用Python做科學計算的所有重要方麵。本書通過解釋如何最好地執行科學計算中特定的通用任務,為讀者提供了學習指南。書中的例子和練習也是經過精心選取的。
——Quentin Caudron,普林斯頓大學
如果你符合如下特點,一定要讀它!
Python 初學者
想要用Python 進行科學計算和物理建模的讀者。
閱讀前須知,本書提供免費的示例代碼
Python是一種迅速得到科學界廣泛認可的計算機編程語言。本書的目的在於為Python學習者提供幫助,使他們可以通過自學掌握足以開展物理建模工作的編程技能,包括設置開源Python的編程環境,以及使用Python完成一些常見的科學運算任務,例如數據的導入和導出、數據的可視化、數值分析和模擬等。本書無需讀者具備任何的編程經驗。
本書側重於基礎性內容,並介紹了一些廣泛適用的技術,包括:
● Python編程基礎與腳本;
● 數值數組;
● 二維和三維繪圖;
● 蒙特卡洛模擬;
● 數值方法,包括常微分方程求解;
● 圖像處理;
● 動畫。
為了清晰地闡述新的知識點,本書提供了豐富的代碼例子和練習,並給出了相應的解答。本書的示例代碼和數據集,可以從www.epubit.com.cn下載。
為什麼要自學Python?為什麼要用本書的方法自學?
學習計算機編程可改變你的思維。一開始你會感到步履維艱,三三兩兩地隨處收集編程技巧,但是假以時日,你會發現自己能讓計算機近乎無所不能。你可以添加常被物理學教授說成是可忽略不計的摩擦力和空氣阻力的影響,你可以模擬出自己的捕食者—獵物生態去研究種群模型,你可以創建出自己的分形,你可以發現股票市場中的關聯關係,不勝枚舉。
要與計算機進行交流,你必須先學會一門計算機可以理解的語言。Python就是一個優秀的選擇,它易於入門,結構非常自然,至少相比於其他的計算機語言是這樣的。不久,你將發現大量時間不必再花費在如何向計算機解釋你的計算方法,而是用於思考如何解決問題。無論你是出於什麼動機學習Python,你都會想到這樣的一個問題:是否確有必要費力讀完本書中的所有內容。請相信我們!作為工作在一線的科學家,為了使讀者能開始獨自探索和學習,我們用自身經驗準備好了盡量高效的方法。如果你能按本書推薦的順序花費一些時間嚐試書中推薦的所有內容,從長遠看會節省學習Python的時間。在一開始寫書時,我們就去除了所有讀者不需要的內容,書中保留下來的是一組基本知識和技能。總有一天,你會發現這些內容的確有用。
如何使用本書?
對於如何使用本書自學Python,下麵給出一些建議:
-
可在https://epubit.com.cn獲取本書中提供的一些代碼例子、勘誤、更新、數據集,還有更多的內容。
-
在讀完前麵的幾頁後,需要讀者手邊有一台能運行Python的計算機(不用擔心,本書會教你如何設置該計算機)。可能書中會要求在該計算機上打開一個名為code_samples.txt的文本文檔,該文檔同樣可從上麵給出的Web地址獲取。
-
最好將本書的紙質版放在計算機旁,其他可看電子書的設備,例如平板電腦也可。當然也可用運行Python的同一台電腦查看電子書。
-
本書將頻繁地要求讀者去嚐試操作。其中的一些操作涉及文本形式的代碼段。讀者可以從code_samples.txt文件中複製並粘貼代碼到自己的Python會話中,查看輸出,並更改和操作代碼。
-
讀者也可交互地訪問代碼段。上麵給出的Web站點還提供了訪問每個代碼例子的鏈接。可從Web頁麵複製和粘貼代碼到Python中。
-
部分章節標注了這樣的標識。該標識用於指示更高級的內容,在首次閱讀時可以跳過。
那好,我們現在開始吧!
本書目錄
第1 章 Python入門 1
1.1 算法與算法思想 1
1.1.1 算法思想 2
1.1.2 狀態 3
1.1.3 “a=a+1”是什麼意思 4
1.1.4 符號和數字的對比 5
1.2 啟動Python 6
1.2.1 IPython 控製台 7
1.2.2 錯誤信息 13
1.2.3 如何獲取幫助 13
1.2.4 好的做法:記錄日誌 15
1.3 Python 模塊 15
1.3.1 import 15
1.3.2 from...import 16
1.3.3 NumPy和PyPlot模塊 17
1.4 Python 表達式 18
1.4.1 數字 18
1.4.2 算術操作和預定義函數 19
1.4.3 好的做法:變量命名 21
1.4.4 更多的函數相關信息 22
第2 章 數據結構與程序控製 24
2.1 對象和方法 24
2.2 列表、元組和數組 27
2.2.1 創建列表和元組 28
2.2.2 NumPy數組 28
2.2.3 為數組填充值 30
2.2.4 數組的連接 32
2.2.5 訪問數組元素 33
2.2.6 數組和賦值 34
2.2.7 數組切片 35
2.2.8 數組展平 37
2.2.9 更改數組形狀 38
2.2.10 以列表和數組為索引 38
2.3 字符串 39
2.3.1 使用format 方法格式化字符串 41
2.3.2 使用“%”格式化字符串 43
2.4 循環 43
2.4.1 for 循環 44
2.4.2 while 循環 46
2.4.3 循環長時間運行 46
2.4.4 死循環 47
2.5 數組操作 47
2.5.1 矢量化數學 48
2.5.2 數組化簡 50
2.6 腳本 51
2.6.1 Editor 窗格 52
2.6.2 其他編輯器 53
2.6.3 調試的第一步 54
2.6.4 好的做法:做注釋 57
2.6.5 好的做法:使用命名參數 61
2.6.6 好的做法:注意單位問題 62
2.7 或有行為:分支 63
2.7.1 if 語句 64
2.7.2 真值的處理 65
2.8 嵌套 65
第3 章 數據輸入、結果輸出 67
3.1 導入數據 68
3.1.1 獲取數據 68
3.1.2 將數據導入Python 70
3.2 導出數據 73
3.2.1 腳本 73
3.2.2 數據文件 74
3.3 數據可視化 77
3.3.1 plot 及相關命令 77
3.3.2 繪圖的調整與裝飾 81
3.3.3 誤差條 83
3.3.4 3D圖形 84
3.3.5 多重繪圖 85
3.3.6 子繪圖 87
3.3.7 保存圖形 87
3.3.8 在其他應用中使用圖形 88
第4 章 首次上機實驗 90
4.1 艾滋病病毒載量模型 90
4.1.1 探究模型 91
4.1.2 匹配實驗數據 92
4.2 細菌實驗 93
4.2.1 探究模型 93
4.2.2 匹配實驗數據 94
第5 章 Python進階 96
5.1 自定義函數 97
5.1.1 定義Python函數 97
5.1.2 更新函數 100
5.1.3 參數、關鍵字和缺省值 101
5.1.4 返回值 102
5.1.5 函數式編程 103
5.2 隨機數和模擬 105
5.2.1 模擬拋硬幣 105
5.2.2 生成軌跡線 106
5.3 直方圖和條形圖 107
5.4 等勢線繪圖和曲麵 109
5.4.1 生成繪圖點網格 109
5.4.2 等勢線繪圖 110
5.4.3 曲麵繪圖 111
5.5 非線性方程的數學求解 111
5.5.1 一般實函數 112
5.5.2 多項式的複數根 113
5.6 求解線性等式 114
5.7 數值積分 115
5.7.1 對預定義函數積分 116
5.7.2 對自定義函數積分 117
5.7.3 對震蕩函數積分 117
5.7.4 參數依賴性 118
5.8 微分方程的數值解 118
5.8.1 問題重構 119
5.8.2 ODE求解 120
5.8.3 參數依賴 122
5.9 向量場和流線圖 123
5.9.1 向量場 123
5.9.2 流型 124
第6 章 第二次上機實驗 126
6.1 生成和繪製軌跡 126
6.2 繪製位移分布 127
6.3 少見事件 129
6.3.1 泊鬆分布 129
6.3.2 等待時間 131
第7 章 更多的技術 133
7.1 圖像處理 133
7.1.1 圖像和數字數組 134
7.1.2 操作圖像 135
7.2 動畫 135
7.2.1 創建動畫 136
7.2.2 保存動畫 137
7.3 分析計算 141
7.3.1 SymPy軟件包 141
7.3.2 Wolfram Alpha 142
第8 章 第三次上機實驗 145
8.1 卷積 146
8.1.1 Python 的圖像處理工具 146
8.1.2 圖像平均 148
8.1.3 使用高斯濾波器做平滑 149
8.2 圖像去噪 149
8.3 特征強調 150
繼續努力 152
附錄A 安裝Python 154
A.1 安裝Python 和Spyder 154
A.1.1 圖形界麵安裝 155
A.1.2 命令行安裝 156
A.2 設置Spyder 159
A.2.1 工作目錄 159
A.2.2 交互圖形 159
A.2.3 腳本模塊 159
A.2.4 重啟 160
A.3 加速 160
A.4 保持版本最新 161
A.5 安裝FFmpeg 161
附錄B 錯誤和錯誤消息 164
B.1 Python錯誤概述 165
B.2 一些常見的錯誤 166
附錄C 比較Python 2與Python 3 170
C.1 除法 171
C.2 用戶輸入 171
C.3 打印命令 172
C.4 更多幫助 173
附錄D 深入學習 174
D.1 賦值語句 174
D.2 內存管理 177
D.3 函數 177
D.4 作用域 178
D.4.1 命名衝突 180
D.4.2 作為參數傳遞變量 181
D.5 總結 182
附錄E 練習的解答 183
致謝 189
參考文獻 190
第一章試讀
分析機編織代數模式,就像提花織機在編織花和葉。
——埃達·洛夫萊斯伯爵夫人,1815-1853
1.1 算法與算法思想
本書的目的在於讓讀者運用計算機語言Python開始計算科學之旅。Python是一種開源軟件,讀者可自行下載、安裝並使用它。現在好的Python入門教程不勝枚舉,並且每年還在推陳出新。與這些內容相比,本書的獨到之處在於側重能解決物理建模問題的有用技能。
對物理係統建模或許會是一項十分複雜的任務。下麵讓我們了解一下功能強大的計算機處理器是如何為此提供幫助的。
1.1.1 算法思想
假設你需要指導一位朋友完成倒車入位操作。當時是一個緊急情況,必須由你這位從未開過車的朋友完成操作,開始操作前,你們之間隻能通過電話聯係。
你需要將操作分解為可被你的朋友能理解的小步驟,這些小步驟應是明確的,依次執行即可完成任務。例如,你可給出如下一係列指令:
1 將車鑰匙插入點火器。2 轉動鑰匙直至啟動,然後鬆開鑰匙。3 按下變速杆上的按鈕,將變速掛入“倒車”標識的檔位。4 ……
遺憾的是,即使你的朋友理解了每條指令,該“代碼”對一些車輛並不起作用。這個過程有“程序故障”。在做第3步指令前,不少車輛需要駕駛者:
踩下左腳踏板。
此外,變速器上的倒車檔可能是用“R”標記的,而非“倒車”。創建這樣的操作指令時,難以做到一開始就習慣操作所需的高精確度。
因為指令是預先給出的(假定你的朋友沒有手機),所以好的做法是允許存在意外情況:
在聽到了吱嘎聲後,踩下左踏板……
這就是算法思想的開端,將長的操作步驟分解為小的、清晰的子步驟,以及預期中的意外情況。
如果你的朋友見過別人駕車,並已有了大量的經驗,那麼上述指令足以適用。但是對於另外一些沒有任何經驗的朋友,甚至是機器人,需要提供更多的細節。例如,最初兩步指令可能需要進行如下擴展:
握住鑰匙的大頭端。將鑰匙的另一端插入位於駕駛杆右下方的鑰匙孔內。按順時針方向扭動鑰匙(從鑰匙的大頭端向對端的角度看)。……
低層計算機程序使用計算機可理解的語言形式提供類似的指令[1] 。而高層係統可以理解很多通用任務,因而編程方式更為簡明扼要,就像在上麵例子中第一次所給出的指令。Python就是一種高層語言,它具有進行數學計算、文本處理、文件操作的通用操作命令。此外,Python還可以訪問很多標準程序庫。作為程序的集合,這些程序庫可以執行數據可視化、圖像處理等高級功能。
Python也提供命令行接口,即一個執行在其中輸入的Python命令的程序。這樣在Python中,你可以輸入命令並立刻執行。與之形成對比的是,用C、C++、Fortran等很多科學計算中使用的其他語言所編寫的程序,在執行前需要進行編譯。這時要先由一個稱為編譯器的獨立程序將你的代碼轉譯為低級語言,然後你才能運行生成的編譯程序去執行(實現)你的算法。使用Python,相對容易實現程序的快速編寫、運行和調試(雖然依然需要耐心和實踐)。
命令行解釋器,連同標準函數庫和你自己編寫的程序,一起提供了便利的、強大的科學計算平台。
1.1.2 狀態
也許以前你在上幾何課時,就已經學過了如何做多步數學證明。這種證明方法的目標在於通過依次訴諸已知的信息和形式化係統去證實一個期望結論的真實性。這樣,雖然孤立看來每個語句的真實性不明顯,綜合考慮前麵的語句,就可以明確地判定期望的真實性。在通讀證明過程中,讀者的“狀態”(已知為真的命題列表)會發生改變,最終給出了一個如何從公理和假設引出結果的完整邏輯推導鏈條。
每個算法都具有各自的目標。可以將算法看成是一個指令鏈,其中的每條指令都描述了一個基本操作,這些操作共同實現了一個複雜的任務。指令鏈中可能包括不少重複的操作,因此你不會想要去對執行中的每一步進行管理。替代的做法是,你預先製訂了所有步驟,然後觀看你的電子助理是如何快速執行的。其中可能存在一些預料之外的事件(例如聽到汽車吱嘎作響……)。
在算法中,計算機的狀態時常會發生改變。例如,一個計算機有多個內存單元,其中的內容會在操作過程中發生變化。你的目標可能是安排一到多個這樣的單元,用於在完成複雜計算後保存一些運行的結果。你可能還希望能繪製出特定的圖形圖像。
1.1.3 “a=a+1”是什麼意思
為使計算機執行你的算法,必須用計算機能理解的語言與計算機進行通信。一開始接觸計算機編程時,你可能會對所使用的命令感到困惑,尤其是這些命令與標準數學用法有衝突的時候。例如,很多編程語言(其中包括Python)接受下麵這樣的聲明:
1 a = 1002 a = a + 1
這在數學中是不合理的。第二行是一個永假斷言,相應地也是一個無解的等式。但是對於Python而言,“=
”並非是測試相等性,而是一個需要執行的指令。上麵兩行命令的大概意思為[2]:
1.命名整數對象a
,並賦值100
。
2.提取命名對象a
的值,並與1
做求和運算,然後將運算結果賦於a
,並拋棄a
所指代對象的原始值。
換句話說,等號“=
”通知Python去更改變量自身的狀態。相反,等號在數學概念中是用於創建一個結果為真或為假的命題。還應注意的是,Python對命令“x=y
” 中等號兩側內容的處理不同,而在數學中等號兩側是對稱的。例如,Python將對“b+1=a
”這樣的命令報錯,因為賦值語句的左側必須是一個變量名稱,該變量可被賦值為右側表達式的求值。
我們往往希望能確定一個變量是否具有特定的值。為避免賦值和等價測試間的模煳性,Python以及其他很多語言都對後者使用雙等號“==
”。例如:
1 a = 12 a == 03 b = (a == 1)
上麵的代碼再次設置了變量a
,並對a
賦了一個數值。然後將該數值與0
進行比較。最後,創建了第二個變量b
。在完成另一次比較運算後,將變量b
賦予一個邏輯值(True
或False
)。該值可在或然代碼中使用,我們將在本書的隨後內容中介紹。
注意:不要在應該使用“==”(等價測試)的地方使用“=”(賦值)。
這是編程新手常犯的一個錯誤。因為“=
”和“==
”都是合法的Python語法,這個錯誤會產生無法預料的結果。但是無論在何種情況下,“=
”和“==
”兩者中隻會有一個是你所需要的。
1.1.4 符號和數字的對比
在不知道a值的情況下使用“假定b=a2-a”進行減法運算,這在數學上是完全合理的。該語句將會根據a定義b,無論a的值是什麼。
如果我們啟動Python並直接給出上麵運算的一個等價語句“b= a**2-a
”,這會報錯[3] 。每次按下<Return/Enter>鍵之後,Python會嚐試對每個賦值語句求值。如果變量尚未賦值,那麼求值就會失敗,Python就會報錯。這樣的輸入可能會被其他的數學計算軟件包接受,因為它們可以追蹤符號的關係並隨後求值,但是基本Python並不會這樣做[4] 。
在數學中可理解的是,類似於“假定b=a2-a”這樣的定義在整個問題討論期間都不會發生改變。如果我們說“當a=1時”,那麼讀者就知道b等於0;如果隨後我們說“當a=2時,……”,我們就不必再次定義b,讀者知道b現在代表的值是22-2=2。
與此相對比,Python這樣的數學係統在執行賦值語句“b=a**2-a
”後,並不會記住b
和a
之間的關係,它所記住的隻是賦給b
的值。如果我們隨後更改了a
的值,b
的值並不會發生變化[5]。
一般來說,在證明的過程中改變符號關係並非一個好做法。但是在Python中,如果我們說“b=a**2-a
”,我們稍後也可以說“b=2**a
”。第二次賦值會丟棄第一次賦值時計算的值,並替換為新計算的值,這樣更新了Python的狀態。
延伸推薦
點擊關鍵詞閱讀更多新書:
Python|機器學習|Kotlin|Java|移動開發|機器人|有獎活動|Web前端|書單
點擊閱讀原文,購買《Python物理建模初學者指南》
最後更新:2017-10-26 10:04:24