|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
6 j% ?, v4 ~6 f其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下: . y- t" Q0 M6 k. D0 ]
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options), o1 ` Q" G/ ~8 ?3 e$ L
7 d" t9 k- B3 P' q9 Z2 E X ) p3 G$ h$ I' c: j0 M: Y8 _* m/ e# ?) `
O7 g% H' G0 y" A- [6 b; Q! p; \ X7 _3 d9 K
注:
3 J6 n; s+ @3 A+ u) q* p/ r( V3 E4 {8 l
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
0 U$ ]. d' o; X: J: L, z- R
- d, u8 q, ~2 v' D s6 K+ o2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。( k; C; s6 \* _3 @% O
& C$ o/ e' j7 O4 s% w
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
9 b& G# A9 W0 `/ A) L/ H4 ? A1 W: s) I j2 ~. @
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
6 r% [, o1 {" x
6 z3 F; E& A* W+ m" i[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)+ V$ T8 g# j8 V7 K3 {3 |
S* t* C0 Z: K6 ^% }: t
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。# X" Q( |9 f8 G. r
0 w5 k0 u \& ] A; @3 e0 d. ?![]()
6 H5 F6 s* M$ F! m8 ]5 N, `! \* ?/ o% _/ D% U u# M
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.! B8 o% V2 O8 I* P& f
3 P9 L4 i+ M/ m/ ]" S5 n
以下将以数个例子,详细说明 pdepe 的用法。' d, |; e& M& k# U" ?
: d4 u+ V. p% ~* N; d
3.2 求解一维偏微分方程
$ p" r. d; B1 s5 i' m例 2 试解以下之偏微分方程式
' C/ a+ Q- F; M8 W8 R- N& W
3 r$ c$ \; R0 v4 i![]()
. I0 T8 P( ?: f4 d) y7 G2 P% u2 l# K* h. ^& {. e( I) T2 }( d
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
: y$ `' h5 |) S8 g B0 d* s- A/ u, G; M0 Z! x) m
步骤 1 将欲求解的偏微分方程改写成如式的标准式。1 D4 {; b+ w% L, n7 I) f1 `7 Y. u
3 p8 l# z, o& b) ]/ S& S5 ?6 U$ ~ @8 W# u6 w! q. o4 _
k- g7 I1 \( M9 H! I步骤 2 编写偏微分方程的系数向量函数。0 g' ^6 U6 m% u7 {' q
% p! [3 y% W, P& t/ Tfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)
2 I/ X0 {+ v: V1 b4 o8 u4 fc=pi^2;9 e6 ^& f/ M; y8 d, V
f=dudx;! G, x( V7 M! o" A0 V
s=0;. N2 b' _) p# ~
) k* @( @; `0 d, F/ O0 X. g, Q! n! k* v) [8 N
$ y3 p# f* J* T$ _步骤 3 编写起始值条件。0 J1 e5 ?3 E5 O( J0 W
0 v+ _8 Q( Z G
function u0=ex20_1ic(x)
! |4 a9 N5 `( Q1 pu0=sin(pi*x);& K8 K' f3 n( x4 ?0 ?7 B6 X
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 3 q; q% o0 d+ y/ o* N2 a. ~" k& n7 E
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)0 R: [1 D2 }5 [2 c k. L/ s
pl=ul;
5 m! g# O, C" a/ j' L2 Aql=0;
6 P J1 A" W O" i( Fpr=pi*exp(-t);7 W- e2 U* \5 o" _: i: p1 t% W
qr=1; 6 q x3 y% `. b7 x0 {
& K- x1 y- r. z* P- A2 u1 \
! Z* ?% K) f. w- f$ p$ l/ M. y: ]
步骤 5 取点。例如" Q% Z; { z7 H8 G/ D) ~% u6 _% `
o; T: z7 @% p
& E: s8 } S) e! i* J( J qx=linspace(0,1,20); %x 取 20 点$ I1 s( T" D) l" I3 k- c
t=linspace(0,2,5); %时间取 5 点输出3 n0 S# ? m4 j- i0 d- l5 i
; y! [, b+ f# c8 s& @3 R9 q
0 ~ e' \) _" [ M" w5 N
步骤 6 利用 pdepe 求解。
+ L s. W- ?6 F) {* b# T) v$ G3 _$ J- r2 m$ M$ F+ h
m=0; %依步骤 1 之结果
$ D4 F, i2 @8 f" ~" ~: D0 R" @sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
& l' U) ^/ M: j7 R) R
: f: R, e9 t; ], a' c% {" Q5 g& ]; Y2 l( x2 \, W9 k4 x0 g
步骤 7 显示结果。
3 r9 x* k; ]8 T1 {2 Y; U7 W. [) T
% S' @- m7 M6 L; P0 X5 ]u=sol(:,:,1);
F: J* F' c' y. q; ysurf(x,t,u)7 u$ c/ P4 k2 B' K, I3 }* t, ]
title('pde 数值解')
' [& y" Y/ d" {* t9 nxlabel('位置')8 g/ G. I0 V' k# B' K# j# o( S
ylabel('时间' )
. g" U) Y$ f, [( p2 h, ]. @6 f8 Zzlabel('u')
% G4 B5 Y7 c5 `( |2 K( I, ~& U0 Y1 N0 [0 l
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):) c; a: G+ n- i0 y1 ]) n
0 @# C2 ?; w& R4 z1 H! Wfigure(2); %绘成图 2
1 d; y7 y$ G/ \- }) E! uM=length(t); %取终点时间的下标4 ]+ d8 ?0 N% c2 N5 B
xout=linspace(0,1,100); %输出点位置8 i1 G N; W0 U6 ^
[uout,dudx]=pdeval(m,x,u(M, ,xout);6 ?' ]+ {7 l3 v( }# f; K
plot(xout,uout); %绘图
7 V$ Q6 m# E0 b4 ~% \title('时间为 2 时,各位置下的解')8 s6 a4 x3 ^" |9 Q# ?0 R6 f
xlabel('x')9 [( w3 @6 X+ a \
ylabel('u') r/ j; u; a* m% Q9 N
# _6 _# n0 H' W# ], E综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
- u( ~) n0 E% t
7 [6 N4 X& u V# C) V# ~5 n/ n$ i9 Rfunction ex20_1
3 `( U! U$ ?1 k. U4 _, b%************************************
# ?+ D6 x y) F, \%求解一维热传导偏微分方程的一个综合函数程序- U5 }6 d+ m2 A: J7 w H. N& n0 v
%************************************
6 D9 S& h) G ^1 O7 e# x& X0 dm=0;
' o/ z) @" f- ^( M5 |; jx=linspace(0,1,20); %xmesh
( H1 u. j. M# Y9 m, bt=linspace(0,2,20); %tspan! H7 }# c/ ?) ~4 a- N$ G/ t
%************; U$ X; W6 D- d# w6 {5 _( E0 m
%以 pde 求解# k* n$ y9 c# O9 S T
%************# e. K4 C+ k( l1 d
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);8 J/ G- P2 x5 C9 ], o4 A2 O0 @
u=sol(:,:,1); %取出答案
% ^' Z t; `5 g0 t* u- n%************
& Y8 z7 X3 U# h5 \8 E3 g2 `+ z, q% h%绘图输出0 b3 y! ~2 B* @
%************
* y/ d5 k4 S5 C ^7 Rfigure(1)
" V# ]7 g( M9 L/ Esurf(x,t,u)- c4 Q! P S2 m# |1 M! x
title('pde 数值解')3 D/ I+ L1 I, ~, J/ Y" a0 S
xlabel('位置 x')" V- \7 D3 V+ h3 Q2 K
ylabel('时间 t' )9 h. i9 x3 h2 k5 D
zlabel('数值解 u')
: _, }2 p h3 Y4 @' `%*************
L4 A0 B! w5 V. ^4 C6 D%与解析解做比较
" G) G+ M7 M2 s' t& N0 @%*************
8 m' J; B0 M' kfigure(2)
0 G: w% | Q e& _; Usurf(x,t,exp(-t)'*sin(pi*x));( @: V) m, n3 E, |
title('解析解'). I2 ?$ _0 ~* _ y8 K5 G3 B
xlabel('位置 x')7 j$ Y5 _1 w; Q" E0 Y
ylabel('时间 t' )% _+ J) q+ q/ P% w$ v2 I* A
zlabel('数值解 u')
% o C* n" k* H" p0 G%*****************
3 ^: U( V* p. }- b* \! E" p* ~7 {; N%t=tf=2 时各位置之解/ T5 @/ p6 M/ G8 W5 Q
%*****************8 l$ z! }( n# ?! t6 D1 m+ {
figure(3)
" U. W0 h8 ~+ P3 E. KM=length(t); %取终点时间的下表2 r0 X7 y) b& v
xout=linspace(0,1,100); %输出点位置
' U2 v* K% m: Q- J1 O9 b, L[uout,dudx]=pdeval(m,x,u(M, ,xout);
; o; y. W2 v8 J6 [: Y1 H# zplot(xout,uout); %绘图
. N0 e' l: o' }8 Q3 @6 P Btitle('时间为 2 时,各位置下的解')) o8 Q) N6 a* M/ ~" l) s4 l
xlabel('x')# W! R" }( I# v) t6 U* s2 i
ylabel('u')
9 H" i( s6 s& _0 W( S* d0 W( i%******************
" U7 h& M" e" E8 @: y%pde 函数7 Q, t9 B1 c- A# v
%******************
$ `5 {: a. l2 R# e cfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)& q/ K' u/ T' \: y' c
c=pi^2;9 M5 p2 ]6 P8 E5 P% Q
f=dudx;* e, D6 f9 S6 |- |2 j
s=0;, U+ T) R* g2 e" M
%******************
( K6 V' d$ v9 Z%初始条件函数
2 G8 ]& A. w& k; I3 E5 x%******************! h, m: J' o7 j. H5 X* Z
function u0=ex20_1ic(x)
) R: B' r# P/ a! J1 Cu0=sin(pi*x);
7 k p- {2 a. {. ~* S0 ?( ]( g%******************
* T3 f( M9 n* N%边界条件函数
0 O+ [; Z& N9 y G5 m%******************$ z3 W" B8 Y7 I' U& V5 ^
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
$ a1 r' p$ S! ~7 M$ Y" Opl=ul;
) t7 c% s# s$ n3 |% jql=0;: X, m X' W/ |4 x; C
pr=pi*exp(-t);
4 b" c# p* T' Q! [qr=1;3 E( ^. |6 E5 R. z5 a
3 L/ S5 O% M5 z$ H: U' Z( t
! W! {/ s2 ^, j* g! L, E4 L例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
9 a. R# ?, B! X0 r Y![]()
步骤 2:编写偏微分方程的系数向量函数 ^# e6 Z8 J, _6 H( m2 r" ^
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
3 F! \, u ]( i. i/ ic=[1 1]';/ k5 ?, a% Q% I) h; T: y. p( f3 d
f=[0.024 0.170]'.*dudx;
' K- H7 L) d, N# W: H Xy=u(1)-u(2);1 w: q; F9 j" a- U5 V, U
F=exp(5.73*y)-exp(-11.47*y);
* P7 v9 z, Z* Qs=[-F F]';; ?- T7 I& `$ d
& d+ v* b) P! R+ n) ?" w: }$ C/ E& Y* `
步骤 3:编写初始条件函数
( `0 v6 _% {: x, m
3 v; d2 C% V! q, e" B. I1 Y3 wfunction u0=ex20_2ic(x)
u( w9 v" J9 ]5 Q7 Q& M" ju0=[1 0]';
0 j( w# ^! ]0 U3 N- m+ N
' p+ S) N# \* f' J0 S2 B+ v5 b, ], d步骤 4:编写边界条件函数* _& V8 `! J6 }0 t- N6 I$ }
3 ^( E9 c. C R
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)# g4 l+ v+ s; Y) Q: r: u* u u% D& v% [
pl=[0 ul(2)]';
# e4 P; a9 C6 p a+ p4 Cql=[1 0]';
; S: t0 _+ [. S3 q0 G5 u. Upr=[ur(1)-1 0]';
$ @ s, H0 k) ~0 u1 uqr=[0 1]';
' Y: Z4 \; U6 M. y' X" `" V5 G. y4 Y& S# B
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,1 u" H) M' _: @6 G# c1 l
, l$ `' k3 v; e% k7 B& J
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];
( D. H: u5 p& v5 S+ wt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; $ ]: w9 r' ^) J. |& C
4 v# n$ ]0 T% M7 W1 }# _% \
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:1 p( x& u& \8 f8 e7 F- H0 e
- L+ r: _% V5 afunction ex20_27 g6 _6 K! D, C* f0 v j
%***************************************
) U1 b+ I& ?; w4 o# u%求解一维偏微分方程组的一个综合函数程序" r" `. i' K0 v
%***************************************% U/ ~0 [: q) \+ D! I' F' m
m=0;* A8 V8 m' ^. m( ? s* }
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];9 _! k; ]* w4 L. w
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];! O- H( F g% k' O; I6 f0 H
%*************************************
/ e2 N6 z7 ?5 R0 p$ l* G%利用 pdepe 求解 _2 H* i/ b# ~9 f1 x3 k- A
%*************************************
' U( A' d/ U& a2 a# ]# C+ xsol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);/ ?; O: @* Z) v% M( I+ F
u1=sol(:,:,1); %第一个状态之数值解输出
6 V4 m7 Q2 A# k- K+ xu2=sol(:,:,2); %第二个状态之数值解输出9 E2 ^! ~- B6 Q0 k$ I
%*************************************7 { P0 b# g8 P
%绘图输出! `9 r) g& y, r5 x; ^
%*************************************
+ J \! y `$ \figure(1)
" Y# U7 V. R3 I; B; ] nsurf(x,t,u1)
2 p- @9 x: i9 y9 {+ x( ptitle('u1 之数值解')
, l# T5 l3 N6 y9 \; ~xlabel('x')5 w1 e4 W4 I* S+ q% s
ylabel('t')
( U7 v! t" x/ ]9 A) k%6 Y- r m# U8 a
figure(2)
/ ~8 x; ~+ {7 C1 s4 h$ B3 ?; g" msurf(x,t,u2)
6 z5 h' s, A7 R! stitle('u2 之数值解')$ Q" s! z. \7 v9 k+ w+ C
xlabel('x')2 y' g5 O& i5 ]" D1 j
ylabel('t'), r. f& H. Z' _; f _
%***************************************
7 c# w/ @' }' j2 _/ E( P%pde 函数- b2 H, f9 s; A: a @; a0 ~2 n
%***************************************# o+ l3 ?; g' @% i. d1 N) k
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)( c$ E9 P! M' C1 R
c=[1 1]';2 Z3 ^) w/ s( v" a! y" j4 {& p
f=[0.024 0.170]'.*dudx;, [/ p3 V6 ?$ C) X- w
y=u(1)-u(2);
$ [& o ?. ^# Q0 u+ n6 ^F=exp(5.73*y)-exp(-11.47*y);8 e8 e8 E, R) _6 K% Z
s=[-F F]';
6 h/ c* g- l/ f+ t! Z* ]%****************************************8 b1 W, X8 E5 t
%初始条件函数
3 X, b$ I* x: E Q%****************************************
, c3 t+ b$ b* g6 b8 kfunction u0=ex20_2ic(x)
' O( f7 M; G C/ O- Z' |$ q$ }u0=[1 0]';: s- \3 P& _ k: {0 T! ^
%****************************************
8 ?0 A9 E$ g8 q8 a# b%边界条件函数7 W9 ]3 D2 V% j+ o1 l( ^
%****************************************" Y+ {3 }0 X% q$ W, i
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
. W9 |( _2 o& m4 N' ^/ @3 dpl=[0 ul(2)]';
3 T2 f5 w2 h6 ~: H, u5 f6 b' Lql=[1 0]';) ?6 B$ k; q. h! W
pr=[ur(1)-1 0]';* H; s, C5 ?' k3 c# P
qr=[0 1]';
+ q, ^- f# ]) k9 t2 Q9 P
) V( F \4 S: c, i————————————————
2 P) d+ s6 u' z: K' x f) q版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 n6 z% V4 g; R' g# e8 V9 k0 R
原文链接:https://blog.csdn.net/qq_29831163/article/details/897066925 D3 e! N, o: M8 U3 _: U
! C7 }, k2 j1 f6 ?8 N
* c. [; W. m) x6 T
|