数学建模社区-数学中国
标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法 [打印本页]
作者: 浅夏110 时间: 2020-6-10 10:25
标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法
3.1 工具箱命令介绍MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式


+ I2 w6 k( G7 z* b
其中 x 为两端点位置,即a 或b
用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
3 P$ s3 {8 M& W: Q# q$ g1 b& A. T
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
+ J) M" [4 W- F7 o! y5 A6 q/ D2 h' I- }

) @/ ^( t# E E6 d/ t( _* H" M6 @" T
. J8 [9 z* C5 v$ h* b# m# T" P# s1 i$ e5 q0 q, Z! `
注:* ?% f6 O$ P( J+ M3 @ A$ y
o- D+ J) l$ g$ ~0 r" O: I: S
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
2 j$ M; ~% B2 `; M2 c" f- W Q+ E- r- k" `: g; c3 J% T" E
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
9 c \0 I" E2 c# c! x' Y& j$ o; R/ _. [ o" ]2 q$ D" |' ]$ g
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。7 |+ r7 F( B( d4 T
. f1 E4 ~) A, M s' y4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
/ {. L9 ^7 |% W7 m5 g( l
# z6 G; F% P1 {, b- Y[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
+ h! n! L) V4 d, ^* Z; k7 L6 c4 h1 t! x: \7 Q
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。1 y. l2 |+ v" T) b5 a7 s
8 H, ~- Y. p( o" [8 r7 @, N

' m. Y: a* y/ L% w; ]8 q' a) E
0 ?- {, k) O A/ s: x* _7 ?" \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.
4 B) p( P1 m6 h$ H m
1 ~2 e X. x7 e4 s6 T以下将以数个例子,详细说明 pdepe 的用法。$ T2 I9 `2 Y( u8 Q5 y) e1 t
: Q$ a; H& C( z& S5 `" C; a! K
3.2 求解一维偏微分方程
! @& w1 }& ^' x3 ^: j h; v0 v" u/ f例 2 试解以下之偏微分方程式
7 J* z: k6 T! U' z; _
8 y7 r" C7 U! `. N: l8 o O: u% n. h; H
8 y4 H& d7 X8 G: r7 @. c! T$ C2 m# z9 C2 P7 s0 G
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
7 A j9 S! w/ K9 E D3 ]5 L4 t. m
\' b% U2 K# n7 o步骤 1 将欲求解的偏微分方程改写成如式的标准式。: Z5 [+ t& p% W; U
9 [ }, C2 S4 s% T3 d
1 y8 ~$ e6 a5 {5 a# d, y
3 Q% L5 N5 _ T; k步骤 2 编写偏微分方程的系数向量函数。
( {# a. V% p" L8 D: W& E& H: i
1 F/ [4 W: d& r# I4 e) E- N# e0 dfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx) ! V! u8 g, H; s* n7 H& q0 N
c=pi^2;# p" {/ v/ [& r; n; Y! _0 [
f=dudx;% g G2 |2 T( ]1 Z( `5 A
s=0;
8 G0 G X3 M+ K! I2 w% W/ O& ?: P/ X! T0 N' B+ d9 Z
^; K0 s* q- a8 V* h
- I% x% P( H" F* s* q. Y2 J步骤 3 编写起始值条件。
% A9 y o, k- |4 I7 h7 T, f3 z
7 x6 e- O% H* `6 G- Xfunction u0=ex20_1ic(x)
/ Y* F7 ]# l) i5 v$ p1 Ju0=sin(pi*x);
& K: `' B( L u3 n4 f步骤 4 编写边界条件。
在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成

因而,边界条件函数可编写成
* G* J! S. o. M/ Ufunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)5 j2 g. y! y1 N* u8 k& T; P
pl=ul;; v. s9 s+ E, G4 i6 y' G+ P
ql=0;$ L! c& c7 B7 Q- p* I* X! M
pr=pi*exp(-t);' J3 y3 y+ P; k& U7 b; l
qr=1;
, q* w) R/ _& @& m/ ~* `) [% k& E; ~8 h4 _, G
0 ?( e* _3 P- ^4 ?' Y
步骤 5 取点。例如
; V# s4 J6 Y5 V% h( b) w$ W3 ~7 A' D- c! b3 g3 Q
- b1 M$ }- F5 yx=linspace(0,1,20); %x 取 20 点
% Q9 m3 q/ d/ W8 I1 Xt=linspace(0,2,5); %时间取 5 点输出2 s5 L5 s4 \% i3 ~7 B0 O a* U
$ ?( Y" W( C/ Y1 z
, n7 Y- q1 y3 q步骤 6 利用 pdepe 求解。
8 Y" N% P$ B: _9 `# c, w+ w/ H; m3 [) B$ U8 B
m=0; %依步骤 1 之结果7 |+ b, j! f7 O& R5 m+ A8 i. B$ p
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
1 n- O! h) m* U5 V( W' K: m. o( Y4 s) p
: W- G+ C7 i( u5 W步骤 7 显示结果。. A' G9 H: Q n" j+ r
0 ~ \* W+ |. s2 D4 s3 n' j# ]2 d
u=sol(:,:,1);/ `3 s$ m8 Q) t# H6 F' t0 ?( I
surf(x,t,u)
- _7 z2 Y* m( a" m0 n" O* otitle('pde 数值解')
+ Q j: C$ ]4 S, ixlabel('位置')
+ B n4 p. B9 D! U! W/ iylabel('时间' ); [, S$ Y$ n; T* ^8 _7 b# y* x
zlabel('u')5 U) y! d/ Y% J! E& {) Y+ R
- C; w5 X4 G4 I3 i若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
; _: |; o: e5 I. f2 S7 q. O: |5 p+ s4 _9 u# R% x
figure(2); %绘成图 22 V; r$ ]- A9 Z+ G6 \2 k1 R
M=length(t); %取终点时间的下标% }& @- W! H2 ?8 ~! ?# U
xout=linspace(0,1,100); %输出点位置& ]6 r1 D C. j: e: \: Z! y
[uout,dudx]=pdeval(m,x,u(M,
,xout);
' O2 s) J( P: S8 l5 xplot(xout,uout); %绘图: [8 c' {4 q6 y+ }
title('时间为 2 时,各位置下的解')
' L$ g' @' ?* r+ Y! nxlabel('x') D* L/ c6 {% O! C4 S5 k- \: ^+ ^
ylabel('u')
% y! D/ t; J/ {0 k. T! ?1 j; d, H1 j. F
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下- `& x0 ]: r8 w8 \5 S
* f( H8 U2 J( j! K) Afunction ex20_13 _2 r: C8 A9 Y; F P$ w P
%************************************
, T6 ?. J3 }# e) a1 z%求解一维热传导偏微分方程的一个综合函数程序5 `" i: I5 w" X- L+ u$ u
%************************************
- s( L( H! S5 ]+ ]) ?4 h) ?m=0;
' O: J# p1 r/ nx=linspace(0,1,20); %xmesh; H+ f( F5 S& B( O+ x$ Q% ?9 f1 \1 U) y
t=linspace(0,2,20); %tspan# |$ u$ ~) i& p, Y1 j
%************
b" m' f; Y+ P3 X%以 pde 求解: |$ `: Q0 s" E' i2 b, B
%************/ B2 e* T- s: w5 X2 o) p. n# r
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);3 `# ^+ @% H9 u/ d2 t) T
u=sol(:,:,1); %取出答案
1 ?. ]- h+ x5 N& h+ R%************7 h6 H9 _6 b/ C$ i- H5 X
%绘图输出
; j( v- o- L4 [7 B( H/ q%************+ g n. r& L+ W' m0 z7 p
figure(1)
9 A, c9 ]. `: z& `surf(x,t,u)
6 e3 k9 H: {8 [- s0 M; Z4 Y2 B' Xtitle('pde 数值解')
$ U6 V0 D+ P/ @xlabel('位置 x')5 ~9 ]2 S% q* H4 |9 R2 V9 s
ylabel('时间 t' )# d6 `9 `# v, _; |
zlabel('数值解 u')# _ N! A% o. v& k( x
%*************
* S) H8 q. R1 N3 k: s% k" g" s/ p' a%与解析解做比较
7 q5 e" g- \ E0 P" M# z%*************7 V$ F2 |2 O& D7 J0 U6 J: v
figure(2)4 z/ q7 ]3 p( g) h% k# N: u) U
surf(x,t,exp(-t)'*sin(pi*x));5 { Q v1 N& T: T. B. i
title('解析解')
/ |+ I1 S( {& [& Fxlabel('位置 x')- ^0 }4 u% A; m8 I3 Q1 u' M- }7 A
ylabel('时间 t' )) P P0 B& N9 ^% T6 U
zlabel('数值解 u')
3 N* T, }- `/ q* ~7 b& u* _" h%*****************2 d+ h n" H$ Y/ i/ D8 u
%t=tf=2 时各位置之解
! p( h4 e2 l s+ M+ \6 n%*****************" m1 m2 e: y& j& b3 e
figure(3)3 T6 l5 x. [1 h' r% p
M=length(t); %取终点时间的下表& P# h3 J& o: Q% l
xout=linspace(0,1,100); %输出点位置/ t. a6 w# @6 n4 c" m3 u6 F& a
[uout,dudx]=pdeval(m,x,u(M,
,xout);3 h( P: V8 ?# W" O( n; {0 ]2 n9 L
plot(xout,uout); %绘图0 W4 w9 t t; x) A. V: x
title('时间为 2 时,各位置下的解')
: t0 s5 u; l5 c& B& Q mxlabel('x')
: j1 W* l* ] F5 ?# Xylabel('u')9 \4 H) ^( h' I' B3 f+ k' k) V
%******************% }+ W' S; ?2 A7 S' @" P7 G \' I3 [6 i
%pde 函数
, T+ R9 c) v6 u5 v0 y7 q%******************
9 Q/ M, o+ _0 ]+ c. I: \function [c,f,s]=ex20_1pdefun(x,t,u,dudx): Y4 Z3 [8 p" D+ K4 A5 s
c=pi^2;
5 t0 x8 X8 i, o \) Kf=dudx;
4 D1 K* e5 I* Z7 X: A V0 Zs=0;
* t$ R. {# W0 z% g+ S7 B%****************** . V5 j d( n4 L+ g
%初始条件函数
& t3 K( f. w# W; f%******************; H4 e0 y' w" a+ ]
function u0=ex20_1ic(x)/ G+ }8 E+ B4 h$ ?
u0=sin(pi*x);7 E3 l! |) h" @& P
%******************
s J( k: Q- R1 X: |: P: F0 u%边界条件函数3 }. K( g9 c& K+ a: e6 q( m
%******************' e% ~) z8 z. [7 Y
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
H7 c- y3 }2 T% ~4 Upl=ul;
! G7 c. t( j1 {4 j5 z5 L4 N* Vql=0;
& k) _- x) z4 B+ vpr=pi*exp(-t);
" a5 S0 x+ q$ a9 k8 F" {qr=1;
! a7 \( Y$ |+ P$ A3 V1 t" [* P: P# P9 Z* o7 H% U
0 G- K4 Z7 v& I& {5 Q
例 3 试解以下联立的偏微分方程系统
解 步骤 1:改写偏微分方程为标准式

. a2 o( m- Q* c1 S* E

步骤 2:编写偏微分方程的系数向量函数
" ]. E- S) a7 ~' c; Q; gfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)
$ T+ P1 t/ V" B3 r7 p: u! x$ Qc=[1 1]';8 M O+ K1 c1 P
f=[0.024 0.170]'.*dudx;
* A1 N' r2 W5 _6 Ny=u(1)-u(2);
3 G6 p. H# V, x0 F' r8 l; E0 KF=exp(5.73*y)-exp(-11.47*y);
) [% E( ^1 c) q) V8 r0 cs=[-F F]';
5 \' ?, ^! k7 J1 A& c/ R: P- }0 g: `) F; L3 W! }
0 c" w, ~2 ~) d- J+ g0 M1 w7 r9 |步骤 3:编写初始条件函数* p# K- H# h& U k) u
3 u- r1 _7 U$ R
function u0=ex20_2ic(x)
- v: N4 H3 h% [# {u0=[1 0]';
3 z7 D' y0 A! g& S3 U8 G! V' y, C% }) ^& l1 @5 s6 [& z
步骤 4:编写边界条件函数3 o0 n9 v* v, p. r3 z# X
2 ?8 R0 {3 m8 d
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)0 z( h7 r7 s# X! @
pl=[0 ul(2)]';
7 M- g! `. M& f6 {( P" |. Mql=[1 0]';
6 p0 p/ ]( m& z/ K. Jpr=[ur(1)-1 0]';
- |2 C8 i( [5 Nqr=[0 1]';
1 i% \0 @3 \7 x" G ^) p7 @+ m9 `+ V1 S0 u/ l
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
6 P2 m9 {4 W9 z% j9 A/ Y& X2 o$ p
) n2 @' O+ ^% X" v8 Tx=[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) t" j" f3 H! R/ qt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
1 a$ a% P# l( W, @1 c; f. s$ b- S7 B
' ]/ N- k# q6 o3 k4 ?+ i以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
, N& e$ `, h9 Q6 v1 ~
$ \& K$ T( }, ?' u0 Xfunction ex20_2! l$ ~- I7 G) P# O2 i
%*************************************** ) [$ i6 L* N) G r! N9 ]
%求解一维偏微分方程组的一个综合函数程序+ T! E" { `) b3 J# ^$ R4 Y2 F8 F
%**************************************** u* ?' F4 K9 o8 ^
m=0;
# y) I, A$ K. ^) X# \- cx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
! ?$ }/ ^( ]' i9 C) ~3 bt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];4 z" q1 m% w6 _- Q8 B% ?6 K y
%*************************************, C: J) w5 z* T+ ~+ d% A
%利用 pdepe 求解0 w [& ?3 ^6 M; @
%*************************************
9 w1 }! o6 J4 `4 D, g5 jsol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);; Q" [3 ^7 g6 e: x" W5 ~+ y: }
u1=sol(:,:,1); %第一个状态之数值解输出
6 S& C% U+ Y7 c gu2=sol(:,:,2); %第二个状态之数值解输出
& q5 ^' p/ L' P* j%*************************************
6 Q" `7 Z* F5 L) I( @, l) M%绘图输出# t3 t0 a5 { s5 K" V
%*************************************
/ `* z* |8 Q# O. ?( Efigure(1)
" c2 b8 e, ^, |- T W- nsurf(x,t,u1)7 d$ t& w1 {! A1 z
title('u1 之数值解')
# f) f9 \# k3 I- c! l5 `+ kxlabel('x')4 W/ X6 O/ Q, ]/ D" C) Q3 ^6 F
ylabel('t')
5 C; d, x$ N% V5 Q* A' C%+ Y& ]; Z( R8 C, B. J
figure(2)$ H9 e6 t3 l: u2 Q' N! ^0 _
surf(x,t,u2)* Y% L# I: \/ H; T+ j0 |$ {
title('u2 之数值解')
. V5 G; v& p2 F' U: i* ~, Kxlabel('x') u7 k. B6 _; x/ D3 k5 k0 j8 J# X E
ylabel('t')) p, L# H" L7 N2 F0 W x
%***************************************7 M1 z0 ?$ S" n/ N% u4 p2 Z: I6 c
%pde 函数
$ p8 F; y3 } C1 A+ M+ H%***************************************! i, ?0 a% T/ S/ e( w
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
0 L) |3 w/ p9 f4 uc=[1 1]';. }5 X3 u1 x; Q) {
f=[0.024 0.170]'.*dudx;
3 v; a7 f; c7 t# d4 ly=u(1)-u(2);
. s9 o( M( c7 R8 zF=exp(5.73*y)-exp(-11.47*y);
8 z0 R* `0 ]2 qs=[-F F]';' ^, G( y- t: _9 i' L' e# O
%****************************************
' g( E& ^$ N3 e. ?! f( s0 x%初始条件函数
1 h$ k% H+ i6 {2 p7 ^* V6 q1 u' f- S%****************************************
* ?& `+ f% I( w% E3 s- C7 jfunction u0=ex20_2ic(x), V0 F; O& K9 l6 C) e3 L
u0=[1 0]';
- ]1 D i2 k7 y" M/ f0 w%****************************************
8 N0 J4 U8 h8 A7 I%边界条件函数5 K9 e2 x* |: r/ S
%****************************************# p6 z; B- M9 g8 V* D! U: A
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)( i7 x7 R; W) a5 D# G) y
pl=[0 ul(2)]';% ?. R/ F0 l |! X" z: w; R
ql=[1 0]';# l; o4 O: P5 W
pr=[ur(1)-1 0]';9 g; N0 T: }; O7 s3 \5 e
qr=[0 1]';
; W# Q% X+ v1 m7 u, F2 F0 U- B7 Z2 I0 O! ~
————————————————+ `6 L( W6 @5 x* Y5 F* D& q" i
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( w( D$ ~ e0 B' Z) t' W3 |
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692. }) C L! u; q/ t8 C
, K" B5 S9 f0 `6 g" |" o% t6 f
8 f& Q U& ?5 Q; T( M
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |