|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
+ A& s) q$ j8 P) \9 A7 J' i其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下: 0 l, S4 }; v9 f2 J3 O4 i3 m5 j3 l/ I
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)1 k6 t9 M2 Q W9 P) q
9 ?4 v3 X* w5 Q# \& d
; v1 X9 X4 B2 P/ K7 h* |2 W
6 Q! K& T9 u2 d; n
! }( w9 G4 G" \+ f s+ T& @注:
2 r, U) m0 }9 T- k1 T& t6 A: Z7 l+ S
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
! f$ P( b0 E3 l7 s
, C/ ~$ n$ B" {2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
* Z6 E U0 k" ]9 d2 m" J& t
! e: o+ h. F' K3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。- I S# L4 a4 G9 w9 H
% @2 U! r. X6 n. d, H2 R4 ^' h
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:- l4 Y0 V' ]6 c" H
3 k5 H. a7 j9 S$ D; j" C' i- K[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout). ^% ]0 ]# \2 B8 C: j2 k
, k8 Y7 {. l& n; c其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。* W; L7 U$ i" A0 H, u5 x
' r9 ?1 O% O; K; J6 k* m![]()
2 W+ h: ?. C5 L' v5 X0 c5 f2 I7 g0 R
7 D5 u: {& L ~" Qref. 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.0 C% T- ~& [' Y2 {" |; |. y7 a2 C
3 x* q% q8 h3 i6 d& u1 K以下将以数个例子,详细说明 pdepe 的用法。+ _) V& K5 i% ?$ O
8 _: S8 l: d# C* ~4 N, k* K
3.2 求解一维偏微分方程% s2 C- E( w4 K! q/ x* C9 b) X. s) v
例 2 试解以下之偏微分方程式" v3 l) q/ m2 A& e+ V
& H" l0 s5 n9 u' Y3 o
![]()
9 l' _- \* J. q; P/ h: b3 d# W3 V. x% ^. d, c
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。) B) S; ] x; f" H7 L$ R+ l2 U) L
0 o# F( U! h# e% g8 V N: U
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
1 Z0 ~0 y; a) m: f
8 W+ h. g/ `) @5 c$ N/ z: R. ]: a# U![]()
1 I; ^/ b7 W0 M% X0 Z; L+ s4 `0 [4 `: n
步骤 2 编写偏微分方程的系数向量函数。
/ q0 X1 @+ x5 y3 f3 Y: S6 R1 @ S& y8 X5 w8 I8 U
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
9 m9 H0 P9 f9 X2 W. C8 Rc=pi^2;
+ w& B! {% F/ {, y8 e8 `4 Y, jf=dudx;
, U( b3 f* h w# c zs=0;7 B% u: J4 H% l* f& V1 b
4 ~: e& X2 N( a4 \
% z, s0 M2 n$ R/ ^! K {6 ]% U4 p$ G
步骤 3 编写起始值条件。
& V9 V+ A0 I! [( p, m1 @
. ?5 \# V- N/ J6 r' Qfunction u0=ex20_1ic(x)
4 I s/ \/ C; P7 A! F4 nu0=sin(pi*x);
# Y1 n( q$ F0 ^; ^ P1 P% K7 m! {步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 8 S; e% ~) q3 |8 i% P9 K
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
. R& B( S$ O; wpl=ul;
: d8 `% M" v% p e+ Yql=0;% R' \+ s8 n2 e2 t0 U
pr=pi*exp(-t);
6 h, O5 O3 l' v) rqr=1; + d/ F7 }$ c7 p7 W0 @
( Q |9 m' s" j5 N
1 H/ M g6 R4 e8 A r/ m6 x步骤 5 取点。例如
3 C6 w8 l5 O1 O4 z, p
+ R$ U$ I$ y" t4 v8 i' s$ Q+ ?
+ o- J! w* l" D+ M- Px=linspace(0,1,20); %x 取 20 点
7 S* V5 w, ?( L( y4 l1 X( t7 at=linspace(0,2,5); %时间取 5 点输出
. b- c; q9 @) _) g1 W
/ ^; z3 C2 m* y$ R3 r: F ?, S& _' v( ^3 [0 _& r D
步骤 6 利用 pdepe 求解。- X6 I& W) I5 j: X x- |: {% U
$ E% K) A# ?" t. u! P3 j1 l( f& c3 i6 lm=0; %依步骤 1 之结果& ?; o& [( Z6 P5 J
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); 4 K7 h% c1 Y" ~; s) h/ I4 b8 U
/ v/ E8 x9 h. k% R7 M
( J7 r# n- B: D. Q9 A( D步骤 7 显示结果。9 ~: G% |; t @' n& w; y! I9 n
- b1 ]9 U5 s5 {8 f* Vu=sol(:,:,1);
- E' r, d' I5 ]" c! C0 v( I, Gsurf(x,t,u)
0 c) Z7 @. b5 Z% g' mtitle('pde 数值解')
; s) I+ e( f# ]1 ]xlabel('位置')
5 ^" M+ y2 h6 B/ M: S- l# g0 a2 uylabel('时间' )4 u/ [ v. N# ]
zlabel('u')/ y8 N5 r& D4 y1 Y
7 T& `9 V, v$ Y. z0 F v. c
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
6 X- s$ K* p2 j
8 y* _3 `" ?1 W- Hfigure(2); %绘成图 2( n( {$ p& Q# [$ @' h3 G( E0 w
M=length(t); %取终点时间的下标3 p' d& R# B1 X, y$ T! K! ]" t- M! @
xout=linspace(0,1,100); %输出点位置
; U1 K1 x/ U4 T' e1 P. L& a[uout,dudx]=pdeval(m,x,u(M, ,xout);
8 H6 g0 F! b b% _# Z5 xplot(xout,uout); %绘图
9 S6 M4 c+ }, a. }, n) Atitle('时间为 2 时,各位置下的解')
8 ?$ d1 K8 |, v% K1 Axlabel('x')
# l: q- F% W: Fylabel('u') 3 E* Z o9 q& v- s6 h0 S/ I# `
4 `; }/ ?! u# l
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下5 b& o6 P- N& @
; ?4 @/ a! {; w9 ^5 m, x9 \ W( X1 E7 a
function ex20_1' s; h" R j5 v! m
%************************************
8 h2 Y/ L0 n3 l9 W0 b, i%求解一维热传导偏微分方程的一个综合函数程序
7 A# H; i0 {( \2 ^%************************************" k5 j- Y& g* ^5 @0 H5 J
m=0;& d# ]( {; k; t) s3 d3 G* P
x=linspace(0,1,20); %xmesh! x' s$ P0 a( |2 N6 r
t=linspace(0,2,20); %tspan5 ^, q6 S! j, b0 K: m' o* V4 [
%************9 t- S$ q4 s% j$ _
%以 pde 求解! D& l& `9 A5 f7 r# l0 a) M
%************6 a6 w5 i$ U8 T; j. X
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
8 H$ r( Q* z& h+ Tu=sol(:,:,1); %取出答案) X9 x8 n0 H& i: d$ a! v
%************
% \4 m# \! c" ?: v$ b0 y%绘图输出
5 t) b* a& Y6 \+ }# I%************1 k( \% v* ], M2 c
figure(1)
) F' d: o$ D% Fsurf(x,t,u)
+ D3 H2 [2 c8 F4 vtitle('pde 数值解')+ g1 z+ P* {9 v$ I; e
xlabel('位置 x')4 F0 d7 f& H- F( }1 @0 G
ylabel('时间 t' )
0 {' O; u5 l; j& Yzlabel('数值解 u'): a$ y& N+ R0 j1 O
%*************
+ H8 d& S. T0 M' r& B/ a7 @%与解析解做比较
( ~9 D) r7 t. V7 z# [+ F. K2 D%*************% m/ h( {4 F1 U/ U
figure(2)
5 m1 N6 N: @' Tsurf(x,t,exp(-t)'*sin(pi*x));3 S4 a& K0 U+ C: g1 x' H O
title('解析解')
9 \- [% C% d$ _) mxlabel('位置 x')- U; G: O b) ?* G, `0 l7 S
ylabel('时间 t' )
1 w& N6 I0 U$ U+ qzlabel('数值解 u')
4 ?; y; h& H: P$ r3 ^7 D. e+ r%*****************
5 c9 h( @4 C& g6 I8 C%t=tf=2 时各位置之解; ?4 z3 T6 t! m, N" d" e$ ^( i
%*****************% m0 r: V" g4 \2 i- X4 a
figure(3)' `; |' e! P$ \% X7 _
M=length(t); %取终点时间的下表9 e- L, H) n7 c6 B. S$ d
xout=linspace(0,1,100); %输出点位置
+ @2 e9 ^7 s% [ {! v9 j[uout,dudx]=pdeval(m,x,u(M, ,xout);
. e$ O" a. g' e: c) Tplot(xout,uout); %绘图
! u$ `$ O4 X* Q* atitle('时间为 2 时,各位置下的解')1 V4 T) U6 ~! |3 d6 l( B
xlabel('x') b1 F$ x" x9 a/ F+ \* J; a
ylabel('u')0 P# o% r; |/ e) r: c; G# B
%******************3 O/ K5 J) b" Z0 V. i. Q
%pde 函数9 M& C3 l% ]/ _2 h4 N1 w% W
%******************9 Z* t0 i6 U' o Q( J/ e% p
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)3 G( a9 Q$ v% A0 F0 ~
c=pi^2;3 M- w" q7 q2 {: S; p/ c% K
f=dudx;
% Z. F6 v# n. u' X7 H& L& w$ Y! s) rs=0;
7 h; x: M( D3 f* \4 o3 w- i8 y%******************
# a- Y, f7 S* S7 x3 h%初始条件函数0 f; I2 W {9 @$ N
%******************
- F* L" p0 U7 u. t' `' Y( G4 _function u0=ex20_1ic(x)0 }6 n' m/ V X1 X& Y; P
u0=sin(pi*x);: H) r9 i$ G2 b5 M O5 W, E+ H5 W
%******************
2 k0 H- T8 G* r' f%边界条件函数* ^3 {; {) B+ \& {, E
%******************4 i" G, Q5 N+ r- v; n
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t) m$ W- }3 B9 S- u- H- x4 c
pl=ul;
9 f6 R4 X' j$ ?ql=0;
- h0 {% H1 m6 \* y- s/ ypr=pi*exp(-t);$ c7 o( H3 T3 T" k( Z3 \
qr=1;* |- E. e/ q3 |: S# F8 {% }
3 A8 u3 J7 [' {: f4 Q9 f) \) v% w% Z- J: u# b
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() 0 N7 ?& [3 X! b- w$ v/ y
![]()
步骤 2:编写偏微分方程的系数向量函数 + v0 L! P ?/ t/ I9 i8 \- w+ _
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
9 u5 T) Z- e5 Z2 o( Kc=[1 1]';
. E/ o+ b# W8 A# ?# \* ]$ Cf=[0.024 0.170]'.*dudx;
# u' q- X% H5 l8 w, W, Yy=u(1)-u(2);
* n+ F, l( ]. r0 eF=exp(5.73*y)-exp(-11.47*y);" I( g% B2 `+ }3 v% o, E& b2 V
s=[-F F]';6 C# b8 O! P% y1 ^7 e
7 A/ f6 A7 m, [3 `3 u2 z2 k5 E a/ R& T0 S0 D
步骤 3:编写初始条件函数* j: O @* P. j6 h% H9 S
# m5 J# d6 F" H
function u0=ex20_2ic(x)
+ G, Q" Z' W- k9 s5 Z }u0=[1 0]';* d- G# t7 v! h! X. F
$ z" G% p6 W4 g8 P8 a" H步骤 4:编写边界条件函数) O: l2 d0 A2 d& O2 @
: C4 K3 t' K/ N1 j+ _& rfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)3 D( |- C9 s Q; ~: e
pl=[0 ul(2)]';
/ e& L) X5 |- [7 A( G/ k/ {ql=[1 0]';4 d, o; M y/ x' C8 ~& q. j n
pr=[ur(1)-1 0]';
- D' P# X. B5 P2 l# ^qr=[0 1]'; 4 q5 C6 P- j& @" U* E9 ^
& C; M& N2 Q' \2 l9 H
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
# O+ P& v4 W) K
% h Y* o2 B. Gx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
1 }( Q6 M' q( V! l2 h2 yt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; 5 I: j( y% z! @4 M! p& |
/ D% `+ q1 J' Z/ N& }以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:# h8 U+ X1 k7 m
, Q: |5 ^+ m$ T& W9 ~( a T
function ex20_2) U% [: @* c- ~2 S5 k
%***************************************
3 |" @! r5 j0 ?% w%求解一维偏微分方程组的一个综合函数程序
3 w5 G8 Z( r3 }/ g3 ?4 F%***************************************6 m9 e% @( _8 I4 J
m=0;
' X1 ?. ~$ X, O1 G5 b7 ~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];; l& s. Q2 L" n L5 C
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
) p5 c+ Z# H/ |2 o9 [%************************************** O T% i& P, T4 l6 ]1 F4 J( ?
%利用 pdepe 求解+ \' L$ T4 x: \& e7 K1 |" n) z
%*************************************: p" {- g2 y8 J q C' D
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);% Y3 y0 _8 l* K) [2 t# Y) o' d$ d
u1=sol(:,:,1); %第一个状态之数值解输出
$ ?2 z: t1 a8 N8 C6 f8 n! ru2=sol(:,:,2); %第二个状态之数值解输出( f8 \/ M6 l& G0 z. L0 V9 W( r5 i
%*************************************& p9 n- W6 Z. G: [6 o% W' A
%绘图输出' X, |. e+ u- B9 |" Y. g4 ?
%*************************************- I, H3 I3 Y$ j
figure(1)
9 r8 v' l Y) Y1 }surf(x,t,u1)
4 v* s0 E [; ztitle('u1 之数值解')6 W- _2 s$ t- h7 f4 ^
xlabel('x')& D$ ^& S0 h2 [- l# j
ylabel('t')
" t* A8 l+ [3 `, n# B, M/ z%
' |. @' H. \" B2 ^* i# Xfigure(2)* h& s2 ?7 p4 |9 z' g/ s
surf(x,t,u2)
% ]4 r% [5 e* C$ J+ _7 A# Etitle('u2 之数值解'), n5 p% `4 f" g3 x ?4 c' y6 {$ }
xlabel('x')- }7 j y" r& H5 n8 E4 R
ylabel('t')
/ d( a. w6 @% F8 e5 l: u l%***************************************1 W- V6 v1 R, a9 L/ Y
%pde 函数3 a. _1 Y# x3 Y5 q" O6 Q9 j
%**************************************** Q+ V1 ~! n' q+ D- U' i4 @9 w
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)0 R- @ A# v" g5 C
c=[1 1]';
+ o* b9 B h: _. ^; v! \3 j2 Kf=[0.024 0.170]'.*dudx;
. A: X8 [/ u- x2 u9 Hy=u(1)-u(2);
) r8 E3 T7 a% o& g- Z7 TF=exp(5.73*y)-exp(-11.47*y);- {( U% \: f# x0 X# Y
s=[-F F]';
; W- H" t! a# a9 Z4 m8 S2 ?$ V( m%****************************************- T8 ^; I' F, x; S: Y3 q5 n' M$ j
%初始条件函数( `6 ]& w* ~- Q9 g& x3 `1 Z$ b
%**************************************** y p+ M+ M: s6 Q/ }
function u0=ex20_2ic(x)8 d2 _/ t5 h4 C. f2 g% u
u0=[1 0]'; N5 K: k, }% z1 q. S2 z
%****************************************5 x- {# z* d2 f$ o- H3 C6 h, R
%边界条件函数) g5 [- Y0 l3 E F: l6 S
%****************************************
% J: y4 Y( J, Z/ Yfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
3 j4 m4 o6 S4 t" y; n6 k# |pl=[0 ul(2)]';
! u8 g( P+ @- S+ Nql=[1 0]';; l6 x& ?& A8 U( }: i& ^# K4 z
pr=[ur(1)-1 0]'; K2 R- ~& S8 b/ q7 `/ S: a0 Q9 |3 T
qr=[0 1]';! p3 M* ?- P0 C" E
- K- S6 O* |+ }6 K+ T; U————————————————
9 w! f$ ?7 V$ G# l# [3 W版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 F+ v" K" g* E- q% N/ B( ]
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
; g0 ^9 Q4 J& w |5 Z& E4 z3 z3 ^
# a8 U0 L) }5 n. z |