matlab使用雜談4-偏微分方程求解之pdede函數使用

偏微分方程

偏微分方程(Partial Differential Equation,PDE)指含有未知函數及其偏導數的方程,自變量的個數爲兩個或兩個以上。描述自變量、未知函數及偏導數之間的關係
偏微分方程分爲
1、線性偏微分方程式
2、非線性偏微分方程式

求解偏微分方程的數值方法

1、有限元法(Finite Element Method,FEM)
2、有限體積法(Finite Volume Method,FVM)
3、有限差分法(Finite Difference Method,FDM)
還有其他FFEM、XFEM、MFEM、DGFEM等方法

Matlab解偏微分方程

pdepe()函數

可求解一般的PDEs,具有較大的通用性,但指支持命令行形式調用
matlab中關於pdepe函數的用法
語法
sol = pdepe(m,pdefun,icfun,bcfun,xmesh,tspan)
sol = pdepe(m,pdefun,icfun,bcfun,xmesh,tspan,options)
[sol,tsol,sole,te,ie] = pdepe(m,pdefun,icfun,bcfun,xmesh,tspan,options)

變量

參數 含義
m 與該問題的對稱性相對應的參數。m 可以是平板 = 0,柱狀 = 1,或球面 = 2。
pdefun 定義函數句柄
icfun 初始條件函數句柄
bcfun 邊界條件函數句柄
xmesh 向量 [x0, x1, …, xn],用於指定需要針對 tspan 中每個值求數值解的點。xmesh 的元素必須滿足 x0 < x1 < … < xn。xmesh 的長度必須 >= 3。
tspan 向量 [t0, t1, …, tf],用於指定需要針對 xmesh 中每個值求解的點。tspan 的元素必須滿足 t0 < t1 < … < tf。tspan 的長度必須 >= 3。
options 基礎 ODE 求解器的部分選項可以在 pdepe 中使用:RelTol、AbsTol、NormControl、InitialStep、MaxStep 和 Events。在大多數情況下,這些選項的默認值可提供滿意解

分割線----------------------------------------------------------------------------------
:該部分涉及數學知識可不過分關注,但需要充分理解方程格式

pdepe函數主要用來結算以下格式的PDE方程
在這裏插入圖片描述
x與t的範圍需要處於有限範圍
對於 t = t0 和所有 x,解分量均滿足以下格式的初始條件
在這裏插入圖片描述
對於所有 t 和 x = a 或 x = b,解分量滿足以下形式的邊界條件
在這裏插入圖片描述
q 的元素全部爲零或都不爲零(至於原因是什麼,我還沒有搞懂…)。請注意,邊界條件以通量 f 的方式而不是 ∂u/∂x 表示。同時,在這兩個係數之間,只有 p 可以依賴於 u。

分割線----------------------------------------------------------------------------------
在調用 sol = pdepe(m,pdefun,icfun,bcfun,xmesh,tspan) 中:
m 與 m 對應。
xmesh(1) 和 xmesh(end) 對應 a 和 b。
tspan(1) 和 tspan(end) 對應 t0 和 tf

pdefun 計算項 c、f 和 s (公式 1)。其格式爲
[c,f,s] = pdefun(x,t,u,dudx)
輸入參數爲標量 x 和 t,以及向量 u 和 dudx,分別接近於解 u 及其相對於 x 的偏導數
icfun 計算初始條件。其格式爲

u = icfun(x)
當與參數 x 一起調用時,icfun 會計算並返回列向量 u 中 x 處的解分量的初始值。

bcfun 計算邊界條件 (公式 3) 的項 p 和 q。其格式爲[pl,ql,pr,qr] = bcfun(xl,ul,xr,ur,t)
ul 是在左邊界 xl = a 的近似解,ur 是在右邊界 xr = b 的近似解。pl 和 ql 是對應在 xl 上計算的 p 和 q 的列向量,類似地 pr 和 qr 對應 xr。當 m > 0 且 a = 0 時,x = 0 附近解的有界性需要通量 f 在 a = 0 時消失。pdepe 會自動設置此邊界條件並且會忽略 pl 和 ql 中返回的值。

pdepe 以多維數組 sol 的形式返回解。ui = ui = sol(:,:,i) 是解向量 u 的第 i 個分量的近似值。元素 ui(j,k) = sol(j,k,i) 在 (t,x) = (tspan(j),xmesh(k)) 處近似於 ui。

上面的講解主要摘抄於matlab的官方文檔,還需要更加詳細的講解可以參考matlab中關於pdepe函數的用法,該文檔目前也是中文文檔,便於觀看,不過理解起來需要挺久,也可以直接看看我下面的實例,根據實際例子爲你一一解開PDE的解法

pdepe函數使用示例

由於CSDN中不好輸入公式,我以圖片格式上傳微分方程,對於下列微分方程、初始條件及邊界條件,一一轉換爲matlab中pdepe函數求解格式

PDE方程求解格式

在這裏插入圖片描述
對應matlab代碼

 function [c,f,s]=pdex1pde(x,t,u,DuDx)
    c=pi^2;
    f=DuDx;
    s=0;
 end

PDE方程初始條件格式

在這裏插入圖片描述
對應matlab代碼

function uo=pdex1ic(x)
    uo=sin(pi*x);
end

PDE邊界條件格式

在這裏插入圖片描述
對應matlab代碼

function [pl,ql,pr,qr]=pdex1bc(x1,u1,xr,ur,t)
    pl=u1; 
    ql=0; 
    pr=pi*exp(-t); 
    qr=1; 
    end

Matlab代碼

m=0;
x=linspace(0,1,20); % 方程區間爲(0,1)
t=linspace(0,2,10); % t 的範圍可以隨取,只需要大於0即可
sol=pdepe(m,@pdex1pde,@pdex1ic,@pdex1bc,x,t); % 10x20的矩陣與t*x的維度一致
u = sol(:,:,1); %解向量 u 的第 1 個分量的近似值
surf(x,t,u) 
title('Numerical solution computed with 20 mesh points.')
xlabel('Distance x')
ylabel('Time t')

figure
plot(x,u(end,:))% t=2時,u隨x的變化曲線
title('Solution at t = 2')
xlabel('Distance x')
ylabel('u(x,2)')

求解偏微分方程

求解偏微分方程的過程其實與上述過程一致,只不過所有步驟都使用向量格式來存儲,此處直接Copy Matlab中的實例和代碼,自己按照上面研究一下即可。
在這裏插入圖片描述
在這裏插入圖片描述
對應matlab代碼

m = 0;
x = [0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
t = [0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];

sol = pdepe(m,@pdex4pde,@pdex4ic,@pdex4bc,x,t);
u1 = sol(:,:,1);
u2 = sol(:,:,2);

figure
surf(x,t,u1)
title('u1(x,t)')
xlabel('Distance x')
ylabel('Time t')

figure
surf(x,t,u2)
title('u2(x,t)')
xlabel('Distance x')
ylabel('Time t')
% --------------------------------------------------------------
function [c,f,s] = pdex4pde(x,t,u,DuDx)
c = [1; 1]; 
f = [0.024; 0.17] .* DuDx; 
y = u(1) - u(2);
F = exp(5.73*y)-exp(-11.47*y);
s = [-F; F]; 
% --------------------------------------------------------------
function u0 = pdex4ic(x);
u0 = [1; 0]; 
% --------------------------------------------------------------
function [pl,ql,pr,qr] = pdex4bc(xl,ul,xr,ur,t)
pl = [0; ul(2)]; 
ql = [1; 0]; 
pr = [ur(1)-1; 0]; 
qr = [0; 1]; 

以上代碼引用自matlab官方函數文檔

總結

上述就是matlab中解偏微分方程中pdepe函數的用法,說實話有些複雜,我也是看了挺久才理解,但由於沒有真正應用在建模實例上,現在也不知道對他的掌握情況是咋樣,之後建模過程中上傳一下我的應用實例給大家參考一下,嘿嘿。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章