|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
) k$ q5 u& p: R( f8 k其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
8 b* z" B9 F2 ?& v9 R+ I sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options). [1 ^4 e |8 z* T
+ N# ^8 e$ h0 S3 M& `3 w![]()
' ~3 w7 ~. i# m$ R% r; o% z$ R& C6 n6 N5 E+ b! A
- F/ l" `" u: H: B: p注:+ K$ e# F: l6 E2 m
$ s# Z0 e I3 _9 D4 [( ?
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
" ?: J4 K9 e' y# ?# x- _6 f0 u9 p1 B0 f" Q9 t% L* @3 X6 m
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。, i" Q- H0 j& v: Z
3 F& Z8 t( g( X( i0 z; Z f Q
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。3 m9 P+ r" f% v3 ?
& V$ V* ~1 e$ g6 [$ t) d. a1 _, d' c
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:6 L0 Q2 O6 [9 Q( z
4 m/ o( l7 f5 F. N6 {( A* r
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)" w' O0 v$ H9 Q4 q: i
3 H, ]* j) m- P( b2 P
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
2 T9 J+ A- S' W$ w; i! ^
& F+ s9 p. o; X1 |' M O6 ]![]()
- N8 T. ?' u5 X2 w; x' L7 |; x8 p4 \- w+ |; A. R$ Q
ref. Keel,R.D. and M. Berzins,“A Method for the Spatial Discritization of Parabolic Equations in One Space Variable”,SIAM J. Sci. and Sat. Comput.,Vol.11,pp.1-32,1990.
) g( `; e5 x& f$ m$ H, n. a( R2 q; }4 E- K
以下将以数个例子,详细说明 pdepe 的用法。
! `) L8 N: ]9 h6 n6 b; z6 L5 v: C. T+ N1 O
3.2 求解一维偏微分方程6 E' A# [7 c% R) N9 H- _
例 2 试解以下之偏微分方程式+ @/ F6 X; K- o+ J, ^6 ~
. w: {0 u6 i$ w3 n, u
![]()
& h+ u% }. M: B2 t' f' P8 S+ N( I
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
. A t; } `7 X
T- `' F: Z$ q8 F4 D步骤 1 将欲求解的偏微分方程改写成如式的标准式。9 E# l: {6 |3 B( E
6 C2 | e5 B& Y* Q; E2 x6 R2 {
4 ~* r. f6 Y7 \
- ?# W% u& o# Z, {& \步骤 2 编写偏微分方程的系数向量函数。
5 X/ N) H6 y' Y7 ~6 L! L& c
. \" W% s* n1 K& I# ?4 V" Afunction [c,f,s]=ex20_1pdefun(x,t,u,dudx) - ?4 F& R. X2 `7 d/ p" S( Y/ S2 Y
c=pi^2;
$ [6 b6 \/ T# |f=dudx;
0 p1 X1 {8 ?$ L; F+ ~" a! js=0;2 k9 @+ i' t0 a4 U. C% H9 b) J
$ v& I) E. b9 f" B4 Z* a5 S
) o. S8 o7 J# d' i8 k" u/ b( U" ~$ J9 r! }: O8 o6 w
步骤 3 编写起始值条件。$ |% Z; K! U9 u3 e8 \" _. r
4 v3 k: h6 E; \7 j. a$ J
function u0=ex20_1ic(x)
' o; o0 j4 J! g$ L) ku0=sin(pi*x);7 a2 k$ s! N0 Z9 E0 N4 V: X6 D: J
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
5 ^. u1 Z* R, M1 ~1 ^+ p, qfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)5 O+ C2 U' c- k
pl=ul;
3 i' s# F2 U5 @4 _! n8 z- Gql=0;
! Z3 k& U5 N5 m8 ipr=pi*exp(-t);3 P. c, L2 H5 _/ n' h
qr=1; + u$ x6 P- b! a
$ e- |0 I9 e8 G+ b9 [+ u. u9 e, |0 g$ G5 w2 O) g: Z
步骤 5 取点。例如
b5 h7 ^( \- y' @* n
2 J) |, B) W' S D4 E1 ^8 R5 O: j, U. p
x=linspace(0,1,20); %x 取 20 点
G- y. K0 X, s7 Zt=linspace(0,2,5); %时间取 5 点输出- h2 y" m8 h9 @) r: l6 t! ~# e
& ~9 D; V3 N2 f5 F4 f
/ q- d8 f" y3 d$ ~+ T; z步骤 6 利用 pdepe 求解。; y- m l) b9 P/ Y; V
) b, G; u p, W* R2 U8 l! C+ Fm=0; %依步骤 1 之结果
X9 |. i6 a+ h8 \- t% psol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
0 V' i) ^! W$ J7 _$ s( L+ w$ s( R3 s
$ D8 _; j* n3 {: R) ?! a5 Q& d" g$ l) ? Y# X( {+ ]# W* s
步骤 7 显示结果。/ D1 m9 w, W3 c5 ~
0 H" c2 w6 \8 ?
u=sol(:,:,1);5 L5 |5 E/ j4 j8 K' _/ n8 D
surf(x,t,u)
( e; u! B% U: ^0 }0 g. z' Ititle('pde 数值解')( k/ `) C' Z% Q4 [8 g' x* f
xlabel('位置')/ D( @" F! t3 f* Z) o- Z& b
ylabel('时间' )8 n; E7 S1 B, \+ o8 b) A7 |. e
zlabel('u'), v R* l% o% Z( O( I2 s2 g1 |
( v! v$ l$ F7 R( z- B# g
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
- {. K0 [+ l4 C3 l! C" Y) V3 z v( H2 e
figure(2); %绘成图 2; ]4 G% B8 f: b
M=length(t); %取终点时间的下标0 m# R- @4 M; S+ Y: Y
xout=linspace(0,1,100); %输出点位置0 ?' x7 t4 v" S& M
[uout,dudx]=pdeval(m,x,u(M, ,xout);0 m7 m' g# `8 m/ Q6 |/ P- M3 a
plot(xout,uout); %绘图
: C& D+ k3 y, }% b O% Y; W' k: ttitle('时间为 2 时,各位置下的解')% ]4 @. P: m7 D- p# B/ d$ t
xlabel('x')
# Z+ U% \) f" w( a {ylabel('u')
6 O7 m% L& f$ \0 q0 i% n+ q- Z* x" }3 |( o C
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
' ^, o1 O4 z# S2 y6 C. Q1 r6 @8 w" ]0 k7 O5 ]
function ex20_1
/ K3 f3 z. v5 W* c* D. T V%************************************
8 x3 O4 D) h A%求解一维热传导偏微分方程的一个综合函数程序
" q2 L; H8 F9 `%************************************" ]+ T, Y5 v+ Z1 ]
m=0;
! q2 C# @* h% f$ S' w: Tx=linspace(0,1,20); %xmesh
" l/ _% H9 y, M, O7 l+ l& m7 R8 It=linspace(0,2,20); %tspan
! L: L" {) d: y' C* ?, q; y%************! S$ ? b- B4 J
%以 pde 求解+ e& e$ a4 r# @9 Y
%************3 ^( k/ a/ a! ]# q. R) r
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);( K$ x) e' z' _
u=sol(:,:,1); %取出答案
( I ?/ H; P6 g%************% H- M3 S$ Q- z0 _8 I+ m3 G
%绘图输出
; f6 o* S) u$ Q: f%************% u B8 i* x# w! [
figure(1)
7 B6 z5 y* C2 I- hsurf(x,t,u)8 r8 |* F9 V$ _5 Y0 k) w% f
title('pde 数值解')6 p% b! p& i3 D2 ^: b
xlabel('位置 x')
m; V$ B+ r9 I7 Z7 o1 tylabel('时间 t' )% I# k3 u* Y( T+ n3 o$ L% s
zlabel('数值解 u')
$ B( T% f8 M- A0 T6 \' E- Y7 u8 ?/ T%************* ]% d7 ^* `$ a, {
%与解析解做比较: n) \9 g* [' @3 Z
%*************
1 ?( p6 y: B3 P2 h! w2 m) n: z& }; ]figure(2)
0 N9 {% e) y: g z" @" G7 Xsurf(x,t,exp(-t)'*sin(pi*x));) K6 D8 X2 Q) x7 N4 P
title('解析解')2 U0 t2 P* c9 N# r A* Q0 X- m
xlabel('位置 x')) }) |% Z. D( M- M0 F# s4 a$ q
ylabel('时间 t' )6 }% m% w3 g0 Z- q# s
zlabel('数值解 u')9 [- `* B8 y) n2 S
%*****************" e' I7 q" m6 {5 E8 i. V
%t=tf=2 时各位置之解
+ g2 V X# u* z& G3 ]%*****************8 i& N9 m' L. G. k2 P# X! ~% ]
figure(3)$ H+ K, S" n6 G5 Y' M1 F: T* E
M=length(t); %取终点时间的下表
' q! |) p/ v/ y$ d4 sxout=linspace(0,1,100); %输出点位置6 K$ f& \ h, Y1 u4 ^
[uout,dudx]=pdeval(m,x,u(M, ,xout);
; e9 j+ A+ o0 Y) z) G' j) d2 M1 c4 s, Mplot(xout,uout); %绘图
4 {: P: h: l, `' @ Y0 xtitle('时间为 2 时,各位置下的解')2 w* r+ c- c9 t8 U' V& ~6 h
xlabel('x')- @1 `+ q: C- \& N$ E
ylabel('u')0 P( B! X4 W# d8 h4 g' R) q
%******************" o5 }! U! [9 L3 g
%pde 函数! a; Q1 X& r9 [
%******************5 d" Q, m6 r* ]4 ~# ^) R0 f
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
" I7 Y1 L3 P7 P& A( G9 k2 q/ cc=pi^2;
/ W+ G* t! n `4 ^) Df=dudx;
# _" Q" u! C. v- X! j% |4 Cs=0;) j* D7 m0 P; M3 x$ X( M
%****************** . c u+ B+ d% V0 m5 R N, _
%初始条件函数9 T% e2 t$ p: a4 U% j
%******************# j. ^+ H7 n+ n/ f
function u0=ex20_1ic(x)
; i9 g, d+ P: I9 `" L6 n' u% }* ]5 xu0=sin(pi*x);
/ B7 y! U% o6 V: X) e% w%******************3 n8 M# |# \ g6 Q: g/ A& ?: b& Y
%边界条件函数% F+ @& w% J& t) J2 ~
%******************
z2 s" q5 V( P' H, {function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)5 i' v' F: ^* R- G& j+ x! ~/ |
pl=ul;0 V% ]3 A) O7 b# ]$ h* d9 H
ql=0;' c/ s# D/ ]6 A) q
pr=pi*exp(-t);" p4 d( T1 X' [1 x1 s% _* v5 r. s
qr=1;( k2 M8 c- a- U! I" b0 s
; O0 {# H: L6 m' V0 r! \& w' {4 \
* c+ ]8 l/ W$ e' W0 I
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() # J- }4 L5 v0 b) Q
![]()
步骤 2:编写偏微分方程的系数向量函数
1 s3 h' d+ N& W4 s8 pfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx) u# e# [6 p/ x# F/ V& [ B2 L
c=[1 1]';7 o& F, c8 Z2 o3 Y3 d. T5 N! X
f=[0.024 0.170]'.*dudx;
! ]9 \5 P7 z* j/ X2 g. q; v7 Qy=u(1)-u(2);
' ~) q( Y! r/ q" _: E5 HF=exp(5.73*y)-exp(-11.47*y);7 [' W2 h) c* }
s=[-F F]';* T$ o7 Y3 y( h8 M( I _/ e* i4 w
2 h- j* a! y- V# P2 T5 B
+ `" {: e6 I/ C步骤 3:编写初始条件函数
9 r* x. \2 R) F6 {
1 @8 V3 ] V* |9 C8 Yfunction u0=ex20_2ic(x)
% }6 Y, b' \2 R- ~' ju0=[1 0]';# b$ n& Q/ K3 I
& a% G3 u8 L1 U* f) Z
步骤 4:编写边界条件函数
( L9 e( E) O* |, C+ I# R' @, z% l+ Z& P h" ~3 \4 C( j! D4 B
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)7 c$ C# i! i& V! ]: ^
pl=[0 ul(2)]';
8 j9 L e; l* i. w# c1 ?* Fql=[1 0]';
6 ^; B. Q! l; L* Npr=[ur(1)-1 0]';
1 g, T9 d% Y, Y5 Tqr=[0 1]';
" G9 u- I4 e$ J- u. S/ m! }3 Z, f0 K/ b
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,7 t4 x- l( Z: X% w1 L5 ~5 L
( u& V0 k8 s) ^3 A$ Xx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
7 ?5 m1 W& V& x- j! M% St=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; " k1 \, ?( W/ ]) O
' E% M% r9 C, ?) P# N. e以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:8 l* N+ K$ U5 H3 g$ f9 ?
' M7 ^' W. y- f) N- ~4 cfunction ex20_2
2 a/ n% S$ T1 K( U, A%*************************************** 2 d) t A$ i3 ?: |
%求解一维偏微分方程组的一个综合函数程序
) \' x1 s8 L' |' o2 Z0 H%***************************************: o) x4 ]4 t8 B% `$ K
m=0;% C% @: y: f/ {! ]8 b+ A$ n
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];) H! k1 o! n' U- Z2 W) Y! \
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];% A2 M$ q7 ~' x; b
%*************************************
. G- t7 e: G. S+ g" c+ n%利用 pdepe 求解8 v: D0 u/ G* w, L/ Y% R: K
%*************************************6 v6 B7 m3 G V
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);0 _' o4 a0 \: N9 p) j8 ^) p
u1=sol(:,:,1); %第一个状态之数值解输出! O- B$ P# }# g6 J
u2=sol(:,:,2); %第二个状态之数值解输出8 H1 ?$ j4 `% G* w5 }) A
%*************************************3 j0 b' |: _" `. D, Y- X/ a3 {/ W
%绘图输出
. _& x! g0 V3 Z9 ^! K4 E%*************************************8 k5 ~! u* r- _3 m! G
figure(1)
- ?) X: \7 n) H- |$ G0 ?surf(x,t,u1)6 s! O- z7 H) @$ ]
title('u1 之数值解')8 u5 v3 @" W+ W6 H: N2 ]
xlabel('x'): m5 |; y t, t4 B; g
ylabel('t'), `* N. |/ l4 Y/ H
% g( @4 M: f+ A% _# B) `
figure(2)1 v3 n& G' U' z" _6 Y% D
surf(x,t,u2)
: e. [" b( j8 z0 e- G x! C7 ^( S( Htitle('u2 之数值解')
6 E9 M# ~" |' k& B$ d: Kxlabel('x')
, ^9 N/ ]7 g* ? B6 T' C" X% tylabel('t')
" p n9 I' p8 M, C%***************************************2 H7 f. }3 h8 ?5 n, k
%pde 函数+ ]7 s1 n2 _) Q( q# J9 N' S! r
%***************************************- ?! W. u( N* G. ^. l
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)9 r0 I7 _& s& P( U' s
c=[1 1]';, o! G. u/ }; _
f=[0.024 0.170]'.*dudx;
3 D3 K) U+ L5 R! b7 P& M2 Ly=u(1)-u(2);: h/ h' u ^ w" v1 h0 O, [3 y4 E
F=exp(5.73*y)-exp(-11.47*y);
R: i+ |* C. K. `0 t7 hs=[-F F]';
( _, w" u$ M {7 T3 m3 T%****************************************$ {( p& s0 _5 n6 `" [
%初始条件函数
2 ]& R* n" o; ? R8 t) a%****************************************: j p0 A2 `* J/ ?4 H
function u0=ex20_2ic(x)
1 u. D- V" S6 `u0=[1 0]';4 S4 }+ z5 R( m
%****************************************- ?" ?$ U& K3 {& K& w! D
%边界条件函数
" s$ y8 n4 o/ {8 t& g Q; S+ ]" F%****************************************! }$ n/ h) Y1 a; z0 R
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)0 G- C: }# Y! [$ i' b! }
pl=[0 ul(2)]';
: U9 A$ v1 h; Sql=[1 0]';
2 [# \' a' o" |" s3 t/ Ipr=[ur(1)-1 0]';/ A/ _3 @" t* _4 p, {0 X1 k
qr=[0 1]';* Y R3 r8 j9 f
" H* \, b# h, A+ ]( d————————————————/ k+ g9 R' l: L" A/ }6 n! @9 r: G+ n* z
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ ~( K0 K: A8 P9 |- i原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
$ `# F4 d" X/ ~( k; ]
[1 }. S2 d5 f/ ]( b4 O9 r* [- l" L4 \9 d* Q6 f! ^
|