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


, C; O( P; s/ I4 f
其中 x 为两端点位置,即a 或b
用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
9 [7 O' t1 G' t- X4 m' ^
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
9 P# a+ ~' z: ?5 Z6 }2 e' z7 b p& u& ~

- V; A9 h, a; P# ?1 W, J& d* d, l2 Q8 n+ u8 p2 Q5 K' w
* S8 ]7 f. u2 [3 u" {0 b9 n8 S) g注:) ~, m* r0 Q. D. J1 w) f
% A% `% j& U% b" {; O) v: b1 j* o) K1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。( T! x9 T# X) Z
, O& c% K/ {, g# {' S8 T, t2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。+ a( C: P4 |$ n9 n
* H+ h! o: L5 a* h% i, c9 V. T' ]3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。$ Z: d1 K) B; P
8 r+ y/ E( \; R4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:" D. H$ E' {# w% Q6 p: y' v9 i
7 Y3 a- z! b3 }" s7 U
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)- R F _! @6 o1 I$ X. P$ J6 o
9 u& x4 `9 F; \# J其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。, B! l2 u; \0 s# V2 v
) P$ _1 Q! Z$ P
* v" ]4 J0 e3 _$ s! g2 F( S! B
, p. x3 W$ R0 ^
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.
& y/ F5 v4 w4 z8 ~. A
$ H# F! m( C4 d; O以下将以数个例子,详细说明 pdepe 的用法。- y2 e8 _/ T9 O& L
6 ~ e: b1 r" H+ i* L+ p3.2 求解一维偏微分方程- X3 J& _% S. Z+ Y/ N" ]) z; O
例 2 试解以下之偏微分方程式8 }& G5 f3 L" W! o; c: e
; G0 F. D6 D! c. ?
, @- f" D0 P- U* g! b
0 G) c2 }4 e) y8 C
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。" k: M$ p% P* Z4 ]+ l
6 k8 v" j; Y9 V% K9 F% i1 M! l; a步骤 1 将欲求解的偏微分方程改写成如式的标准式。8 W- t, \* a$ B! @6 [
, P3 T' C2 k& Q6 E7 w9 z/ n/ ~
# G2 H+ S/ h* Q* a, {, o' i: f' ^8 p" K8 D2 H3 _
步骤 2 编写偏微分方程的系数向量函数。/ A+ b; F9 K: Q, t
6 G/ ~1 x- y4 K1 z8 P
function [c,f,s]=ex20_1pdefun(x,t,u,dudx) : D- O- u$ |7 \# N7 b! e
c=pi^2;
3 g, @8 D5 Z$ A# ?f=dudx;; `" _ b# D1 ^6 @
s=0;
) Z: t; X" {: Z2 H: s: ~
+ a. `* B: E' x" e- z G4 ]! {
% j, T/ M) d5 y$ ~5 f
, D0 A, x; y. c4 D; b& Q$ Y步骤 3 编写起始值条件。5 p1 K5 ?8 s: z o, r- h
y7 P* K6 n k, P2 }1 U! Sfunction u0=ex20_1ic(x)4 z" s% x5 u& s6 x; A) s; |2 R
u0=sin(pi*x);- Y. b7 w% n% K; x `
步骤 4 编写边界条件。
在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成

