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


' L4 N/ h* t* a: K其中 x 为两端点位置,即a 或b
用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
: P6 `7 |$ d! g' V S. O5 s+ ~ sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
h) ~, J8 d- V# G7 B7 I R
7 q' B9 o4 V# G+ A& o: [
- @$ R& w' ~+ N! a/ w& u" W5 ^3 C, U) x9 t: r
7 L. G [; M% G: e
注:/ a7 P# K- \. ^+ U6 \ V
# q3 P7 K. ]5 B4 g3 m1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
( E' c+ W4 [% A5 k% e
5 k% b: H& E/ o( B/ [4 b5 Z0 ^2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。' t# k8 ^; q5 \
) } U/ _9 _" p$ e0 K& p G9 L
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
+ E8 h P5 s+ X4 Q8 g) f. Z: H+ Q x& @3 e* V( D1 F
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
6 f0 X/ i8 K% d# ?6 d2 k" t% G, v
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)7 I. V8 C7 z; g" z# H: F2 D5 o
2 Q5 k7 b7 q$ y) u
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。! t4 l5 @8 K2 N) v8 e/ y
( R# T K# y3 n, B+ C& V1 W
& N; z& s# }' D; I: m/ L1 T1 s1 V
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.: O) X1 P8 ?; {7 W: f" t' S$ u1 x. B. {
+ S8 k' J/ Y5 O以下将以数个例子,详细说明 pdepe 的用法。
. I' X8 f; b' ?$ i$ L% P, s- `! }! A
6 m+ H8 |' t- N4 X3.2 求解一维偏微分方程
/ N/ O0 I4 d j' M( ] s9 x例 2 试解以下之偏微分方程式8 K r. K. p: Z7 P* D/ a+ o+ Z9 C. K
/ R0 J$ ]$ _% P; n
4 f/ F9 F! e+ Q5 A7 S
0 \" P. ]/ x8 J) m0 c' T解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
$ y/ r" ~' q9 a" E8 e3 c! N0 {5 g
- M/ r1 P/ W) u1 W( {2 y, R步骤 1 将欲求解的偏微分方程改写成如式的标准式。
$ n8 |5 [3 s% f" R+ o/ X$ ^' U! n$ V( a2 f
, V9 E* {' g% ?/ Y) K9 u
0 Y$ O) E( P/ i& ]: K步骤 2 编写偏微分方程的系数向量函数。
$ e3 @6 n/ q! l$ k' d, f6 e! t y
: _, N" D* g$ G Lfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx) ' A8 y5 l2 d- S
c=pi^2;. q4 W0 L% c9 L& c- \+ G& q
f=dudx;
: J* S# ?; B2 W* y3 j+ Is=0;
* B! x& v6 S' K5 O7 u; x
z4 Z; d2 V9 V& p: Y% X8 s+ @3 G& ?
J. Y' V& G+ i) g5 ?步骤 3 编写起始值条件。
. p6 _9 u( m; V% a! U: [
* @! o# `9 |) ~2 f0 P6 z1 zfunction u0=ex20_1ic(x)
# S# E+ X) T. G8 x# {. vu0=sin(pi*x);; {6 R5 D$ w, A
步骤 4 编写边界条件。
在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成

因而,边界条件函数可编写成
! a& A0 e" Z$ X
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)2 z D( A9 E( v ?% i# F C1 n
pl=ul;
) w6 k3 T4 N2 Z$ Z; f/ Wql=0;
; F# D/ p# s$ G* E1 i8 x$ R$ lpr=pi*exp(-t);: Q, E7 V( b! w. P9 }) e
qr=1;
9 ^8 \3 ?9 ^% v0 A8 D6 h' X1 E n) R
/ J _. ]+ ^) ]4 S( W& s步骤 5 取点。例如
$ o3 \7 j8 A+ Q f- X+ Z9 b. m$ S/ l% Z4 D
" f; v( Z! f/ e2 e2 ~1 Ix=linspace(0,1,20); %x 取 20 点2 R; }. l' @; R8 L' q- K
t=linspace(0,2,5); %时间取 5 点输出* e% a% Q0 A- V+ o0 k! r
. S8 _9 }& W9 v5 G: A
4 o* X8 y; }. b5 m0 n# F步骤 6 利用 pdepe 求解。
7 N9 [1 m3 \/ o8 f; @5 a; ~( M+ V( t! C8 G, i0 o
m=0; %依步骤 1 之结果; `* I6 z; T. A
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); # y5 A e1 f4 [" H ?% d
1 b& z2 b1 a$ z0 V! _% z0 I) _% b8 P/ L- w# p w% W* E) L
步骤 7 显示结果。
0 ?4 Z# C: x( L6 C, g" j- H
: R, j9 Y9 t8 r1 A7 \u=sol(:,:,1);
8 \# I" j, k7 {9 Z+ esurf(x,t,u)
+ w; |" A. U, T( {; C; l! ntitle('pde 数值解')5 `7 I/ j7 v7 D8 B: q5 S
xlabel('位置')% T: R( C5 @$ t# ~/ d0 X6 W
ylabel('时间' )0 a3 a. w/ A+ V9 G. j/ a2 F$ R" Q
zlabel('u')# p! n! M+ n' Y5 Q& v( U
1 i- X8 A$ E/ `' L/ B% L
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):! D: b3 d9 w3 l W
# {* ~% Z. z6 o9 N
figure(2); %绘成图 2
( U) [- O& k1 F( T1 y1 W' yM=length(t); %取终点时间的下标: s# J, `! J3 A+ u! E! u! i
xout=linspace(0,1,100); %输出点位置1 n, T+ O8 ^" z
[uout,dudx]=pdeval(m,x,u(M,
,xout);6 W4 ~- X3 F. T( [: O* V! D
plot(xout,uout); %绘图/ G, [ M V* m; h2 x% E5 f8 W: A* N
title('时间为 2 时,各位置下的解')3 d( v9 M1 X, r- O
xlabel('x')) {$ `2 R# G0 y- {2 A
ylabel('u') ) s2 W4 S% P8 q* w7 A
/ G3 U* f+ r. I' ^8 o! k4 C+ S
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下( b4 R4 j+ ?" N. { E2 S
w0 B# x4 a; }$ R* [1 D9 T
function ex20_1! z' u4 m0 N! D' E
%************************************
: z5 }5 I! f# _. P1 [, w1 c%求解一维热传导偏微分方程的一个综合函数程序5 z0 Q0 l5 L& F( W
%************************************: ^' H' `# m- Y% A! q
m=0;
8 n: Q( Y# k0 w5 f! U! ]x=linspace(0,1,20); %xmesh* ^" o4 ?$ ~- Q. d5 _/ p- Q8 M
t=linspace(0,2,20); %tspan
) T2 P+ h. k& ?- v9 v4 r1 t5 V! G%************& e7 E5 F& W1 t2 {( \7 i
%以 pde 求解
9 ~, W6 z1 ~$ G! m%************5 `0 S$ ] i2 c/ e: M
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
8 i$ l3 ^/ g- y9 j0 c) {u=sol(:,:,1); %取出答案
( z3 R3 \2 R3 E @! D%************5 j- E+ k2 \+ e4 x: B
%绘图输出! {& l: I% e0 S
%************
# z3 C- C k. ] L& R9 Gfigure(1)
5 Y* W1 U/ y9 p; O: D+ E9 asurf(x,t,u)
2 L' U+ k2 @- T/ C8 v- _8 Q7 t& rtitle('pde 数值解')& k' q, n7 f$ ?2 C
xlabel('位置 x')5 B, N/ x+ O3 y5 W; X7 k
ylabel('时间 t' )% ?1 a2 C% S, r6 m
zlabel('数值解 u')- I4 p+ U& Y4 ~" A1 O# A) c
%*************# F. h6 H. g7 s
%与解析解做比较, i: S" H4 @# w" S0 o8 U
%*************
0 g) c8 d: y+ S8 v5 C- W& _. O" r6 sfigure(2); Q9 i- Q3 s9 A9 |& H$ }
surf(x,t,exp(-t)'*sin(pi*x));
3 f! t4 Y+ [; z s1 ptitle('解析解')
3 i8 m! X( L' J- I ]xlabel('位置 x')
+ D: y$ z- g3 x/ _; Yylabel('时间 t' )$ Q2 M( T. k M" ?' Y( _
zlabel('数值解 u')
6 Z6 f3 y/ q! q/ M%*****************; Y: ?3 q8 t! A/ z1 g' V! B
%t=tf=2 时各位置之解
( ?% ?" t( c8 u" u%*****************" q2 O% t6 H( H e+ r$ N
figure(3)
# d: Z& q$ v$ i' g/ c r7 C$ FM=length(t); %取终点时间的下表$ N8 @# ^' [5 M) W
xout=linspace(0,1,100); %输出点位置
2 E# M! i2 U9 E) A[uout,dudx]=pdeval(m,x,u(M,
,xout);
2 s' m0 Z. J1 G5 L' mplot(xout,uout); %绘图
1 M) W. _4 z8 {" M9 t9 L* ^title('时间为 2 时,各位置下的解')2 c' c; C# X, a% x
xlabel('x')
8 }9 r1 |1 B; j* J4 I! ^ylabel('u')4 t2 |) w* ?1 O4 W
%******************
# ^5 m9 I% \8 N f( T! [( `%pde 函数
9 U+ e7 B' G# M4 d9 {9 A%******************
( r& P" ?' U- [% I! afunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)% s- k. w& |- L+ F$ Z
c=pi^2;
: b: v5 X; _5 Q `2 if=dudx;2 \# a9 b J& g/ _
s=0;- x3 V9 f8 P9 @9 V5 ?
%****************** - _ F2 n* J& f* y
%初始条件函数
% Q4 h% L( ]" ]5 X2 D$ q0 G%******************4 T7 B& n$ [* S0 \% ^/ m8 Y
function u0=ex20_1ic(x): d) Z/ l+ e- V' F) r
u0=sin(pi*x);. B8 y' j% g5 J, R5 B" a' c( l8 U
%******************7 W2 w. F; g$ C, |
%边界条件函数- ~0 z' X- o8 g; X' @" J0 Z
%******************, f. g2 c! F2 D! a* g
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)' }/ H4 H+ b# T0 b3 @6 [4 v
pl=ul; y; D. M1 E& \8 h7 _7 J$ ]9 F
ql=0;* Y1 ^! w& L+ g8 J- F
pr=pi*exp(-t); s! m; x3 r( B4 R. V- {, C
qr=1;* |9 _% p+ {) @# `! ^. x, [8 v# ~
1 F* C$ D( i) D+ p* E S. Y c+ f$ S& R
! @* I% w5 }9 R! ?8 c! \例 3 试解以下联立的偏微分方程系统
解 步骤 1:改写偏微分方程为标准式

. t1 {- y2 T- p* ?
步骤 2:编写偏微分方程的系数向量函数
8 W2 C. A+ V- efunction [c,f,s]=ex20_2pdefun(x,t,u,dudx); j r" @$ w7 _
c=[1 1]';
8 D& T% a: z0 C) W6 ff=[0.024 0.170]'.*dudx;+ K: s; n# y! G, j" P/ y ^$ n& Z
y=u(1)-u(2);
3 u! Z6 p% _0 r# a1 dF=exp(5.73*y)-exp(-11.47*y);9 A' j$ u+ _3 k. S, E/ a* A
s=[-F F]';" P6 O+ P. U3 {7 m: V# ?) Y
- }: O9 ^8 o7 z# y2 T1 k$ L8 f0 E, U8 ~% X5 m
步骤 3:编写初始条件函数) \% E0 l& d- C" O
8 Q- H; N. r5 k/ F; m' Qfunction u0=ex20_2ic(x)
/ j ]$ I1 A# G( i, Yu0=[1 0]';" U. k' {- i* i
% Z( Q S+ O- Q步骤 4:编写边界条件函数9 e2 m: c& w( ^7 W% w6 Q
' f6 k9 B9 w$ L2 k
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)' k/ ]# a! R+ ~% |
pl=[0 ul(2)]';
0 C/ p, C+ w% j7 wql=[1 0]';& ?; o' [7 l4 [; j; p
pr=[ur(1)-1 0]';1 l& S1 H; \' D$ i% Q4 e3 v
qr=[0 1]';
/ \. Y( h! ?* a% u# S; E+ t p; ]) z9 n& L2 j9 @
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,* ]( P+ Y% H3 a% }; N1 {) f3 M
7 f! P2 B9 v2 t0 zx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];' `0 p) O, C7 [: ~$ d/ h
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
) V: o! P0 S) S k/ E. f- T+ [( M# J _ s7 P$ p! e# a3 D: r
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:5 W4 J; b. G6 ^& R: D4 @( T
y9 ~) a. x( y* X% A2 U( n1 [
function ex20_2% s4 N. D2 V# J
%*************************************** 0 a: ?( `; N! o# C7 I
%求解一维偏微分方程组的一个综合函数程序
5 E+ {% ~* ]8 P: a% T X%***************************************! e1 U( Z4 Z* q% m" _
m=0;8 \' Z% {! b0 K' @. ~1 n9 r p
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];
: k7 M! `8 P1 Q! M& {9 k/ }t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
7 {( m @ s5 i H& b" N7 @5 _%*************************************
" s: ~$ h- u. X, J }, y+ j7 k9 s%利用 pdepe 求解
+ J1 Q* [% G& c%*************************************& N& ~: n4 L& {: ^# Y8 c a
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
) ?& ^- v* |# j9 j! b$ Mu1=sol(:,:,1); %第一个状态之数值解输出/ |5 R& _. ]! C( W* B' k& C
u2=sol(:,:,2); %第二个状态之数值解输出
I5 ^3 f4 O5 M: F%*************************************
' ]1 R3 ]% l; `3 x7 o2 Y% y%绘图输出0 o- Z6 }/ |2 K5 l, x
%*************************************7 @# t: X7 W' S. ~0 D: H
figure(1)5 R8 L9 l! D9 |0 v2 r6 R: G: f
surf(x,t,u1)7 _: E2 v% d4 ~8 _7 J# D
title('u1 之数值解')
. ]9 w. Q5 k3 o: V7 Yxlabel('x')( E' F5 G; Y$ K9 n# _/ {, m# r& T. T
ylabel('t')" X/ l8 f3 v" J- w2 m. a0 B% Z, ]
%
4 m. C2 L3 J9 d0 r# kfigure(2), E" Y- u% _) M9 [
surf(x,t,u2)
, W) k1 q! Q+ ?$ M! c0 Vtitle('u2 之数值解')
3 d# x0 K) @1 f+ v/ ^+ jxlabel('x')
5 U Q B/ t1 h9 hylabel('t')
, K- j* ?$ A1 x%***************************************
0 t! F: g% a# v) p2 ]; u( y$ G%pde 函数
9 j# `9 D7 T3 E N* p* J% h%***************************************
9 R3 o& _+ _9 J+ [1 D( Afunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)) w4 S& T* m& j3 ^% `, m
c=[1 1]';
: O& m @$ O$ Xf=[0.024 0.170]'.*dudx;& ]( X5 x( j# A* ?8 [0 G6 t
y=u(1)-u(2);
* N5 k1 e" f% t# O: tF=exp(5.73*y)-exp(-11.47*y);1 r6 S% ?( l( f; U
s=[-F F]';; J6 C4 d$ |1 w3 s) j6 ~& x
%****************************************
% u2 E3 d; L; R* K! v%初始条件函数
8 Z: |1 o& x( _7 V4 X2 _( |8 N%****************************************
% }+ S) i. s. w8 n; yfunction u0=ex20_2ic(x)# e7 [2 r( `+ @ y! I, c
u0=[1 0]';
7 D# V5 K8 I! Y) ]1 M$ m%****************************************$ J" H& Y, ^3 I( }' N6 v0 C
%边界条件函数& L( e- u* \8 l Z- m; H
%****************************************
; g; v O3 G! q: qfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
0 X( U4 l9 a1 {pl=[0 ul(2)]';) g3 n0 q4 B- o, P! q6 G+ B+ D) B
ql=[1 0]'; ^% l8 \8 l: v* O2 q
pr=[ur(1)-1 0]';. Q! s0 ~% _+ o. D* \9 Z' I
qr=[0 1]';
. \) m' B9 L, \/ |' z; b# n+ Z. a% w9 z# c8 }
————————————————
8 p# X; ^& L7 f7 M( n; J版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
4 B, h& D/ N' n+ V1 T U原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
+ Q/ j" v1 o) K" m9 m3 ~( K. }- v! M, j& l4 w7 r
2 k ? P0 C- Q" d
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |