|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
) Q4 r( `2 D# o5 a8 T" r其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
% i% H) p; k1 B7 X sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
6 I& c; W. h8 f5 j( R; E5 q0 f& {7 f
/ h/ R: R/ l8 D9 L! M
) L' o! D2 O% N8 R8 T6 F
" C) U7 h$ z" S( Z- w6 i) B6 y j
注:
/ I$ ]+ t$ W( x6 Y$ O2 r
G- G \) N5 h1 c1 p/ ^6 B1 m8 Z% t1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。* b0 B5 l3 N' K1 G
: L ?- e9 q1 E
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
7 B2 V8 @4 ]" U+ A0 g$ k" Z: O$ E5 ?/ `( J
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。! v8 ]+ U, R3 \
% \7 ^2 S1 h, I0 a- T
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:8 V7 I7 F; r1 A
8 M* K/ b" a, q" X[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout), `+ m( O* \/ j' v+ ^; n
. ^" k5 [& E# v5 c7 G
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。) ?8 g# s/ a; w# [
- h. o5 J8 \5 J& r
![]()
4 z5 P4 e9 T5 W: H& ]* x
4 O+ l# Z$ W1 d' w" 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.
7 S, j3 y% O. }7 s# d1 c- K6 v- U3 D
以下将以数个例子,详细说明 pdepe 的用法。$ @2 G5 d3 }5 [
8 g, p( t6 k$ U: E& w' k$ _1 T7 G8 n3.2 求解一维偏微分方程6 s2 K" r. e4 S& N. G7 v
例 2 试解以下之偏微分方程式
3 i% ^; A: D5 z, \/ T% K* P' y3 |
: G' O; X2 W4 f! z, x: N1 _8 f , I6 ~: h6 {9 D& C
. N8 s7 K. @3 R3 W解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。* ^' y8 s2 q+ E$ b% g4 U
+ v" S v0 D# {
步骤 1 将欲求解的偏微分方程改写成如式的标准式。0 u$ }* \, h* h( V& M
+ s8 u3 [* N) Z# F2 q( o" v
: K$ p6 o: j* g2 }% U
/ R( B/ ~3 N0 j5 X! K- f
步骤 2 编写偏微分方程的系数向量函数。
7 m1 K1 ^# m: h) K' J' a$ I) i9 g9 t. p9 u- P/ m. A- `: M
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
- \" Z: z9 B/ q; R0 N' t" M3 h: B, Wc=pi^2;
6 z0 m' e; p0 C2 S' g4 ]' Sf=dudx;1 H3 z5 Q* I/ R- G* J6 p& F
s=0;& M1 i/ e" H* H1 d' K
& p# [% U0 v$ C6 L
' F! S+ k' [8 v/ ~/ n4 h5 T
5 o* E; W. p' I: ?$ N步骤 3 编写起始值条件。! j+ O4 n; u0 s5 ] E
0 P7 S6 [% Y; f8 z% t: I
function u0=ex20_1ic(x)
/ V v+ |) W& K% G" wu0=sin(pi*x);
3 ]& g- t1 ^: y1 f; G7 G6 t7 w( s2 L0 D步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 3 ]% \( o+ P8 t1 G7 Y9 u
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
: \' e! f* j0 U2 ^0 b$ Ipl=ul; @* O( \9 K. e r( r p
ql=0;$ l1 D5 c! J9 c' Z9 m8 g
pr=pi*exp(-t);
, P3 T# e! K0 P7 X, uqr=1; 5 P R4 k( e+ g! T7 j( J
# j- X p/ G) s) E
7 p& Z8 i! O5 w
步骤 5 取点。例如5 B# j ^4 B" Q5 L2 B0 S1 @& T
+ \ H, Z& m3 ^* |$ M* B3 ?
4 k* Q3 `2 S3 e9 |% s+ W y
x=linspace(0,1,20); %x 取 20 点
$ k" g9 k {1 y0 Qt=linspace(0,2,5); %时间取 5 点输出( V0 o4 Y1 l7 l. x7 | c
2 ]3 C' j8 c/ L3 F6 i
( D5 ]" ^) m1 a$ i; M# J8 L步骤 6 利用 pdepe 求解。3 g6 N& S0 X( w( o" O" k
- h! h; N: d2 G6 x5 y
m=0; %依步骤 1 之结果$ a" F% B G7 |) G! Z
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
. G3 D" n: G! I" N1 [9 K
% W$ Q. a- a: O
! }; V; T F( B9 U. e) M6 c步骤 7 显示结果。8 o N% @3 @% j5 x6 Z
5 i y+ c0 x7 `9 i
u=sol(:,:,1);. g. }" m1 J& s, ~: N5 `7 g8 n
surf(x,t,u)! C" B/ c0 z8 ^; Y& [/ k
title('pde 数值解')6 R6 Z, ]" \* h. h& \/ T2 A' D
xlabel('位置')3 S! }; c! S% }; w6 [
ylabel('时间' )6 K& n- j- o% t" g
zlabel('u')
+ {7 P9 F4 o$ [- I. I6 J9 Y' Z2 z) v8 ~
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):/ {0 Q3 W& V+ B/ _# X! Y1 C
, u% o4 a h; j) W+ t9 u+ _' nfigure(2); %绘成图 2
, R/ Z, n' a1 Z* c1 E* o+ iM=length(t); %取终点时间的下标2 @1 B# G' z5 ?0 r! t
xout=linspace(0,1,100); %输出点位置
' h$ E) \/ w. y[uout,dudx]=pdeval(m,x,u(M, ,xout);7 R i! ? @- ?8 F |, q7 [/ }
plot(xout,uout); %绘图' U5 y, s6 `: k. {3 ?6 ?9 C
title('时间为 2 时,各位置下的解'). w5 Y1 }/ v* u. H2 F4 n
xlabel('x')
J" H: `- Z7 y8 ]/ W' g6 |ylabel('u') % D5 Q- n) O0 ^- W7 r
@- J& Q/ ]1 A4 @ X综合以上各步骤,可写成一个程序求解例 2。其参考程序如下. B6 H: E1 [$ Y( h: M
, B$ ~4 \ @9 d9 tfunction ex20_1
! n! h$ p. w8 z9 k0 q%************************************
8 m' u8 N: @. `5 ?9 W& Q%求解一维热传导偏微分方程的一个综合函数程序% u' E) }" X+ D) h. P U f
%************************************* s9 M& x4 E l; }& M
m=0;
5 p% L; H0 ]/ R: c. X! N1 i& g' z# \x=linspace(0,1,20); %xmesh8 E; p) A- k2 ~) @: h* Y
t=linspace(0,2,20); %tspan
0 A. q1 {# m0 B: y* _0 M# a%************
/ f/ @( b1 U( p4 `%以 pde 求解
/ y( Q6 d; T: U3 a* @! M%************
1 U+ `/ t+ L" }# f+ u: csol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);4 I4 |5 t" Z) u( P( ^' }
u=sol(:,:,1); %取出答案$ V# g, i. s2 E
%************
( [" j2 p" t. H5 F9 G%绘图输出
6 b, c! M$ |3 ?" x3 V: n8 y7 z$ N%************* I- X4 _% U7 A6 k
figure(1)
5 i7 a! i1 q; q& W& ]5 `2 t$ ysurf(x,t,u)
% `1 P) s- f( j/ Rtitle('pde 数值解')+ ]3 E4 e- u7 ~
xlabel('位置 x'), [7 R0 k1 Y2 U3 M8 Y. @4 n' w
ylabel('时间 t' ) S1 V" U3 n5 z$ x( Y
zlabel('数值解 u')
S5 n/ U/ M# M V7 p. a1 h%************** c5 G) ?* S1 G/ h, Z& ?
%与解析解做比较
; m7 Q) c* n& }* h, A: _5 x%*************
8 ~* s) V; _0 H$ s# I: dfigure(2)
) I. N- A- ~: c# lsurf(x,t,exp(-t)'*sin(pi*x));
) K5 B, C! O4 H& S# }' V% }0 [title('解析解')
. I( }+ e2 v3 O6 y/ R) A/ n! ~xlabel('位置 x'). ^+ i: o( H. H# v
ylabel('时间 t' )
( ^5 z9 p7 Y ?5 _: p6 |zlabel('数值解 u'): J `; o2 r% [2 j
%*****************! }" R: ]/ @( r8 ~
%t=tf=2 时各位置之解
9 i6 o' U. O# E3 x4 F4 {%*****************
* x% i) n! [3 I. u8 Qfigure(3)
8 f. s$ ~, `) @" n2 ~2 T; Z1 DM=length(t); %取终点时间的下表) k- t! c# v9 k
xout=linspace(0,1,100); %输出点位置
& m6 u9 k t6 m9 Z. ]9 t& k[uout,dudx]=pdeval(m,x,u(M, ,xout);
8 j* y/ b5 B9 ]# K9 B+ ^2 }7 s+ Fplot(xout,uout); %绘图
/ s8 o( E! d( dtitle('时间为 2 时,各位置下的解'). D* h3 ~ T3 c0 ~. R) K. x
xlabel('x')9 M3 f$ G$ x1 P2 ~% z
ylabel('u') S G' |9 ~9 S% J7 i' ]2 s
%******************
0 u6 z/ _$ w6 u+ l%pde 函数
7 @$ n7 p$ Z4 Y) }! d r! h" q- t%******************
' U4 `4 I# N9 y, ^2 E" m# \function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
; r6 r; Z$ Q/ J* a* `# {5 Jc=pi^2;" }. j* q4 x% T0 V
f=dudx;
$ j3 L5 }8 c- j7 e; w- fs=0;* {3 z- Y0 c$ h. L0 m7 g) r# R
%****************** ! J: }. r, g! i
%初始条件函数8 s E6 [/ z$ K( ]5 `. d
%******************6 n$ m" d$ B5 D8 z' e, @
function u0=ex20_1ic(x)1 R n, A- v2 v6 Z$ M. S" C9 m0 K) P
u0=sin(pi*x); \# _% z2 p6 j, f0 b
%******************8 V- O- S2 c |& C
%边界条件函数
( a: @/ G( L- X7 r1 ]7 B) u%******************, P, j" Z9 _. h8 d% f- O
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)$ ~9 F W* _6 c0 n6 p# l
pl=ul;0 r* h$ W- [" `" {; ~8 w
ql=0;' l/ c$ Y: V: A* z
pr=pi*exp(-t);2 T$ k% u/ C( X; i$ k
qr=1;
6 ]' t# S4 J7 X: D2 E0 S/ S
8 e0 G X) q- B+ m& B5 B( [% m+ ^# ]
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() & I' k+ }3 j- r0 D3 O U2 i
![]()
步骤 2:编写偏微分方程的系数向量函数 0 b( w9 F1 Z3 M1 J% N. T
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
# a# [1 s+ B5 O" C/ V( c* Gc=[1 1]';
. l6 W# M! L: b- Q7 m0 F' U( d1 a# Gf=[0.024 0.170]'.*dudx;
8 u C# {% S0 S3 C d3 h: |$ xy=u(1)-u(2);
! b4 k- T$ |7 W: j, j9 i1 ZF=exp(5.73*y)-exp(-11.47*y);+ V0 b% L2 @. |- e. j
s=[-F F]';# Z& O, ^/ F4 W7 Y
$ V8 U2 J( a, n/ X- r( }/ |
0 E" p0 s! D/ f步骤 3:编写初始条件函数
9 Q$ s8 O9 \ P/ e
4 }- A1 w+ o. {- p% e2 O2 k0 ?$ Yfunction u0=ex20_2ic(x)
9 j/ @. H% U" S& k6 \/ J# Yu0=[1 0]';' q2 n/ c' j6 ]! b8 {
9 P2 w- f- X5 ~; P* D) e' I- Y3 L
步骤 4:编写边界条件函数
" X6 b* @/ w. p6 t' T2 H) U+ _3 o2 A& b; R/ ]: u) w
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
0 y, y( f h4 b! Zpl=[0 ul(2)]';& ]) t- ~1 j K
ql=[1 0]';
, i) g; x7 H" ?" {; } dpr=[ur(1)-1 0]';% ^; Q0 {$ e. o& `; K) [9 ^- z
qr=[0 1]'; 2 r$ p& ]; {8 Q) ~( l# V
: p6 i- V' k8 \* [" n# O
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,, \) I+ k* `( E8 q2 z* a* t
: M0 N. x6 o H6 L) nx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];) q- }2 G. q% v* E
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; 1 Y8 a0 r# B0 H" G# ^! ~7 n5 }+ K
4 H& U/ |4 m/ p& R以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
9 [: N- Z% X$ o( I
: C; r1 E/ I% ifunction ex20_2, ~+ C# _5 m" }3 r% C% m
%***************************************
! T$ N; ?) x! ?, J' H%求解一维偏微分方程组的一个综合函数程序 S- A9 ]* q6 s. Z, ]5 y
%***************************************
' a6 Y% `/ j$ f: Pm=0;6 t) ^' j' z1 F: I
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];
) U5 y$ K* K% l& `7 O( s2 Z6 Et=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
3 Y8 B8 z* I' ^. n* c3 V3 Y%*************************************/ }* G7 B( ^. } M: d( a
%利用 pdepe 求解- |, v5 T! Y: d- @7 ^. V. {
%*************************************$ A5 V/ n- N; V: [2 n
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);! `$ d. }: d9 Q* y, |: A/ ^$ @: [
u1=sol(:,:,1); %第一个状态之数值解输出( |' d# Z7 W: _: @( h
u2=sol(:,:,2); %第二个状态之数值解输出* n. j' G, g3 a1 K' I
%*************************************( q7 Z" k2 P, u2 I
%绘图输出
+ W G, @# i# h$ E, i%*************************************
1 R, H( i! [. p6 | S: xfigure(1)
9 v% [# r0 w1 T% A& psurf(x,t,u1)
5 a9 P# e/ E' M: `title('u1 之数值解')
) x( q3 d. Q: B0 Vxlabel('x')
1 B, f/ r* X2 w) D2 t) h% Bylabel('t')
( l( U9 \/ l9 K' c t8 V1 I%- \9 Y* u' d4 k4 P; O/ j: J. U+ h3 D
figure(2)- n4 s3 B4 P; y) O) k# V+ R
surf(x,t,u2)* n! [2 ~; z) E" f% g
title('u2 之数值解'); v7 z. P5 ~+ j; v1 i! `- e
xlabel('x')9 n" x5 L4 A8 c v
ylabel('t')
" N0 a/ K3 V! b. U# e: s%***************************************
( I6 U7 }' K" e9 r%pde 函数
' A& W' z0 G7 [. z5 C& X( c%***************************************1 i2 W3 I0 b+ \
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
& `% d5 w$ T0 Hc=[1 1]';; d/ b+ `: J6 \* G' Z( r E& A: F
f=[0.024 0.170]'.*dudx;& T8 ^, E4 v. h# Q2 ~. v: F% }
y=u(1)-u(2);9 w3 t# p& m# W7 `- I' |
F=exp(5.73*y)-exp(-11.47*y);
0 v2 x. N. g4 j- n1 G0 `& k& ns=[-F F]';: R7 _5 C1 t1 g" s% N6 J; p7 d& t
%****************************************0 P; A8 m3 Q' @$ C; G$ ^
%初始条件函数
6 @* a6 _* U, W" }- R* R%****************************************( [% {8 N' \( O' x
function u0=ex20_2ic(x)
( ]# b/ Q0 H4 s; Wu0=[1 0]';# ^& n3 m. B2 d
%****************************************
' |* D2 U/ Q, y' y2 K0 E, z& q, I%边界条件函数
2 S; U0 Y3 Q) T+ b8 a%****************************************5 ^+ z3 Q6 L+ K9 P C: n
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)' R, \$ ~* ?: h6 Y. ]' Y+ _' Z
pl=[0 ul(2)]';
+ u4 P: F! k( Q( d' j5 nql=[1 0]';
& k) \3 N' X* n* e1 e0 Hpr=[ur(1)-1 0]';
8 z7 Q9 I2 b# ]. R; M$ I; mqr=[0 1]';
% Y2 R3 Q6 f1 A- Y9 m
' P# Y, i1 l B) `! S; }————————————————
3 W, k6 k* d8 F- x5 Q' Z- l! L; }$ g版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, j, `, W" l* ^% L" w原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
5 {2 p: S {. K6 F/ n- a8 t9 U- d" Y: H- D& v2 i
" t0 j/ B; f- }, M
|