|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() 0 p0 M; S4 M& |# z% ~
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
* H7 b) t" b! }5 e6 t' Y N sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
8 @7 g1 t* g+ \+ D! T
# g/ Y% C8 v8 \1 |- u![]()
" x E! d5 N4 [- y" D8 \' M- T3 j7 ]# d
3 ^0 w( f8 f6 Y6 ^9 j+ p7 U% ?( L4 I注:
& c, m5 }+ H# w# o
, D2 E: I* M; H1 j* U( ?1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。5 \3 s$ O) w0 G0 p7 v4 [. d$ |
4 ^1 i: ], s# M2 z+ a- ?
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
9 s+ `& r" x2 f0 ]% b r( b
' u7 l2 }' a) O+ B3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。5 e! `/ F7 w9 M0 i! j+ {
' u& c. d0 k3 q7 s0 S
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:0 Q% h1 ~+ j+ L# C8 @2 \# z8 b: U
8 l3 ~- O: D& I$ ~, d1 v7 N
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
# f: Y. P- O- y' |0 Q. g+ M; C2 Q* X6 }" `1 E* Q
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
) v% A! \# }! _8 ]) {, S' x
2 x$ T- l9 n: g b![]()
9 g% b' W( }5 ^2 |5 M8 c
; | p1 a- S$ n8 nref. 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.
/ L) F! u$ w; W
3 w, m; w1 ?# J) C% {. n以下将以数个例子,详细说明 pdepe 的用法。8 i4 W8 {& K) b7 M' I# A
7 }( _9 e z t1 T3.2 求解一维偏微分方程; M' b- P: h$ q; o0 z8 J
例 2 试解以下之偏微分方程式0 J/ |1 z$ C# w5 O' y. d, ~
+ O" B, q7 V! U: Z/ D! G% a6 F$ d
4 \0 ?$ D8 h, }) b, u) i! `) c
2 A, T2 c3 l3 L) ~, x( U7 j
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
4 x( {% g% e: L$ }8 ^9 o8 ]2 g& r$ s | M4 i
步骤 1 将欲求解的偏微分方程改写成如式的标准式。/ N5 }! r/ e% R, O
( g3 y& A& e6 Q% U) [( F![]()
; [) I5 R7 }% Q2 j) @$ U, M B! M! o( Z& D
步骤 2 编写偏微分方程的系数向量函数。+ w" @, Z `. X; _- z6 a# T
$ @+ M* V) C$ q6 q6 G: |. O& c f
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
+ L7 |- t7 ~! o! v; f9 m9 p6 J3 kc=pi^2;7 V1 {& Q0 i% B6 [( T
f=dudx;
4 r4 K: t' `/ z4 m3 i Js=0;
: e. b) B1 V3 ~: _1 }0 c" u2 l6 a9 g
- ~7 C' ?; N" F0 G+ |
. p! `1 Z$ X8 J
步骤 3 编写起始值条件。
. W1 E4 p6 C4 k2 I5 x5 H u; |1 ?& H7 i) V3 t3 y1 w
function u0=ex20_1ic(x)
, d, H8 O4 w# G' |5 ]) A# du0=sin(pi*x);$ T+ B u/ s; y* s9 e5 t: W, {
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
$ p( `; E+ t: [0 H% Q7 o% |# dfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t); A/ X. A2 p9 b# z* F5 L
pl=ul;
# G. B. W4 C9 ~8 |" Uql=0;7 S. H7 M. O3 Y# Z
pr=pi*exp(-t);
: g2 ?6 O" o; u9 v5 ^qr=1; . f" g6 q0 ]) I7 b' U- n# l2 X# z
3 b& a' [, `: z4 n. {
+ V& b! i! @: D- P步骤 5 取点。例如
- D, _9 p! P) ]" T0 _2 w$ V) J2 \) |' p4 @9 W. Y
, M' {$ h! a5 v0 Z4 cx=linspace(0,1,20); %x 取 20 点4 w8 z9 b8 q, ~
t=linspace(0,2,5); %时间取 5 点输出0 b0 e& E$ w; x* s* J; ]
$ @$ e# b1 y& f c% [2 v) d( H' w4 b3 d) Y9 G: U; g' E
步骤 6 利用 pdepe 求解。) ]" A* R7 z7 H$ w$ Y
+ S3 Z2 B# C6 Y0 J7 im=0; %依步骤 1 之结果
3 I" O7 @) G' A* E+ |- E2 K) rsol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
1 Z% Y# V( I W7 L+ ?
, A: x0 r3 M3 [. d5 D! S B2 R* H( w
步骤 7 显示结果。( H2 G3 F" }& o* m6 m
j: _* o! s# b( `4 m$ Mu=sol(:,:,1);
; r( T: R9 {! Fsurf(x,t,u), ?- L! i$ L4 M1 S
title('pde 数值解')
8 J* I) k4 P, Sxlabel('位置')- X) k& R- f8 P
ylabel('时间' )6 z' s. q4 G2 s
zlabel('u')) P# k1 C! l) X- G9 {0 J
' s8 x' f5 v+ s9 R/ _
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
1 W$ X1 v/ _1 d8 L1 K1 e
7 n9 t$ P/ Z7 A2 V8 ]figure(2); %绘成图 2- T: G2 i6 i# Y0 u
M=length(t); %取终点时间的下标
0 b2 X) y q0 P \ q8 ~xout=linspace(0,1,100); %输出点位置; X' U: s, v ]' m$ P2 q$ B" o2 x
[uout,dudx]=pdeval(m,x,u(M, ,xout);4 x, O, n6 ~. u/ _0 P4 L8 E* r
plot(xout,uout); %绘图2 k4 F ]% |( H& ^. N, [0 U
title('时间为 2 时,各位置下的解')" u' |/ V0 E4 Q& l
xlabel('x')3 _6 D+ q6 B& G' J' f
ylabel('u') * s' s! ^/ T# Z# a$ S1 K; t
" q% t ~8 r4 O! K综合以上各步骤,可写成一个程序求解例 2。其参考程序如下9 C: @* X- U/ Y6 E& ^, [) y2 k5 ~
6 P& y4 T1 }8 |- Y3 Z8 U* ?. b+ w
function ex20_1+ m2 K5 W+ V7 Z% J% t
%************************************: z4 B$ Y) t |# r7 [
%求解一维热传导偏微分方程的一个综合函数程序- F# t+ J& U( J: d8 n3 t
%************************************
- ?% C3 {; z+ z0 ~& ~m=0;
% U- ~1 R( |* ]3 Tx=linspace(0,1,20); %xmesh
/ O+ f9 L3 s# Y: X8 o) N. Pt=linspace(0,2,20); %tspan
/ C3 e- O4 x$ D: k( Z4 F%************
) d+ L0 W9 ~6 v' v2 e4 y/ |%以 pde 求解
0 S2 i7 q, z' E" c$ o8 d%************4 q, y' ~ f0 g8 Z* r
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
8 f4 V W- E# \" m ]u=sol(:,:,1); %取出答案
; u/ @* P: l+ ]1 ?' s+ [0 j%************ x2 J( P6 W9 e2 Q# ^' k
%绘图输出- Y/ }" r! W8 `
%************. ~' f" X! i6 w% M/ Z) K- i9 K
figure(1)* k7 U0 ^9 b) j! o% R6 t8 r G
surf(x,t,u)
; r: \6 T7 a8 F+ g- s) W& X3 X: i3 ltitle('pde 数值解')
( F" w' M/ g/ z6 R, dxlabel('位置 x')6 \8 G* B3 Z0 B: K0 S
ylabel('时间 t' )
0 n) S0 p; T! ^" u) T7 V7 |zlabel('数值解 u')
) {5 Z5 ?) Y6 u%*************/ v" q9 U9 S3 T# ]; h
%与解析解做比较8 f/ ]9 T9 _) ]/ O8 R
%*************+ ]: U$ j9 q. s: p% _
figure(2)
7 q2 s( u' E$ a! f/ j) k$ n( J$ Qsurf(x,t,exp(-t)'*sin(pi*x));
: j0 h# N7 p) e, g6 U2 }title('解析解')) c# R6 V: P! n' Z; b
xlabel('位置 x')
( J* ~& {8 o; q0 M' |! Fylabel('时间 t' )1 f- }% g. F. P* g, I$ ]
zlabel('数值解 u')
( I5 H+ C/ D% q0 X7 N%*****************4 y% |# C# f2 ]. y, {
%t=tf=2 时各位置之解 o8 x' Q) Y' r- F% J
%*****************
- ` v$ b" u5 D$ gfigure(3)
& E1 C8 g/ A9 j$ g4 m7 E0 | ?M=length(t); %取终点时间的下表
7 h( F B9 \6 e# a2 e; _7 Txout=linspace(0,1,100); %输出点位置# K# K/ o4 }* W+ r
[uout,dudx]=pdeval(m,x,u(M, ,xout);5 ]. d; `& e* s5 _% ~
plot(xout,uout); %绘图5 E4 E. U. {8 b3 S- p( Q
title('时间为 2 时,各位置下的解')
1 M. p6 Q+ G4 ^! lxlabel('x')
1 K8 }4 I+ V3 {6 Kylabel('u'); G+ y6 |6 Y% w8 [2 m
%******************3 S/ I5 C* a$ z# [2 o
%pde 函数
5 D! d- G% l9 v8 r# z%******************* _! g: j2 {$ t3 {2 A2 ^
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
+ b& }9 n* U$ s7 x8 H( h! Fc=pi^2;
% b, x: }: n4 J" A, @# d; ff=dudx;; S: @. w/ h' ]& I0 }, V
s=0;0 F5 A$ [( r! M0 G
%****************** # `6 K) g/ Y/ v) _( R4 [
%初始条件函数- p: N: t& ?; i7 f; m
%******************
. l( `9 ] A L% P0 Rfunction u0=ex20_1ic(x)9 |) |4 `4 F/ T9 l
u0=sin(pi*x);
' o r( e" Z4 b Y%******************
! ?9 [! Y1 D1 {%边界条件函数0 Z6 G: o$ X6 a4 [
%******************% [1 v+ \9 u' K6 y$ g
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
9 d+ T; K: W& ?3 ?pl=ul;( q, m( E+ d; N$ Y0 X+ n
ql=0;
2 t0 ~, K9 {3 h5 x6 ppr=pi*exp(-t);( Q+ Y4 l# Q, w: ]' j/ O
qr=1;9 h% J$ x- a1 [
, H& g2 p g8 j( K
7 ]+ \9 z! d# L
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() ; g/ y, o, t5 Y9 g7 ]. v5 p
![]()
步骤 2:编写偏微分方程的系数向量函数
2 _0 s+ X5 `- \9 ~8 @function [c,f,s]=ex20_2pdefun(x,t,u,dudx)! d" ^" j* T6 ` l2 u
c=[1 1]';6 P) ?/ r0 ~4 j o. w0 i5 n
f=[0.024 0.170]'.*dudx;
6 ]3 ]/ q* U4 N+ B- ~y=u(1)-u(2);
9 |* u* ^8 G: M* hF=exp(5.73*y)-exp(-11.47*y);
5 T2 ]" y7 N5 }$ R v( Zs=[-F F]';) E2 r* k3 B! ]+ b& B! ^
5 L2 J/ [* p; L# Q
) W( E9 q; D) O* E
步骤 3:编写初始条件函数
' U4 F5 `5 ]2 J' j; A( S
{, O" t- R, v2 w! Y4 |8 ?! Z' |2 Efunction u0=ex20_2ic(x), K/ l: B6 {2 V
u0=[1 0]';5 N/ K1 O! ]; A0 V/ E- G$ ?& v+ k
6 ~0 j0 d$ H4 k9 N. z2 m# L' o步骤 4:编写边界条件函数7 R3 h% S$ J {1 N# j3 e, t8 V4 L; @
6 Q3 p+ y' G3 d [& Zfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)4 r* `2 e6 R% |) X
pl=[0 ul(2)]';9 g! ^- G' a9 z; m M1 [7 A
ql=[1 0]';
! N7 f' R- G7 J# u! L$ i; X+ Wpr=[ur(1)-1 0]';) O& v5 o# i7 y4 a7 v& b& ]- N
qr=[0 1]';
$ Y) j! s6 v( `2 X5 C- e
$ j# B6 S; \& t5 h5 _$ [步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,) }& J/ g- s+ A2 N& A$ Q7 X
4 l& b+ s( T# ]/ ]. Q0 v( O- x& U
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];
# ]7 j8 K' t# Y/ `. It=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; & k- z) ^5 {1 j4 W7 O/ R/ r$ A
d% u! V3 F2 m: J( z- ~
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:2 A1 x# F Y- a2 Q: B) r. |
0 h5 _/ } X: [0 X! |
function ex20_25 {4 c+ L+ h6 A8 N4 G% V
%*************************************** 2 O) k! c4 q/ e6 z2 m9 Q
%求解一维偏微分方程组的一个综合函数程序- k R/ b) Y0 Q: z+ ~
%***************************************2 s; L4 _; J- P7 V% }! V
m=0;
1 D8 \+ I# V! @0 j: qx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
, }& L( z4 s) l# @: \9 C; V+ vt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
% c+ K4 E/ Y. Q- I2 K%*************************************
6 l# x, y8 d) h: h%利用 pdepe 求解" t% B8 v8 O/ [ e; U
%************************************** I2 a! W( V; {" A0 U9 o
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);5 J" X6 f* J h/ i1 l
u1=sol(:,:,1); %第一个状态之数值解输出: U7 E# x9 c0 A3 Q; g
u2=sol(:,:,2); %第二个状态之数值解输出
; C9 w2 P' D( L/ m( {%*************************************
, V6 M; o4 O! r7 d- g%绘图输出" \& C' V7 r; i! {
%*************************************
3 }# y8 F9 N# I7 u- gfigure(1)' P/ `1 F3 e1 k
surf(x,t,u1)* j, Y% \; l. k9 o& c) P) A' v
title('u1 之数值解')
% r- D6 j% H R+ Pxlabel('x')
5 o. _1 L3 P2 }2 B1 p( _ylabel('t')$ N3 W3 d) U# N# E2 }- z2 w
%$ V) w8 W3 U/ d8 G" _3 g- S
figure(2)
, G7 H* V8 N# h w9 k/ Isurf(x,t,u2)
. J8 d' |% t0 q, [# etitle('u2 之数值解')
7 G$ V O r$ V* V2 axlabel('x')4 H; e5 a9 _! j5 n9 m) k
ylabel('t')
7 U% |- z6 R# h7 y4 f+ B2 Q/ j%***************************************
5 r; E B/ W1 \! ?, q%pde 函数
1 d* ~; G% n5 r2 o$ E7 U* F%***************************************1 s5 \7 P' j! l. Z8 ^
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
& w6 V+ @5 w: ?$ `6 O, c" {c=[1 1]';
+ N9 [/ c+ ?3 {# U1 s5 Nf=[0.024 0.170]'.*dudx;2 ]6 A/ T$ d9 [8 ?& j* i
y=u(1)-u(2);% K& h& y3 {) |1 y: ^# t
F=exp(5.73*y)-exp(-11.47*y);
8 Y! f, T% O$ O8 U( T' s4 z3 q$ Hs=[-F F]';
. S+ |/ _1 C+ n% u. t%****************************************
( R: m" `; o) i# _%初始条件函数3 Q$ R7 T9 t1 U" e7 a" O
%****************************************
$ j9 I( {. ]# x3 n3 l/ U- F8 Rfunction u0=ex20_2ic(x)
: p6 m4 c1 h' S; y, ?u0=[1 0]';
* Y* }9 u& A x0 y%****************************************
9 R# j7 W& ]: [# N1 O: G5 N$ U%边界条件函数. {1 Z0 h5 w) j4 p2 h" _* Z! D
%****************************************% H( a: a6 x4 u
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)- H* H5 M" K7 U1 n) ?
pl=[0 ul(2)]';* g" c6 @: x* ]
ql=[1 0]';
2 l( V' P! E( P8 ^. R% Q& @pr=[ur(1)-1 0]';
0 L. E4 z, k" r+ F/ Hqr=[0 1]';! N* }5 d+ s) e/ ]0 { @* ?
4 z3 V% F. \. d0 K
————————————————5 A1 E' C- v5 l) ^8 P
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
+ x5 Y& f$ @$ m% a原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
# k; L% V: q* k! @ `& D4 v9 S. X, i7 e5 k. |9 I& u4 F
! |* R+ n: ^: w9 Q |