|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() * l! o7 Z/ q: E7 I0 E' b$ R
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下: 1 }/ O3 M; D/ z0 ]3 O
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
" {: h+ J# I. p1 U6 _3 z
+ J% f8 Q, s$ z![]()
3 ], K5 H6 P: X. R6 {) S, U
) n% u3 ^, \7 W' ~! S) d$ [) m r$ Z
注:; [) P# L6 J" S" @* A
7 W& o4 Z. k" O( m. u. K
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。9 m, F9 J7 M& \/ R4 V0 t/ N/ h. k$ E
% t$ k# n& R% N2 u: k
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
- S6 B. z% E' t+ O: @9 Z
. Y$ p8 T" Q" A$ s# M3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。' \9 ^4 A4 | ]& T5 c8 ~; X9 G. C
# x* x1 {8 O3 [& O& V. C6 C9 m6 v4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:% K- z$ Y$ k7 d( h0 B$ O# p
/ i# J' \, y/ [- M; q# o[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout). U* B7 W& A) `) P& n: Y
5 X8 H; I `+ N& [3 J J$ a
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。. {$ H/ W9 T$ |) j0 H
/ E# P, e; B$ g- Z
![]()
( j, Y# |6 e* d, I( j( ?; X( R- k
4 V! {& a! `0 i: C- O5 gref. 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.
( S+ ^) W1 R* G! G7 `$ r! b, z a8 b$ N" k* q t* Z
以下将以数个例子,详细说明 pdepe 的用法。. q( P+ z2 [! B9 _
5 J/ Z- K; j2 g' ~* e+ r4 |
3.2 求解一维偏微分方程1 H# D" m4 Z D5 R2 G# ?, I8 _4 s
例 2 试解以下之偏微分方程式6 v, ]4 _" l3 I1 ^! {5 t k! `
" U% ?. N* ]# H) E1 q, B ! U+ S7 H- b4 b
" x2 U; J- x5 t; m' A0 u! H9 Q( N
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
: }$ G1 U) i2 z7 C. |( R7 I/ C2 }9 ^! e% s p% A6 k; G+ N3 E3 H
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
+ R7 f5 p5 f+ D& k' R+ M
7 @8 z& B( q* R: L![]()
) c) p- z0 H0 h8 N; ?' h
6 T) @( t8 `) s: c# q1 ~; s步骤 2 编写偏微分方程的系数向量函数。4 J" |( m2 S5 f0 O6 t \# ^" g$ W2 i
4 m7 Y q! b/ V6 [1 v( G+ B$ B( i
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
. s4 m8 `0 v2 |6 `% xc=pi^2;
. `1 I" \* R' ]f=dudx;
5 z7 W6 g8 i: @% }0 y6 Os=0;
1 H2 d* D" E; O% d# A% [: T2 T% a/ ?* {: Z
- r( d+ d6 y1 D( p6 e( J
# \5 u! _6 E+ A1 A1 z7 E0 W步骤 3 编写起始值条件。
* a$ ^3 b6 t- ]
) r0 p1 L4 a" P6 J$ G- n2 |function u0=ex20_1ic(x)
: X5 S) ~/ M6 W+ S! ?u0=sin(pi*x);
$ p b$ H( T; F% e6 n ^/ Z& b步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
) n# S$ ]. u H/ l& F$ V6 \function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t). i3 V @7 v" B, A9 s% {4 Y. L
pl=ul;7 Y2 C ~3 S& e \
ql=0;
6 Q( F4 M+ ~0 ? E/ {pr=pi*exp(-t);
. G, R0 s( v% f: }, t4 Wqr=1; 5 p' L% ?4 N( B6 w) S' X/ K
d/ F2 R1 l6 q1 l- ^1 x% ?
" c1 d9 S- L. P0 L" O步骤 5 取点。例如
# A9 h( L1 g3 t) X
7 I5 ]1 J/ m2 }* ]( B3 r
; P9 W! u1 Z+ l3 c" O+ qx=linspace(0,1,20); %x 取 20 点
8 V; K8 z0 p \. wt=linspace(0,2,5); %时间取 5 点输出
0 u7 V5 P3 p% N. z0 A
J% B9 @' \% |
1 X% ?/ ^, }& @0 H1 F2 c步骤 6 利用 pdepe 求解。
/ k4 c! ^4 \# ~$ p V7 t4 W) s- \2 r. Y% i& d; e) k
m=0; %依步骤 1 之结果 h5 X u' O! Q$ a( C# T) {
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
- G4 @' T! V3 e& K' Z9 [- Y! q; ^. f, W5 {. p" v4 q: s9 A F& o: C
1 \2 e& U% C. f" M+ o" a& _0 u* C
步骤 7 显示结果。
8 A# w$ [2 m: ^9 h$ \/ X/ ^( z+ r! O+ m$ W7 _3 Q
u=sol(:,:,1);
0 f Z9 w. J6 q; @surf(x,t,u)% S5 i' c: R4 {/ y
title('pde 数值解')* _+ n5 O. p, r$ w: m; g, L- W- U% ?
xlabel('位置')' s: b! f. `$ k( ^9 i
ylabel('时间' )
$ }& }: E, [* Wzlabel('u')
0 M: G3 e- H4 s6 w B8 Z& n- b0 D+ d; G2 k4 h' Z1 A# Z+ @3 |
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):: K- q4 y" w! L( B& J4 W1 i' ~5 f* L
( d# I, m3 c1 e; P7 C' \
figure(2); %绘成图 2- ^* h. ~2 }8 `, z
M=length(t); %取终点时间的下标. Q* m1 V/ ~# U W, g8 z& u7 F! F
xout=linspace(0,1,100); %输出点位置
. @3 a+ y" M% `! [[uout,dudx]=pdeval(m,x,u(M, ,xout);5 Y j# O* ^' M9 h% Y: v9 E
plot(xout,uout); %绘图( B# @/ X2 J' A3 X9 w
title('时间为 2 时,各位置下的解')& c4 ~5 G3 `% G4 g' x/ J
xlabel('x')5 @. e1 D# n, m' {" R
ylabel('u')
! o2 r$ e7 I* `+ Y3 @' D9 s' P2 Z- F( t
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
0 T- {- V- p3 J# m3 N' |) Y1 t4 O+ g
function ex20_1$ @* T) X+ c. b4 B
%************************************
( k& e" F& U4 {% ~0 w+ T%求解一维热传导偏微分方程的一个综合函数程序
" J% k* e3 H& _7 |/ d8 x%************************************
% c/ r% ~8 P$ Jm=0;
$ F3 w* |* e, C/ L. Wx=linspace(0,1,20); %xmesh5 G% e% r2 v8 Q, T0 H0 T% N
t=linspace(0,2,20); %tspan
# i1 p) I% X$ d%************3 I1 t0 f; T1 _" V
%以 pde 求解
1 ~: y; t1 Y: q6 G5 a9 {+ @9 G%************
2 v$ r* O N2 U* W# q6 i8 @: A/ r6 Hsol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
7 J# r6 c* }$ o# B/ ku=sol(:,:,1); %取出答案3 o) n, O- @7 Q4 J2 J' y
%************
" h, e! i# p! P; }0 S%绘图输出9 A- S+ c7 @! d. v
%************" x \6 ~, e5 H( _( S8 Q
figure(1)0 ~* i5 B0 L6 e+ b
surf(x,t,u)
% H) a! |( R( o! @3 f2 b ititle('pde 数值解')* d0 c. C: J7 S/ F! V
xlabel('位置 x')% l# c3 m! A5 E5 Z5 V& Z6 f
ylabel('时间 t' )
6 f. p$ y0 ~4 w+ `$ _% k3 @% Bzlabel('数值解 u')
; Q4 N' o" O, @9 @# ?%*************; k9 P& \ N% r' N- S1 G; P; o
%与解析解做比较5 }0 D7 Q% v$ u3 T- u( b7 X7 Z
%*************
% a- v. `6 J3 h5 P8 g, K8 U1 Cfigure(2)
% L4 l) e* P, p) A. E4 w- K; hsurf(x,t,exp(-t)'*sin(pi*x));
( ?7 U& G, O+ K B: }: M0 Etitle('解析解')
% ^5 }3 Z$ d" e$ r' p) h/ Bxlabel('位置 x') n6 j, ^; k+ ]4 d; q5 k) H
ylabel('时间 t' )
/ N7 J4 X" I2 s4 u4 qzlabel('数值解 u')
1 H: ?- f# f7 a6 U" A A$ [( g%*****************, [0 Y% y6 l2 c9 m8 Y6 {. @
%t=tf=2 时各位置之解/ q5 f" b; k' I$ J# ~0 i
%*****************/ R1 p' B/ e1 c5 \$ E8 |: G
figure(3)" b- }# d6 I3 `" r8 S1 D2 u }
M=length(t); %取终点时间的下表9 H# t/ p/ w% Q8 q! Z. s
xout=linspace(0,1,100); %输出点位置' @* P8 `4 c( v6 M( A
[uout,dudx]=pdeval(m,x,u(M, ,xout);
3 t8 v$ r, l4 ]% xplot(xout,uout); %绘图
+ ^3 o$ B; U$ v# F9 q* Ftitle('时间为 2 时,各位置下的解')2 t' ~" e ]0 h; e' r
xlabel('x')* k& {- q# y! `' h# m( h
ylabel('u')' a" B, A2 G* q' w
%******************
|9 P3 n7 s7 O7 C6 J; K+ [%pde 函数
4 b" T$ ^( |% R/ q Z%******************: A; f9 q3 c# F, d- y5 N
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)! m3 |! R4 J/ N+ V
c=pi^2;
0 n5 x* z( Y' c& S" zf=dudx;
+ Z& O, u! ~2 x# r3 C0 ss=0;) Y6 ~3 ^. e) `9 ]8 A# B1 `4 u; l2 m
%******************
- S2 D' H& p9 S+ s! Q" }0 A7 P/ Y%初始条件函数
& c; K: d; U" ]$ @4 Q%******************
I$ Z' \" X( X) Q1 u a/ Lfunction u0=ex20_1ic(x)5 m, G$ ?* z% w. F! U3 ~- ~4 t1 F) }& B
u0=sin(pi*x);* E6 E3 ^+ [# j9 C) o( B! g( ^7 S
%******************
: I+ M" F& ^+ P7 }2 s' m%边界条件函数
' L: q; k. ?+ j8 r4 H0 D%******************
( A7 J7 r( y+ y/ Bfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
' ~ x/ ^+ Q& q* i2 |+ [pl=ul;
* ]! I! P3 X/ ?ql=0;# [" N' _7 q7 \
pr=pi*exp(-t);" i2 s9 ^- Z, k/ l! r: U( a
qr=1;; ]4 o2 B4 B4 p0 z9 ]) n0 h
( |* K/ I& d/ d6 k- J" o0 H6 }
0 h' S9 a+ Z4 S y6 |: C) d例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
( G& c; t# m0 h) t- Z![]()
步骤 2:编写偏微分方程的系数向量函数
7 X" S! N r; s0 C0 wfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)$ O' Q, k/ ~4 t; \ ~
c=[1 1]';+ {5 \' D8 B" _
f=[0.024 0.170]'.*dudx;& Z# c) o0 |. C0 @7 ^$ K
y=u(1)-u(2);
3 M- n+ A k2 v9 p3 L# n+ C7 w' pF=exp(5.73*y)-exp(-11.47*y);
4 J* h6 P) S4 Z. Ts=[-F F]';7 J# R+ a7 s" J( T* s; G
8 _& ]( ^: }3 @
* d6 y$ T p$ K- m% Y9 h* a步骤 3:编写初始条件函数
4 g4 e/ i- ^- g+ |
( g w2 \+ _. O$ U0 j3 C) M9 j: ~5 zfunction u0=ex20_2ic(x)
, n9 B9 |" M8 x; i8 r/ F0 ~u0=[1 0]';
" a7 x* O1 g1 X
# N5 G1 O5 `9 ]) U. B5 L0 P; e步骤 4:编写边界条件函数" D' p6 ?- s3 [7 J" J4 s( V. s3 e
( g7 V" M4 g. y9 o- ?5 Y
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
9 H/ S$ q% O. i% ]2 Bpl=[0 ul(2)]';. ~* i1 k6 }/ m4 _7 U( v
ql=[1 0]';0 b# M5 L0 s4 ~6 x4 g
pr=[ur(1)-1 0]';0 B5 `" {( B% E2 N, D/ u* {" D
qr=[0 1]'; ' y. W* r3 m* u5 z! l
. D; M8 g" |% _步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,8 {4 u5 H2 D# e& W
5 @# P. {1 V# b% z0 k% Ux=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];* j x" U9 T8 I3 c, |
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
: p6 d* V: C! H1 D4 t$ ?4 t/ k' Z/ |1 a+ m
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下: U6 o3 ]% q+ M& @3 G
0 Y2 o8 g3 ^/ l# [* R
function ex20_2
6 N' Y( b! I: i# u# U0 t h%***************************************
% y" Y; w6 p9 ?! D& h: e%求解一维偏微分方程组的一个综合函数程序
( s6 q3 L1 a) T%***************************************
! a1 I o$ \5 m3 \; z7 H: M- Lm=0;' H9 R* B* V; C$ E3 b
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];
3 B( v8 q% i. Pt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];' Z4 _$ V: n2 ?7 `6 @+ y+ c' c
%*************************************
/ B7 K4 e' B0 z. f6 [$ h f) N%利用 pdepe 求解# x, u& t4 j! B
%*************************************1 h- ?- f! s1 j! \
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
! Q' O+ e- e/ G; Cu1=sol(:,:,1); %第一个状态之数值解输出: w4 M q9 h' B) \. x+ A; g0 u
u2=sol(:,:,2); %第二个状态之数值解输出
5 c% z5 b/ _" p# t* o# u) x%*************************************
1 D" ` g' q5 R3 Z6 e%绘图输出
/ L/ {: Z, W' C, c1 R%*************************************
1 B$ N, ]8 {' ^- a4 ufigure(1)
) [/ N% e& d- ]; qsurf(x,t,u1)
6 g* b3 O5 i2 F$ S& D' q( w1 J, }title('u1 之数值解')
8 F. t7 g) P* uxlabel('x')
) w* q: s5 X& f: B* V$ `( [ylabel('t') a3 s2 ^7 f, @4 U* \
%
% M1 F. O1 H; ^; mfigure(2)) k- c6 t: Q* @: a
surf(x,t,u2); w3 t/ j. B- X. L! R: x
title('u2 之数值解')
& m& k: D6 z0 [7 H% Zxlabel('x')
! \, g5 }; F) ~5 H! uylabel('t')
~; R% i( B' m& u6 V( v%***************************************
7 h1 ^* |. k; j%pde 函数+ x7 B J! a7 A6 o
%***************************************+ ]' O% H3 u0 L' ^' H
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)5 S/ O' g* v, S
c=[1 1]';' Z" f* K3 j/ Y& G
f=[0.024 0.170]'.*dudx;
9 Y4 I- w6 N' N. gy=u(1)-u(2);; ]% `* j8 h$ f) m/ T- _! t* ^) f
F=exp(5.73*y)-exp(-11.47*y);0 B9 [7 u$ {. @& l! Q$ |
s=[-F F]';
. M; K, n" G W( k%****************************************
* k& N8 A1 X9 i8 T%初始条件函数
% f H4 G& ]6 o1 g9 b%****************************************
/ K2 ^, ]: m, K J wfunction u0=ex20_2ic(x)% r# `7 K; x0 I6 ^$ k5 {/ [
u0=[1 0]';7 g+ |" I% p/ b/ |6 o& R5 E
%****************************************3 l7 p! v( f' K! q" l
%边界条件函数
' P" ]; T; W$ ?9 A%****************************************
% i2 v/ D+ L9 P6 k+ o3 m s* |function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)# Z- e" A* R* _) K! w' v
pl=[0 ul(2)]';3 i# Y3 R% V9 W/ T
ql=[1 0]';
9 _1 P7 w" V7 s5 xpr=[ur(1)-1 0]';' n/ R. A0 r7 z$ ]
qr=[0 1]';# c( i6 l) Z, ^6 u x
+ g- P( p, i$ I8 p( o% h% t
————————————————- ]' W/ n; p( ~; S$ H- t
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& n9 K* Z2 w9 ?' Q8 S6 y4 F
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
- p! ~, R# H8 X/ N
& z; t8 ~9 j2 p* n* X. W) a: _9 D! Z K( E( P( R+ P {
|