数学建模社区-数学中国

标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法 [打印本页]

作者: 浅夏110    时间: 2020-6-10 10:25
标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法
3.1 工具箱命令介绍

MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式


5 L& X. ~6 B* O% L

其中 x 为两端点位置,即a 或b

用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:


0 K4 e& p4 n8 E" O, v4 [ sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options); v7 c9 F9 n* g: x  D
+ e# K3 {1 D1 o- L# p

5 ^8 b( N3 |( ^' H: [( {0 k/ I; p1 Y
, ~: J/ M- G. r* x. R
注:5 R6 T0 R" N/ s' ^

* B2 S- h( @2 }3 x! B" z1.  MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
& T6 r0 x4 C7 ?# }
( ]' E0 B( W) {% K2.  x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。; Y8 v+ I2 V! q6 |! K

  n. ]' q8 ~5 I+ x9 |( S3.  tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。/ M. ?/ Y5 ]$ L; K! q

0 f2 _+ ]6 b7 S3 V4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
; o2 I3 C  v# Z. K! F; k8 o/ J; w* ?& `( b( R3 a, x
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
4 g* A7 _8 g4 f; e; V' w, j
2 T1 Z* p- [$ J其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。0 T8 R( l8 k' w; S
8 L$ T( ], p7 m
: N3 X' U' C; C$ A4 a- Q

3 Z& L5 V- f/ ?* Z& lref. 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.
& J* m7 x; }7 Y* Q
3 a, m2 a$ c5 j以下将以数个例子,详细说明 pdepe 的用法。
& Y# E1 P6 e: v- U' t7 L. [+ K' f5 s2 G& m" u3 p/ R' V0 @7 I4 ^  u
3.2 求解一维偏微分方程1 `2 N7 T1 s, H) i: I/ f
例 2 试解以下之偏微分方程式- y8 E$ a* ~4 }4 F0 U; Q: L

% `* U9 M: ~0 ^% f+ _8 y
4 J% Y) p/ x' K& }$ \6 Y, V) S7 N0 z4 S1 G% t, ~& c4 P
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
% I9 ?# A$ c9 ^) |, i' f
5 k/ r# ^/ g  Q  F步骤 1 将欲求解的偏微分方程改写成如式的标准式。
5 g% [1 @- `: Q: v/ V! Q1 x/ X# o2 Z: z9 E
+ z; G. @, H2 |

9 k: T1 r* [$ X, Z0 W8 }, d步骤 2 编写偏微分方程的系数向量函数。
0 O9 n' Q* N: R# _! J( K# @
+ U; q+ X+ d2 {) Z3 x0 ]' x$ Mfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)
: X3 I% a& e0 ?2 n( _8 @5 qc=pi^2;: \$ y0 [  M* p% N' X1 T) ~
f=dudx;. @4 b% x7 w( J1 J
s=0;
" e' D9 }/ [* B
  `# D- B' k& Q7 i
8 Z1 M2 W1 h' u
* a2 b& d0 ^) ?5 K+ v5 Y步骤 3 编写起始值条件。
# a% I* V6 q- i0 F. s7 L1 `2 O, C/ }0 P  H1 w
function u0=ex20_1ic(x)
9 Y) |! T& r: e0 Fu0=sin(pi*x);- k. V2 Q2 d! U# `) w; Z5 c

步骤 4 编写边界条件。

在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成

因而,边界条件函数可编写成


' v* j0 O! x6 h/ `$ xfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
3 ~9 e' `3 i0 `) Z5 Xpl=ul;
- u" U7 X* j+ A% t: H+ ^) n% rql=0;
" o) v1 e$ a$ l9 J/ ]& d. v9 upr=pi*exp(-t);
0 P' s8 g: w+ bqr=1; 0 \0 S( f* Z+ |# S' x

) [# U$ @9 J" [/ P
6 x$ {' F- k$ @" j) n. p. U步骤 5 取点。例如9 w% ^% ~/ j' S1 ]8 L- M  Y( e! a

1 U6 H' W! v& }3 n, S0 h* ^& t
0 T2 v) w7 l- j' o! \x=linspace(0,1,20); %x 取 20 点3 e! ~# A& j! l, [% j+ L0 a7 z, F
t=linspace(0,2,5); %时间取 5 点输出
: }% F  |" a) M! s, m
6 G9 Z7 t1 T8 I. m) d
# l/ G$ W- z+ X; Z( q+ ?$ ~步骤 6 利用 pdepe 求解。5 [9 x# k( t& d8 i! q
" {/ y  R- @5 F) q! q/ z# s4 D
m=0; %依步骤 1 之结果+ @* Q- V" G( `7 ~  K. z( \; x
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
, I) ^( A3 ^1 _  i; G$ k0 v, T# F8 o* d  `: v* T

! Z: U7 I' Y8 o# w( j* F( j7 d步骤 7 显示结果。
2 \+ E2 Q0 N( n, @5 j0 X2 U3 P- C- q4 S. M" F" @8 ^, ?5 D) l
u=sol(:,:,1);+ s0 z! H6 }; T# }0 T
surf(x,t,u)
  E7 ?7 v4 v; _6 h: atitle('pde 数值解'); j# h/ x( ]* o5 O" r6 N1 S: \
xlabel('位置')3 j: h7 A2 K% m' o* w
ylabel('时间' )
. a' B2 S  B3 ~$ v% Rzlabel('u')0 k: I- U" Z& G- j

; @3 O8 e2 t+ f若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):7 V/ b& V- [  Z: B5 C, I; A

* v* Q3 V6 w# `figure(2); %绘成图 2
# f5 p. u* V0 k. MM=length(t); %取终点时间的下标& I4 _% e4 M' r
xout=linspace(0,1,100); %输出点位置# k% ^+ B( k9 W6 H' ^6 t8 D
[uout,dudx]=pdeval(m,x,u(M,,xout);2 s5 u2 g. y% r6 Y& o
plot(xout,uout); %绘图
$ K9 [) e  |/ ~5 B: e5 ztitle('时间为 2 时,各位置下的解')
4 A: u5 C7 L8 C; J! c- n  h# f  Nxlabel('x')6 b( @8 s. g8 M7 ?% t
ylabel('u') : i/ }- i$ q) X# {: \

8 B  C9 ~" K' p5 C综合以上各步骤,可写成一个程序求解例 2。其参考程序如下" q" X# t5 U9 l& M; f! d: A

. \8 C; t8 w1 ]* L& u) yfunction ex20_1
+ }6 ]" y+ K' i: }9 a%************************************
/ h3 R. V4 b* r- a8 K9 ~  y* V; H%求解一维热传导偏微分方程的一个综合函数程序
( A  U( C# n4 Q' K( t%************************************
! [5 ?/ g5 p' i0 B& k' ~m=0;
2 Q+ W$ S- l! ~/ Ix=linspace(0,1,20); %xmesh( k/ |+ K4 K! J: x- D
t=linspace(0,2,20); %tspan- j) \( I6 \! j- r2 c
%************
; F1 {) R8 E& O7 m  {# p& L%以 pde 求解
' A9 A* F4 m9 y  s' z%************
# k( T& F, f* `7 v. asol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);6 j& y. o( k' @7 N% ~. b2 V
u=sol(:,:,1); %取出答案
8 w2 k. G9 w! e+ p! f%************
& h' Y7 c3 T% q% K8 f, T%绘图输出
+ V8 t1 F( p! {8 x%************
# U. H0 l' v! u4 D5 C7 g1 f) p  kfigure(1)
3 }0 a! A) ~/ {+ M2 A6 Msurf(x,t,u)
( R2 e4 w. S7 Ytitle('pde 数值解')4 N$ D$ y4 S0 O. x% C
xlabel('位置 x')1 c1 n& `! ]9 I- S
ylabel('时间 t' )9 @9 r8 U$ }9 |) o6 Z" ?6 A! `1 D
zlabel('数值解 u')
, P% h5 q9 S! p! y3 I. b# j* S. _%*************
2 K8 E0 ~  j! m; [%与解析解做比较
0 |2 I, a% S2 u$ y, ~( k%*************
9 O( w4 L  B) q) W& ?4 gfigure(2). b4 z; @& V- z- v5 v9 E
surf(x,t,exp(-t)'*sin(pi*x));
; e5 a8 }! y6 _3 f) H* M" G4 Ititle('解析解')
$ G* h1 I0 F; d2 J4 w' oxlabel('位置 x')
2 I  s. C$ g8 t& G7 I0 |: P$ w: }ylabel('时间 t' )
, T+ T' ~+ s# X% C+ y# d# Mzlabel('数值解 u')  Q' k& V2 p. G) [& B! @
%*****************
" y) O6 x% m7 B2 \& K( f%t=tf=2 时各位置之解
: ~; o$ E* L0 B5 I) |# j%*****************
& O! }9 b# Z! l' O! lfigure(3)' p+ w" t- V7 F- b* \
M=length(t); %取终点时间的下表
0 g1 ~$ p. G! s! R4 f0 ]xout=linspace(0,1,100); %输出点位置) d# X9 O( c+ g8 e
[uout,dudx]=pdeval(m,x,u(M,,xout);% d$ p. P1 C0 G& n
plot(xout,uout); %绘图
5 Y& y; S4 O' Y  `# qtitle('时间为 2 时,各位置下的解')* \; m8 X; G* b
xlabel('x')/ b3 u* _5 ?& E' ]" P  Q2 U, h
ylabel('u')4 \, h+ M& S) F- F7 W
%******************5 `- K2 E  `! @: V* {+ W
%pde 函数2 j1 V4 E' c' ~/ y3 m9 ~
%******************$ ^1 Z% V2 N& {, x% `9 N" ^
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)" v' U! `9 w/ L  A) h6 l
c=pi^2;0 i5 r1 y" P4 j5 M3 A' V! V
f=dudx;, {( ?6 e. r2 g$ D* b
s=0;
: n9 t; H4 o& i3 r%****************** 6 ], b1 M( d# w: B. B6 a* Q
%初始条件函数
  C& Q% h; D  @# U%******************7 s1 x& O7 @7 |( D# H+ Z
function u0=ex20_1ic(x)! |6 ]# i6 E6 L
u0=sin(pi*x);- r8 U, ?; n0 u$ X! [- [3 w. _
%******************; ]+ r  \" T# j; X- {
%边界条件函数9 U7 k( k2 x( \  C' h  T
%******************: t+ b, A6 O% ?- m( j4 ]" K
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
+ [+ U) p0 d( s2 jpl=ul;/ F; w4 l* M* s% N7 R, |# _: V" _
ql=0;: U8 P! L5 Y/ Z1 C* ?- F  Y
pr=pi*exp(-t);
0 ^: |6 [2 j" W' k8 c1 ^0 Jqr=1;- x" E" h6 i& [9 H4 J  I9 D
% V6 P$ |% l" D9 d& a. V
3 f6 S, j0 b3 i; k5 y' L
例 3 试解以下联立的偏微分方程系统

解 步骤 1:改写偏微分方程为标准式


$ _5 \$ y. k1 u) a; c

步骤 2:编写偏微分方程的系数向量函数


& [+ Z$ u0 d) Xfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)) C) n) N% H, X
c=[1 1]';4 `3 B. F  F; G
f=[0.024 0.170]'.*dudx;
) }* |# x8 i: K) ky=u(1)-u(2);% D% P9 Z$ i% k/ B& B# f
F=exp(5.73*y)-exp(-11.47*y);
( v" e1 x6 m/ cs=[-F F]';4 ?2 ^1 z0 ?8 L; x: x
- z; X+ D* ?0 i' y3 t. x
" W7 x# J7 E6 p( e9 a, v
步骤 3:编写初始条件函数
' {4 X; l: ^4 m- D' }( U$ Z& x  X, I& X
function u0=ex20_2ic(x)
$ v9 D/ J0 G) F* j; cu0=[1 0]';: q/ Z% a" Q) @; J) B! F
/ L: S9 L% G  T+ p. O- e" {& E4 x
步骤 4:编写边界条件函数! w$ G1 j9 t5 `# n
# A- `6 A- L3 @/ `- C3 X* j) J' e
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)* {( d! {6 w- U% D3 J- r
pl=[0 ul(2)]';6 ~; I* S2 j, x  V, |9 X
ql=[1 0]';+ f- u, H3 B3 [" L) A
pr=[ur(1)-1 0]';
+ v- `! [/ k$ ]8 M. X, qqr=[0 1]';
$ e2 C$ D# G; |' e( q# w$ A- `8 v: j3 c
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
2 h8 d6 ~1 ?" U4 k
$ n4 n2 {2 I2 y( O6 Ix=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];4 F0 X" O' m. M5 p: k: N8 y
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
0 [! \7 ?) o. x
# P( X/ \( r6 C. a2 M, {+ t以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:# w* y0 l$ C4 C" T
+ T2 h* u2 Z- J6 R" c: K; p' H; P
function ex20_22 v' d1 }( `; o# L5 ^8 W; I
%***************************************
1 [6 C! j, G& C9 F" c%求解一维偏微分方程组的一个综合函数程序
8 @5 }! l8 U# h4 r) L%***************************************
' _6 {2 e7 L9 i8 o" ^% }m=0;
. H, |4 J, b- P+ Wx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];; r- K. d) P, F; |
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];* F, P8 }2 W4 _9 @6 F. J  a2 N& h
%*************************************
, e% [# n" r% Q% v- q1 ?%利用 pdepe 求解
* ]& v3 o+ }. Q" T3 U%*************************************: |- O, \7 ~! J8 }. w6 n" I2 D3 U8 ?+ C9 S
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
$ B  V$ [' f! g# B+ w5 `u1=sol(:,:,1); %第一个状态之数值解输出
, x1 E: v: Y. @  |$ ^u2=sol(:,:,2); %第二个状态之数值解输出
2 g9 h+ g% z) H% B  \; n%*************************************+ B8 I1 X2 S* Z7 U- m9 Q" M
%绘图输出- i, V2 D; h! b- O0 V2 r
%*************************************4 [* M$ S: K: u; Y, k
figure(1)" c+ W. o: h  @& B2 |
surf(x,t,u1)
# n5 Z! M- ?( Z9 {$ ptitle('u1 之数值解')1 w+ ]2 }; u. k, p0 J. M/ n
xlabel('x')
3 Z6 ]6 q2 D0 }. Y2 b- w+ F( M; Pylabel('t')$ l4 C4 @& v* `0 S! P# C
%
& X) y, ~" K  M5 L2 S# y2 ]9 s7 wfigure(2)
: \; C0 H# Q7 |1 @$ d1 n6 Rsurf(x,t,u2)) i  B' y  c3 N; Q% L
title('u2 之数值解')& Z4 h6 T% P2 s& P  r4 {- A
xlabel('x')
( L( @& j# n- ]3 s! ^4 pylabel('t')
  n" C4 N* ~9 s9 z, J9 g  k%***************************************1 ?8 i# w. Q4 S5 |8 I" D
%pde 函数8 ^0 {7 t' v8 h4 x* @
%***************************************
: K6 O$ K2 F! @. T& [5 Tfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)
1 l0 Z; f5 G( Nc=[1 1]';; b# }2 J& D) n9 s% V
f=[0.024 0.170]'.*dudx;
) ]. W/ T; n  Y7 |  o. z( O& `9 b2 My=u(1)-u(2);
1 G$ [" u* @' e7 N2 n9 Y7 ?: z: FF=exp(5.73*y)-exp(-11.47*y);$ v' U) O1 J6 _; p4 ?9 V0 a
s=[-F F]';$ r9 {; E; W, @
%****************************************' f" t& l6 R  k' v* {$ k" Y( n
%初始条件函数
) ]4 M, ]1 Y0 q" L%****************************************
0 n/ Y( c, Z) a8 Vfunction u0=ex20_2ic(x)8 n3 S" N9 `0 G0 |
u0=[1 0]';$ P4 h# G- \# f( ?3 i- E8 \
%****************************************
% V& u0 y( x, T. I: n%边界条件函数3 g* s" \) C+ |6 ~" b
%****************************************
8 j3 L+ `$ u9 K* f- U0 }  cfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)1 y1 z! h1 p& P; u
pl=[0 ul(2)]';0 t# Y0 Z% S, v" r( A
ql=[1 0]';5 ^+ r. Z0 K8 v& h) J
pr=[ur(1)-1 0]';% u$ [; h+ k7 {  G+ Q9 A
qr=[0 1]';
3 z5 N7 A' W7 t' T. k3 Z4 }0 A  }+ C# r
————————————————
& e! h# f9 l: t8 y5 \& Z版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ e0 Z  x& b: u" p  P& \
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
7 {: v& Y; k$ Q4 \( V& j2 x
( ^, H" z& d5 a9 \
0 J% E: n5 n* c" _




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5