Python求解偏微分方程

閱讀時間約 3 分鐘

1 引言

微分方程是描述一個系統的狀態隨時間和空間演化的最基本的數學工具之一,其在物理、經濟、工程、社會等各方面都有及其重要的應用。 然而,只有很少的微分方程式可以解析求解,尤其對於偏微分方程,能解析求解的種類更是寥寥可數。 更多的微分方程式可以用數值法來求解,只要精確度夠高,就可以滿足科學和工程上的需求。


數值解微分方程的基本想法是先把時間和空間離散化,再將微分化為差分,建立遞推關係,再利用電腦強大的重複運算能力,快速得到任意格點處的值。 Python的Numpy、Scipy工具包可以很好地實現此功能,Matplotlib工具包則可以將求解結果畫為非常直觀的圖形。


接下來,我們先以常微分方程的數值解為例,引入差分的思想,再推廣到偏微分方程。

2 常微分方程的差分求解

一般地,一階常微分方程式可以寫成

raw-image

上述微分方程可以化為差分方程

raw-image


從而我們得到遞推關係

raw-image

有了遞推關係和初始條件以後,就可以利用Python的強大運算功能來求解了


2.1 RC迴路放電問題

對於一個 RC 迴路,我們有

raw-image

其中,I R Q C 分別為電流,電阻,電量和電容,利用 I=dQ/dt並定義

τ=RC,我們得到一個含初始條件的一階常微分方程

raw-image


這個方程式當然可以解析求解,得到

raw-image

另一方面依照差分法,可以得到遞推關係

raw-image


下面我們用Python進行數值求解,並和解析結果做比較。

import numpy as np
import matplotlib.pyplot as plt
rc = 2.0 #設置常數
dt = 0.5 #設置步長
n = 1000 #設置分割段數
t = 0.0 #設置初始時間
q = 1.0 #設置初始電量

qt=[] #用來存放差分得到的q值
qt0=[] #用來存放解析得到的q值
time = [] #用來存放時間值

for i in range(n):
    t = t + dt
    q1 = q - q*dt/rc #qn+1的近似值
    q = q - 0.5*(q1*dt/rc + q*dt/rc) #差分遞推關係
    q0 = np.exp(-t/rc) #解析關係
    qt.append(q) #差分得到的q值列表
    qt0.append(q0) #解析得到的q值列表
    time.append(t) #時間列表

plt.plot(time,qt,'o',label='Euler-Modify') #差分得到的電量隨時間的變化
plt.plot(time,qt0,'r-',label='Analytical') #解析得到的電量隨時間的變化
plt.xlabel('time')
plt.ylabel('charge')
plt.xlim(0,20)
plt.ylim(-0.2,1.0)
plt.legend(loc='upper right')
plt.show()
raw-image

在COLAB跑了一下

差分法得到的結果與解析法得到結果的比較,發現兩者符合得很好

這說明對於這個問題,改進的歐拉法已經可以給出足夠精確的結果。

要注意的是,這個微分方程本身比較簡單,可以解析求解,

而對於複雜得多的微分方程,沒辦法解析求解,

但是上述數值求解差分法仍然是適用的。


人工智能工作經驗跟研究
留言0
查看全部
發表第一個留言支持創作者!
根據泰勒定理,f(x)可以寫成右邊一長串的導數的組合 為了更好理解這個東西我們可以用python實作 首先定義f(x)和定義factorial怎麼算 然後寫泰勒定理 f(x) = f(a) + f'(a)(x-a) ....後面還有一串 注意公式往後面看其實是有規律的 例如從
一個罐頭其中高度為h,底部半徑為r,且 h/r=2 已知 容量V = 1(公升) 找到一組: h(高度) , r(底部半徑) 使得表面積最小 目的: 因表面積最小因此可以讓製造成本降低幫助企業省錢 算式如上 答案我也使用python驗證一下求出數值解 接下來換個角度跟工具
根據泰勒定理,f(x)可以寫成右邊一長串的導數的組合 為了更好理解這個東西我們可以用python實作 首先定義f(x)和定義factorial怎麼算 然後寫泰勒定理 f(x) = f(a) + f'(a)(x-a) ....後面還有一串 注意公式往後面看其實是有規律的 例如從
一個罐頭其中高度為h,底部半徑為r,且 h/r=2 已知 容量V = 1(公升) 找到一組: h(高度) , r(底部半徑) 使得表面積最小 目的: 因表面積最小因此可以讓製造成本降低幫助企業省錢 算式如上 答案我也使用python驗證一下求出數值解 接下來換個角度跟工具
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
大學記憶中的程式課,我過得很痛苦。以為懂了,作業卻永遠寫不出來。有鑑於過往痛苦的經歷,學程式語言類似學習外語,應該從需求出發,並且以生活中可理解的事物當作範例學習。所以去年大膽的進行了一個實驗:我們來上中小學生的 Python 課程,透過寫程式解數學題目培養直覺。男孩們選了一個非常瓊瑤的題目!
Thumbnail
本文詳細探討了Tesseract的box定義。經驗分享釐清了Tesseract與cv2.rectangle的座標差異,解釋了怎樣使用JTessBoxEditor進行框的驗證。透過範例,讀者將瞭解如何正確設置字符的bounding box,並學會轉換OCR座標為Tesseract所需格式
Thumbnail
OpenCV 支援讀取和保存 TIFF(Tagged Image File Format)檔案,但對於合併多張圖片成為多頁的 TIFF 檔案,OpenCV 沒有的這功能。 可以使用 Pillow 庫(Python Imaging Library, PIL 的分支)來實現。
RPG Battle Game 說明文件 簡介 這是一個簡單的回合制 RPG 遊戲,玩家與怪物進行戰鬥,雙方有不同的技能可以使用。遊戲目標是擊敗對手,將其生命值削減至零。 程式架構 1. Character 類別 Character 是一個基礎類別,表示遊戲中的角色,包括玩家和怪物。所有角
今天讓我們來聊聊 Python 中的『enumerate』這個函數, enumerate 是 Python 中一個非常有用的內建函數,它允許我們在迭代序列(如串列、數組(元組)或字串)時,同時獲取串列元素的索引和值。這在需要追蹤元素位置的情況下特別方便,不需要手動管理索引變數。 ◎enume
Thumbnail
"求和"應該是我們最常用到的基本數學運算了,利用迴圈和切片的技巧,以下的程式碼能分別印出每個人的總分和各科的總分。
Thumbnail
實務工作上,我們很可能會遇到需要對每張工作表的某一固定位置儲存格求和的情況。比如說,E5儲存格存放每個月的業績總額,以下的程式碼可以求得一整年的總營業額。 以下的程式碼則是用更具Python風格、更精簡且更漂亮的列表推導式(List Comprehension)來輕鬆達成同樣的功能。
Thumbnail
我們利用工作表的move_range()方法,可以輕鬆地移動儲存格。其中,rows參數的值表示向下移幾列,cols參數的值表示向右移幾行;當rows參數的值是負數時,則表示向上移幾列;cols參數的值負數時,則表示向上移幾行, 也可以一次移動一整個區塊範圍的儲存格。 利用工作表的freeze_pan
Thumbnail
我們可以利用工作表的append()方法,在工作表的列尾添加資料列。 利用迴圈的技巧,我們可以批次賦予區塊內所有儲存格相同的值。 我們也可以在指定的列(行)之前插入指定數量的空白列(行),從指定的列(行)開始向下(右)刪除指定數量的列(行)。
Thumbnail
其餘讀取整列、整行和所有儲存格等的方法,詳見以下程式碼的註解說明。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
大學記憶中的程式課,我過得很痛苦。以為懂了,作業卻永遠寫不出來。有鑑於過往痛苦的經歷,學程式語言類似學習外語,應該從需求出發,並且以生活中可理解的事物當作範例學習。所以去年大膽的進行了一個實驗:我們來上中小學生的 Python 課程,透過寫程式解數學題目培養直覺。男孩們選了一個非常瓊瑤的題目!
Thumbnail
本文詳細探討了Tesseract的box定義。經驗分享釐清了Tesseract與cv2.rectangle的座標差異,解釋了怎樣使用JTessBoxEditor進行框的驗證。透過範例,讀者將瞭解如何正確設置字符的bounding box,並學會轉換OCR座標為Tesseract所需格式
Thumbnail
OpenCV 支援讀取和保存 TIFF(Tagged Image File Format)檔案,但對於合併多張圖片成為多頁的 TIFF 檔案,OpenCV 沒有的這功能。 可以使用 Pillow 庫(Python Imaging Library, PIL 的分支)來實現。
RPG Battle Game 說明文件 簡介 這是一個簡單的回合制 RPG 遊戲,玩家與怪物進行戰鬥,雙方有不同的技能可以使用。遊戲目標是擊敗對手,將其生命值削減至零。 程式架構 1. Character 類別 Character 是一個基礎類別,表示遊戲中的角色,包括玩家和怪物。所有角
今天讓我們來聊聊 Python 中的『enumerate』這個函數, enumerate 是 Python 中一個非常有用的內建函數,它允許我們在迭代序列(如串列、數組(元組)或字串)時,同時獲取串列元素的索引和值。這在需要追蹤元素位置的情況下特別方便,不需要手動管理索引變數。 ◎enume
Thumbnail
"求和"應該是我們最常用到的基本數學運算了,利用迴圈和切片的技巧,以下的程式碼能分別印出每個人的總分和各科的總分。
Thumbnail
實務工作上,我們很可能會遇到需要對每張工作表的某一固定位置儲存格求和的情況。比如說,E5儲存格存放每個月的業績總額,以下的程式碼可以求得一整年的總營業額。 以下的程式碼則是用更具Python風格、更精簡且更漂亮的列表推導式(List Comprehension)來輕鬆達成同樣的功能。
Thumbnail
我們利用工作表的move_range()方法,可以輕鬆地移動儲存格。其中,rows參數的值表示向下移幾列,cols參數的值表示向右移幾行;當rows參數的值是負數時,則表示向上移幾列;cols參數的值負數時,則表示向上移幾行, 也可以一次移動一整個區塊範圍的儲存格。 利用工作表的freeze_pan
Thumbnail
我們可以利用工作表的append()方法,在工作表的列尾添加資料列。 利用迴圈的技巧,我們可以批次賦予區塊內所有儲存格相同的值。 我們也可以在指定的列(行)之前插入指定數量的空白列(行),從指定的列(行)開始向下(右)刪除指定數量的列(行)。
Thumbnail
其餘讀取整列、整行和所有儲存格等的方法,詳見以下程式碼的註解說明。