因而,边界条件函数可编写成
" ?6 l3 F F6 {4 F+ u
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
8 d2 h3 T% r0 R( |1 `- v+ Mpl=ul;4 y5 K5 R# }/ ~# v3 J
ql=0;
" T# d9 N' P; i6 l3 Jpr=pi*exp(-t);
7 ^4 S" e) |! q4 F Aqr=1; : R) {. o1 C" X8 g9 Z- M2 ]& \
4 N$ X) g# b- y! V0 S; M3 H6 _) L z: b+ m5 G' B; w; o4 T* U
步骤 5 取点。例如+ P+ }, Q8 m7 p) c0 F- t" `/ I; c1 P7 T
! h. b4 Z$ |1 G: G
4 L* u" l( h7 ]# O6 [
x=linspace(0,1,20); %x 取 20 点
' \# f# D3 b: D: Z% N9 \$ zt=linspace(0,2,5); %时间取 5 点输出! W X9 x9 G7 P0 ?) N( _
) S1 w( L! [5 i. @8 P: V5 x: J% q7 C+ z
步骤 6 利用 pdepe 求解。
' a2 a3 b9 _' n3 x) m9 l7 V' Q* L+ b- v* z+ u1 q7 k- B F# o
m=0; %依步骤 1 之结果. j. [' G! y- g# \" a( h& n, f
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
, r/ p# z& a, l. Y4 R% W: s9 |% {) ]( v, O( _8 @: q+ [' Q
6 k* K' Q/ Z( C' W" ~& V步骤 7 显示结果。
/ }) s0 y) M" p+ x$ X$ E' `8 l3 Z+ T, v( C
u=sol(:,:,1);
3 i4 H; h$ H4 o* F: I t. N' l2 {surf(x,t,u)
4 z9 K: D' Q" [/ _" l0 O, C6 Ctitle('pde 数值解')1 d' i6 z8 b0 h$ V
xlabel('位置')7 z$ r" V; s) _% k" A! @
ylabel('时间' )
& u; \ I7 n/ V* Z9 Uzlabel('u')! x5 a* Z4 q% h, s1 |( Y
; e9 e" H. s; a7 Z. ~9 ]: \
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):3 n) x4 y& j" R% q+ e
' |5 T# J- i S- L
figure(2); %绘成图 2
, q- S9 x3 F4 A- ZM=length(t); %取终点时间的下标
' m# [! q* q, D1 E, B# [. j, s' `xout=linspace(0,1,100); %输出点位置
" Q$ x1 l4 a; k+ }[uout,dudx]=pdeval(m,x,u(M,
,xout);
) |$ X- X8 h i8 W- a6 J Eplot(xout,uout); %绘图+ G$ u$ U* J4 g2 M; q9 q! E' m
title('时间为 2 时,各位置下的解')
" |) _ l( z- r' e; a: Oxlabel('x')
8 y1 A C, j: F7 e2 f1 @% z. Hylabel('u')
& z _ W3 ^ e; t6 g9 ~: _
5 P) O( W6 Z' M4 [综合以上各步骤,可写成一个程序求解例 2。其参考程序如下# r" q9 V9 t6 z# Z
# G/ s2 s2 p1 E1 f
function ex20_1
& x4 z' t8 r# o1 o1 y! Z/ s5 ]8 V%************************************% {' I' v4 U3 z+ N) m5 B! }7 {) D* V
%求解一维热传导偏微分方程的一个综合函数程序5 r" Z% T; e. l& p* _" Y
%************************************3 i ?3 ?7 S) F0 ~9 [
m=0;: M4 ^3 M- \# f
x=linspace(0,1,20); %xmesh( U; L" v5 s* y" @5 q
t=linspace(0,2,20); %tspan. B# d0 i, K2 h+ n+ \! j0 Y9 b
%************( T) }# g% p& t- o
%以 pde 求解
b7 \: r- n1 z%************
1 ?; b( ^7 N8 @6 d+ T, Ksol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);, `$ B1 G$ H0 n
u=sol(:,:,1); %取出答案' q, q$ Y9 j n, q8 ?9 [' N1 _
%************0 O) _& P! \( j; M/ C
%绘图输出" F6 t5 P# L o) F+ F4 G
%************/ W) q4 w4 A- D' d( Z5 v& K
figure(1); I5 g3 r- N7 |; Y3 P% }
surf(x,t,u)5 A4 y+ V3 y$ S+ H' x3 \! K4 d
title('pde 数值解')2 `) i# s* s8 A- ~0 r* T! @/ j4 U* |
xlabel('位置 x')
" q" l" I; @$ D! n% vylabel('时间 t' )" Z) h& l i2 D9 K2 y8 N, Q
zlabel('数值解 u')
8 L# w5 Y' W; l) v% a%*************$ T) O* r# O. j; m9 ?4 ^
%与解析解做比较
3 o4 F- @7 T3 o. d( E' F%************* e: v7 n% _7 G/ t1 m# f5 x
figure(2)
# Y" \6 C9 y. x( \6 ]surf(x,t,exp(-t)'*sin(pi*x));
# ?: F( r3 a5 h) O5 _" ititle('解析解')
2 l; C+ y' G2 s' O% X/ j* C9 {xlabel('位置 x') S* c9 ~% U5 ]1 ]3 f
ylabel('时间 t' )* Y9 }$ s; n! e/ m4 j
zlabel('数值解 u')
% {& S! e! v! e! j( R, M%*****************
" n& h0 E# L8 k( ^%t=tf=2 时各位置之解7 `2 e! @9 f0 U; {, W: r3 v
%*****************
3 N9 T0 ~7 [/ b: i4 F( A- G6 Bfigure(3)
! l9 ?) {) x: l( r' CM=length(t); %取终点时间的下表2 I! }: ^, s+ U9 H( [' V. T9 a
xout=linspace(0,1,100); %输出点位置
X& N. ~7 o' D- t1 d+ X9 S& K[uout,dudx]=pdeval(m,x,u(M,
,xout);
! `9 n4 @' Z& A7 `5 W I* ^plot(xout,uout); %绘图+ B8 a1 K" L' x6 U! K3 z0 M
title('时间为 2 时,各位置下的解')
& @5 i4 C0 G7 u+ b7 Sxlabel('x')
) B) }! v7 b; cylabel('u')
( Y, K5 o( ]1 {8 X+ O2 V3 ]; i%******************
& r6 F: r; h: g/ c%pde 函数
" H7 L" `0 i: r$ o, c/ @%******************8 J: w3 s3 ~* I( d7 G# m3 _+ w
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)3 n/ G5 s1 u) f ~8 I' L8 N- ]4 m
c=pi^2;
* N4 j5 _' j$ Nf=dudx;( Z; p$ N* h& P0 e
s=0;+ _7 M' v; k4 U. D( h3 x% u
%****************** ; f2 d, D) X) q9 u' u5 K4 z
%初始条件函数
: W/ o6 n- K! K' Y' J' |%******************3 k# m5 M' ~( D+ F) F' @
function u0=ex20_1ic(x)6 ` f; [" [) D" E$ Q
u0=sin(pi*x);
1 Y8 a3 Q& ~! Z1 b%******************" h' |$ j$ r6 n- y- z* Q6 s0 D6 V3 y
%边界条件函数
9 m8 [, C7 A9 R3 ?% F%******************
1 T( g. C: r& p4 V/ [function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
2 |, D# R z: x, v% C( Opl=ul;
5 P/ D4 w) d- ?3 v+ Mql=0;
3 I2 z2 Q# x; {pr=pi*exp(-t);
, [' |# c1 J* ]( B9 W5 O$ Eqr=1; R- y) |1 k6 Y6 i7 p' g
* n* y( E$ _; J, Y
$ G$ _5 g. H+ C例 3 试解以下联立的偏微分方程系统
解 步骤 1:改写偏微分方程为标准式

$ `8 }7 M0 u) L
步骤 2:编写偏微分方程的系数向量函数
6 E3 n7 N* g2 l2 x* V- i# h$ h# \function [c,f,s]=ex20_2pdefun(x,t,u,dudx)+ \5 s4 A5 L& h. k9 F
c=[1 1]';0 y8 z+ ~( E* Y% T1 N; _0 z
f=[0.024 0.170]'.*dudx;3 y7 C& a0 n! f# s
y=u(1)-u(2);+ F- i+ z }/ T" O5 j( E
F=exp(5.73*y)-exp(-11.47*y);
/ h+ S0 L( D* Vs=[-F F]';; P* ~0 |! `( t) R
! l; x6 d! r2 x6 M; Y/ S+ c8 i
/ S g# i3 N/ ~' q5 R0 Q9 s- M
步骤 3:编写初始条件函数+ L6 }6 t5 a# }, ?" J; J
) N9 B* f2 G& F0 M
function u0=ex20_2ic(x)
( S' j7 _1 h0 g; E) X5 ~u0=[1 0]';
8 K) z* C" J0 S3 N- o3 K
$ B; x9 H3 i, p7 J+ `步骤 4:编写边界条件函数
2 s, I; P: C. C' r+ `, ~1 P9 o0 m# N- d9 u* ]( ?
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)+ y8 U' g& F0 c
pl=[0 ul(2)]';1 \0 B: X( ~/ U0 i
ql=[1 0]';
" g+ b9 m6 M L+ o, r! U" e. `6 c' Kpr=[ur(1)-1 0]';( k" _( {' `! x9 x. S; X- T
qr=[0 1]'; ( |# B0 [/ r* O4 B) H
; |# Z3 S4 G( A" u0 a
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,/ w/ p2 {. j4 @0 S% v5 F
( Z" i8 T+ f2 Q; Y0 ?, C
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];
% O, C1 t1 d& A7 ut=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; 2 \8 b1 J) U' U# r
& \! {" z) Q$ e1 c% f
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:8 v! Q+ a) T% [' C
2 E5 E _% K* c1 I' B
function ex20_20 l6 ]' M U9 y! R' \, ^+ c
%***************************************
! W+ V8 o" D! C8 F0 S- _%求解一维偏微分方程组的一个综合函数程序8 J0 A7 e9 ~$ L- O ` R8 i% M7 Z
%***************************************. [6 f8 ?, R7 B0 B7 n- u+ g! i
m=0;( c- ?2 y/ ~6 i: i) n" c
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]; V; E' J) m2 L7 r' o
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];# u) d4 e; I9 D* C& o- O9 C' Z' ?5 T) s/ d
%*************************************
! B8 P( k0 G5 C. s%利用 pdepe 求解4 a: ]$ @* B# S* g
%*************************************5 @0 J" k, s, q7 N8 ?2 b- f
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);# I9 d! x D8 q' B
u1=sol(:,:,1); %第一个状态之数值解输出
* k" j8 U9 ~( Z, g5 H, R% \u2=sol(:,:,2); %第二个状态之数值解输出
8 ]$ M- W( j* [& [. ~1 r! c% v%************************************* _6 |5 N8 [: E2 `6 x5 W; _2 {! n) q* Z
%绘图输出; ?! P3 u* g) q2 ?: B5 r
%*************************************
9 a- n: L6 m" l, _! w5 p6 z3 hfigure(1)
. G- d- Z E4 Gsurf(x,t,u1)" s& R# F# Z* W7 b8 ~! v
title('u1 之数值解')7 P6 \7 ?7 |1 N
xlabel('x')
6 G& a( B( F1 xylabel('t')* Y- O8 o3 A, [% p1 G
%) ?4 T, M4 h9 F8 L+ P
figure(2); @4 \1 W0 Y9 T, }
surf(x,t,u2)) j" y4 B$ ?' M7 i" ? ^
title('u2 之数值解')
7 F0 p0 V; v- L0 O& a( cxlabel('x')
; R( \# L i# [, F' p% B# T# J0 yylabel('t'). }4 f! a+ I+ [3 o: ]3 k2 g$ [
%***************************************
+ Y4 L. f) {& o%pde 函数
; M' _( K6 i7 G) w5 w4 P. z%***************************************
7 t" J! I2 }: C4 f) ?+ Dfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)
N. l+ s4 R8 \& Rc=[1 1]';
+ b' K6 H$ k- D3 B( o! F5 Cf=[0.024 0.170]'.*dudx;) z' T( P* k+ b3 n2 H
y=u(1)-u(2);- k- {) t" o! g% Q+ \. R% U$ h
F=exp(5.73*y)-exp(-11.47*y);/ h5 P/ H( d( {$ F% N
s=[-F F]';; X$ G2 s6 \' Y1 V
%****************************************
' L) w) I. w9 N4 j9 E%初始条件函数
& X4 @" o1 j) h4 S6 M' e2 v%****************************************% d6 G, h- h& ]/ K
function u0=ex20_2ic(x)7 M! l; x! B( E
u0=[1 0]';
8 b) c+ h) X4 n' k9 ]8 K0 D%****************************************6 _6 f. c4 R+ |
%边界条件函数1 h2 p7 g; ?5 e2 l1 V' V) p1 G1 k! Z; c
%****************************************( `3 m( ]; a" D! l8 @% V
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
2 U4 h4 K& Q# z! K1 ^2 Lpl=[0 ul(2)]';& \5 N' F' i; N! H
ql=[1 0]';
. }3 d9 @, d0 X9 T9 w" Epr=[ur(1)-1 0]';4 Y; U4 _7 M( | O
qr=[0 1]';% L$ t8 Q' f& k3 K
, H) l5 l( j9 N
————————————————: d& t# @ n( L% W. H# f
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, F; S* R: [. g6 C! j原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
. m8 k& e" t1 x$ F
% b- h7 w9 I3 [9 x- X5 k; Z% b6 y' b
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |