|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() 8 x$ |, ]' Y, H& q) S# {0 O
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
9 J( `: `# e8 Y- E, c: K& p sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
+ x) O, z$ O- U( A- a$ ?" D. ~( }8 _$ T* ?9 A3 B% P+ m' H* }
![]()
, o: p7 X! U6 C( n# v9 o$ {2 W: C: B6 K& E8 n
4 t6 g0 z, ^- M6 t: f: H注:
t4 F$ q5 `* n. i% @- ^
& W+ ~2 r, x* G- Z- T3 L" R' T2 g1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
2 g* ^( O& b5 b4 Q* M
. E6 [5 q4 `. Z/ m2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
" Q2 R7 O3 C( y: C- A R% n* l2 t0 s
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。' y) k' B% ?; t6 X( d, ?
$ \8 k( r! Q/ h7 c4 t# Q
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
1 D( U0 O+ {- w4 Y2 _
, _8 U, Q. g9 W. Y[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)" y; b3 W) ]& L. n4 A
. U# j9 p! Y4 v
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
! ~+ Z d2 c( X5 U$ m& ?% {: I% z/ m% [" T: D
![]()
$ l& U0 ^. U+ N* n) t6 e! Z1 U5 r5 ]7 N
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.. T, o% ]# s/ q! o4 C' E$ s! |
( G- B ^# z- B" Q* {2 D, \以下将以数个例子,详细说明 pdepe 的用法。
$ a& r/ V$ n% y% U0 r5 m( ], c9 Q9 \5 b$ u) }! F. `2 q8 d
3.2 求解一维偏微分方程$ ^/ ~: |3 u3 x; s
例 2 试解以下之偏微分方程式; Z$ r8 X3 E6 K0 q
9 c. j! [( j3 x$ s; D % _5 f: c! ^+ y3 ~
7 S" s: p9 D6 P( N
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。/ M8 z( T4 U# Q& l7 Z* e
9 S1 P$ {9 }, Y# h' s7 G
步骤 1 将欲求解的偏微分方程改写成如式的标准式。 O/ f' W7 D# k1 g! D
" q0 J0 L8 u& Q! [$ m
![]()
H3 K Y% {& r) e0 W' q7 q. ^- \' I$ X
步骤 2 编写偏微分方程的系数向量函数。1 ^* X/ X" ?6 A
6 m- G: t9 C. t
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
- b, K4 b+ d6 m7 }- yc=pi^2;; b) V7 u9 ]$ h! H H
f=dudx;6 A u) g X, J! u
s=0;5 Y1 T# X4 ~/ K3 {1 S: ~; F, e
4 |$ t W' j# m6 i' G
; C* [9 y' M8 W; i8 @, n* _2 j' L0 J, j! s4 S- O" s
步骤 3 编写起始值条件。% p: s8 m* e5 y" I3 }9 f4 M5 A" n
8 L! D& m& h0 I7 D% Dfunction u0=ex20_1ic(x), e h) D" a* s8 Z" e
u0=sin(pi*x);
' u& i6 a6 _ `! ^6 q步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
# [, |( Q* }) M+ wfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)/ C) @: a3 n5 e9 H4 f
pl=ul;
, m, y# ~2 H; Dql=0;
0 _8 h" I4 Y8 U% Y/ D; Ppr=pi*exp(-t); V$ u" R% s( N9 z9 n
qr=1; ' N+ I+ O. j" h6 U
. s+ U* q/ P4 k. b3 T( ]; v
+ k1 i( k: o& Z( U, e* ^$ B步骤 5 取点。例如
; D$ d5 x0 \/ d# |# w3 ~! A$ F# t* K' [) H2 @
0 S: p. {2 G- K8 {% @* q7 f% ~- dx=linspace(0,1,20); %x 取 20 点5 I. o6 Y4 h, z/ a, r, J
t=linspace(0,2,5); %时间取 5 点输出
5 @8 ]- M! m) _
* c. q `9 B( f# o' U1 D, H3 e# H$ l, V$ a+ `, m
步骤 6 利用 pdepe 求解。5 w! a; }, q. G
" v% x$ {1 O9 i! z0 S
m=0; %依步骤 1 之结果7 m$ ^( d; M5 c! [4 J7 C; q$ U3 D
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); 2 D- s& E1 F1 L- E" t& e, V' T
% E# e8 F4 h- p6 I) K
1 e4 Y* h7 {! z3 c步骤 7 显示结果。
0 e3 I+ U! P- c' K, ]4 c7 T. P0 t$ D6 J. H+ ~
u=sol(:,:,1);8 \4 J- Y2 K, I {0 r
surf(x,t,u)
! f" s# I( o5 {- D l wtitle('pde 数值解')! A) I; l! `+ Y4 |9 i8 }3 c0 }/ v: d
xlabel('位置')
+ T+ U! Q9 z1 \1 L/ }. r1 k( Gylabel('时间' )
; v# Z1 \7 q% p7 x3 E8 `zlabel('u')8 ]0 P& I7 n/ X7 e! f2 f: g+ _
/ X5 Z$ l5 h3 A3 T2 R B+ ?7 y
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
& S: i- P: c* l
. e6 G$ W& B! pfigure(2); %绘成图 2. g* A) k7 I8 n0 D5 Z- U; ]
M=length(t); %取终点时间的下标
7 A, K" z" c( k8 `xout=linspace(0,1,100); %输出点位置
/ N- s, \" b1 ][uout,dudx]=pdeval(m,x,u(M, ,xout);6 [3 O% a% I2 R q9 c. a
plot(xout,uout); %绘图
# P9 P6 l' ?8 r) g. B' l8 v: Ptitle('时间为 2 时,各位置下的解')+ c @/ e; Q' N0 S5 k
xlabel('x')
; o/ u, Q8 G3 i5 Q. `ylabel('u') & i( O' n* M, o+ N! Z
& I9 H* U' X }, N综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
6 R, w! v4 |: S7 @8 R3 ~+ d" S8 l2 @- p" q$ s0 N
function ex20_1
9 @8 g3 J# }% _% w%************************************
6 { n, N9 t0 K% L! A6 v6 ^%求解一维热传导偏微分方程的一个综合函数程序 Z r$ V+ r; u$ [ Y
%************************************8 O2 z. m6 N/ X- a$ A1 Z
m=0;
7 L8 H/ {" }- q- Z/ lx=linspace(0,1,20); %xmesh
' z8 y( s9 b' t5 w: E$ N B; [3 At=linspace(0,2,20); %tspan9 |3 ]% s4 O* `, o* [
%************: H- d5 N9 Y U4 B9 D! A0 v
%以 pde 求解4 ~! ~9 ]$ T7 y* D: [2 U: t5 ~: _
%************! q3 k; ~* C7 o2 b1 V! a, \5 o
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);( `, Z. h2 {- |4 d3 R7 d) J
u=sol(:,:,1); %取出答案( U: V! A, i. f" j( a
%************" n) X: T- K4 N* w5 o. l
%绘图输出" \5 r1 y9 ~/ J. C2 k; @
%************) l$ ^0 E" I: N# e3 ~% R; i: z4 G
figure(1)
# y/ i6 K+ I5 F. l( Nsurf(x,t,u)2 D+ |# z% H3 H% \! E! z
title('pde 数值解')5 \$ d2 v8 X+ L% i- r' _& g
xlabel('位置 x')& o: X. _8 N" X3 U6 ~4 P& F& F
ylabel('时间 t' )! A" N ~' {: O5 N( ^' L k
zlabel('数值解 u')4 w! C; s' v* N- I4 y
%*************
3 Z2 {! V0 j3 b A3 v%与解析解做比较. Z) x; _9 J& j" m4 l
%*************
$ E, O& t7 ?% H: R7 Zfigure(2)
: X# P" L; X3 c2 T2 V& a) ]- x( |/ Msurf(x,t,exp(-t)'*sin(pi*x));+ e% S8 {% q; O/ y1 v; |4 L" t
title('解析解')
( C+ j/ ~ _# I4 r6 `, a6 Qxlabel('位置 x')
2 E) p/ t. n& W' K0 R' Dylabel('时间 t' ) M4 P+ d8 r8 N
zlabel('数值解 u')8 M( M2 K6 N9 a
%*****************
$ Z. W$ ]3 T( P* A+ E1 `) u( g%t=tf=2 时各位置之解
( c2 p z! K" G e%*****************) w, `* U& J. W0 ~5 \
figure(3)
( U" F& ^6 s& ~" [% `M=length(t); %取终点时间的下表
|( M, v" A* e& o1 v5 {" e# gxout=linspace(0,1,100); %输出点位置
# p! c: q+ q N1 z[uout,dudx]=pdeval(m,x,u(M, ,xout);
. y7 R" k" P- n& X$ `8 i8 j) Yplot(xout,uout); %绘图5 b+ H. @$ _0 i9 H8 K
title('时间为 2 时,各位置下的解')
' {: h; H* L5 l* s% l0 Hxlabel('x')# r( f# a" I- @+ p. v+ ^) l
ylabel('u'). a! a( M+ z: R9 d. _& C
%******************
) a! r: [3 o) _$ ]2 Q%pde 函数& j3 O. f0 p5 J
%******************0 O* {# Q& M0 O' _8 [
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)4 f) q8 z u6 e1 z( Q; r: b% _
c=pi^2;
; h0 ?) n& E9 G# q# `' Wf=dudx;1 H, r) G9 N$ w- m! w$ P/ w
s=0;+ [+ T% Y$ ]4 A6 Y' O, B: l+ D2 D
%****************** % V4 U+ G4 J; y9 ^9 u n
%初始条件函数2 u) }$ O' |4 Y% s! @
%******************
8 H" M V% e$ n; w4 b% `function u0=ex20_1ic(x)
( [/ L) T8 s+ \7 P0 ^5 @u0=sin(pi*x);
" l! K) }9 Y6 y ^6 V%******************
1 X9 R% |8 \/ w! h4 Q%边界条件函数+ `2 R/ y: x# t. O
%******************7 O4 X7 F: n Q9 n
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
' \* K+ |1 y7 V$ k' K# W+ lpl=ul;* J2 C1 _9 h( p+ w: a8 n6 J
ql=0;
. `/ i1 f" _# H! N+ t& E$ Z6 Mpr=pi*exp(-t);
' b0 x' q1 W! g8 |( P# F9 zqr=1;
# O. N2 ^$ j& s% v' {% q' A+ o- ?+ H7 h) F' ]
3 q/ }( a1 e, g" O
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
2 ~/ ]6 L9 N- b![]()
步骤 2:编写偏微分方程的系数向量函数
3 i# u# z+ g. U0 h! Q% a+ F4 xfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)" l- y5 H; r+ ?6 H9 T' z
c=[1 1]';2 G& I# Y! v( N4 E+ P" ^
f=[0.024 0.170]'.*dudx;
* ^ C7 s/ M8 E9 d5 [& g# ty=u(1)-u(2);
: N$ M8 S( E! a8 U: N- h+ k) BF=exp(5.73*y)-exp(-11.47*y);; v' y" M3 N" ~6 y
s=[-F F]';
9 [# ` F# P! W& x5 x5 V; F2 Y; [+ ]
1 _5 D1 Y/ q$ r% H# b; {步骤 3:编写初始条件函数
# X6 e2 g1 ]2 K# S2 v8 {& h# [$ {: u( k6 ?0 G" P' s: v- i- Z
function u0=ex20_2ic(x)
$ W/ r9 C4 u% P8 {- z2 eu0=[1 0]';
3 T6 Q! B! Y! f2 L
; W( H6 q# I5 i7 a7 p" J步骤 4:编写边界条件函数
' \8 p$ K7 a- R3 n W; t0 Z
3 R6 W: @( v( D7 R. i! J* Ifunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
( ~! r( T2 V& mpl=[0 ul(2)]';
1 L8 p& L# T0 Y+ w: [8 ~ql=[1 0]';. P7 e+ E6 c' I k+ ?1 ^# `7 h
pr=[ur(1)-1 0]';1 d3 q( O+ ~7 [: Q
qr=[0 1]'; 5 ~$ p; c5 |' g6 [5 _. N
( C4 B" z+ K# b4 a$ U% \9 D! p) ]3 J
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,: g2 `- \) O8 h) |3 C. r) K4 T
8 Q a* e3 y4 m) I3 a! `
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];" N) H; ]5 ~) {% M
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
# D5 x( n2 X) _( `. N' d6 q$ D4 k& _+ o6 Y' [; E) k
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:% h; ?4 g+ A5 N$ {6 k) w; @2 ~4 d
% y) G# Y2 T7 h1 lfunction ex20_27 C# h) E3 V% L2 g- u% c( U' o
%*************************************** * u! X; Z' G7 ^: n) R* N8 ], a
%求解一维偏微分方程组的一个综合函数程序% n' L/ c* Z2 |8 D0 V
%***************************************
' O& i0 I0 U# E$ M6 |m=0;$ g( T! _$ z Z! M) w2 X1 R
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];
/ h8 u( W& Y2 H3 b- h3 t1 {" T7 at=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];( Y! o8 S* s+ D+ ?8 j; T0 V6 o% L5 z
%*************************************
( o, q5 Y/ a( R! q%利用 pdepe 求解
. f! e/ x% A, ]- |. @%*************************************) P' h" m/ `; r5 P: s' E) { i
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);$ U: j' ~. i# I- u$ @- ^6 F& S
u1=sol(:,:,1); %第一个状态之数值解输出9 ^! x/ d; E3 ~. m- I
u2=sol(:,:,2); %第二个状态之数值解输出
- K x9 b; l7 R) }2 t$ L%*************************************
1 L+ G# }4 h/ L%绘图输出
$ G% K; y; J) C5 f H) f: I%*************************************
2 F/ H4 z8 ?5 t9 G* F- Pfigure(1)
* ^! K! a$ A& n' g5 Ssurf(x,t,u1)
: k: o3 E1 |9 ~( G; Q, ltitle('u1 之数值解')8 \* ~, r" f7 `, u/ T0 B3 A
xlabel('x')! V; Z9 _% i1 h
ylabel('t')
+ w7 j- g4 [0 M5 R/ `5 g%8 d& Q i5 |* P) |0 C
figure(2)4 K$ i- M- t2 V3 n8 M' `% C$ y
surf(x,t,u2)1 I5 W/ A g8 L; g; Q4 e8 i
title('u2 之数值解')
8 d' l# H3 B; _7 q7 a2 m5 E9 Ixlabel('x')
; i$ y7 p) F3 h' m0 Cylabel('t')
6 Q. s5 u% {" y%***************************************" d1 t6 }. P- U( e! _% }6 e
%pde 函数
- o# H1 K) o5 O' ?+ V+ R1 ?%***************************************3 c& D, Q; u, O" D6 M: k, T
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)8 J) n8 j# d6 E$ \0 Y
c=[1 1]';
3 v6 @( ^, k! ~* H1 X0 ^ bf=[0.024 0.170]'.*dudx;* W- O, C1 w- z7 t; \8 F
y=u(1)-u(2);
& t+ Z: W9 }8 ^0 c2 L- i" lF=exp(5.73*y)-exp(-11.47*y);
" O7 L% u) H: Ps=[-F F]';
# R6 b& ?& Z- G%****************************************7 X, I! Q- e. D$ A
%初始条件函数; H3 k7 O& l5 D& [/ u
%****************************************
0 i1 c# R O6 J8 m. _function u0=ex20_2ic(x)
! X- g1 ^" i% i) L5 du0=[1 0]';
$ \+ n5 v3 b7 B9 f# d%****************************************8 a C- H' J0 |+ \; G
%边界条件函数
l0 Y2 J7 m* B+ |( a% `%****************************************; G: E6 c, c _% w% ]5 q+ o3 T
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t), x+ F$ G: \$ q3 x- x1 ]
pl=[0 ul(2)]';
* q0 N: Y: {' c/ r. _ql=[1 0]';
! m( @9 Z* e, |8 X* vpr=[ur(1)-1 0]';
$ P9 i$ P2 }- t1 M1 Pqr=[0 1]';
3 K8 y; B, e) N+ `3 p# f, I1 t2 @1 |, Q
————————————————/ |7 v( H" P( b
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 e. ^- f7 i/ T( \原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692# ^0 e: [4 K) E4 v8 @: Q R) ]( ?
; v3 A7 @* Q; F" Q
! G o) y: V1 w# z |