|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() & B" ], J& O" c
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
2 [; c$ _" ]- x sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
, W1 G; L# S0 V D
# {. C2 N) y* _7 g7 p- |& e![]()
+ {) q$ r+ e5 S* k; ]8 ~9 I" `! P6 x: _/ o0 V$ ~$ y( [ P
- ^( I% }% N2 Z5 Q
注:9 X9 M4 H+ a1 }" g% Q- H2 w. b
7 M8 R9 \" ^$ v+ |. J
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。! r- x9 @* b7 [) V
$ A; y- d4 H: R) S
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。& {: z* W# V P5 u L. \
: L- v! n( e1 x7 I8 Q3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。# ~/ R1 s1 s3 ^6 x8 K' M5 x+ e* J7 [8 K
+ W3 @' e2 ^. R* c' v4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:% K! G" p+ X3 k: k- b
2 p$ z& r' h* m1 j% c I( G
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)# R2 ]5 x3 ^; h5 v% K! |
- P) D$ @6 M8 X) ?$ t% e. i: M5 D
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
6 o: Y3 W7 D+ j
. A" h9 K' K# ` 7 @5 ~' p0 d7 D9 D
2 a& M' p" a+ ^- p+ i7 m; X
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.7 B+ m6 i. r3 w4 t$ O+ U! h6 r
& W) b! Q) i; z5 [3 H以下将以数个例子,详细说明 pdepe 的用法。
( p. ]+ E( W& N' Z( G* ~6 \1 D5 i0 a; n' ?) s
3.2 求解一维偏微分方程
Y" o) A& Z) L- p1 \例 2 试解以下之偏微分方程式 W& o9 i, R- N# \' M; {
% v ^, a9 z( J/ z4 ?# O8 A9 `) d: B
![]()
9 [, h' ^7 N* h7 y+ i( w/ q
& j5 l& X& y; l3 A. D解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
$ [9 f; Z; N9 Z% P
4 o4 N3 M, g% F N0 Z步骤 1 将欲求解的偏微分方程改写成如式的标准式。
! p/ Z6 I, W7 V: t3 f0 g- N4 f( C; h. |. z/ c
![]()
& u$ J% @+ a0 W& H! q* p+ t# w3 |' D8 E+ ]$ n
步骤 2 编写偏微分方程的系数向量函数。5 Q% N/ x: r- ?& l
O! n. @* ]! i% X* D
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
& o# S3 t) L( K! H1 yc=pi^2;
9 o( n/ j9 C& u5 T. e# a* ?1 qf=dudx;
: a. B5 q* K0 _4 w; _, K; Xs=0;
4 V7 ~6 X. Z1 b" A' u; b8 }7 @- K; j0 ?/ b1 _$ K# l/ n
3 S) C7 L4 N8 E$ z1 W; q8 R8 h0 g& a0 _6 t& P8 R4 p
步骤 3 编写起始值条件。
^9 t* Q3 J3 z' d$ d$ e: F5 |: F: J6 q. k( T% g
function u0=ex20_1ic(x)
7 a( F, X* X# [8 Cu0=sin(pi*x);( v. m2 d3 y! [" T6 B7 _
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
* a. ?8 S2 g# c/ |* S, f# P0 efunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
/ V: b d, n ppl=ul;7 t/ D4 _1 x4 Q0 \4 T
ql=0;$ M& n" w9 r% b6 A3 ~
pr=pi*exp(-t);
4 C& U" |7 x7 N: o, r; oqr=1;
( U7 Q0 s( Q; Q$ Y; B$ E! U; b- j( W9 C
7 G) x9 Z4 v4 y; c h" F, W步骤 5 取点。例如
' a: D" j7 s# C! A) O& ?! x5 D# k
" {/ I1 M% u5 a: y2 K; ^8 j3 J+ S4 u. c/ r, Y- w3 K
x=linspace(0,1,20); %x 取 20 点
/ ?0 k, I9 v* gt=linspace(0,2,5); %时间取 5 点输出
8 ?) u, Q# W! ?! g1 [, H( J& y3 k/ _- C, b- W) @
9 x/ Y0 M3 O* Q
步骤 6 利用 pdepe 求解。( ?/ ^& J3 R) Z! E- Y a
' m$ A' |: x1 H0 ^' c; u
m=0; %依步骤 1 之结果0 O9 @/ l* w f8 O- t) b6 q6 D
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
& _/ a& B7 ?9 t: N9 E8 x. I, i* F. E& e" u
V& O3 l: y: G/ q, y
步骤 7 显示结果。6 _9 s" t1 o% e1 u" S
: C# b' }4 y9 _$ r, E2 P
u=sol(:,:,1);6 r1 ^. ~) o- r2 l" j0 H
surf(x,t,u)
1 U/ U- n) C# k1 @title('pde 数值解')- @) @0 P3 a0 p/ B) [# T, N0 P
xlabel('位置')
" z& v" ]2 J# F, X! `" }ylabel('时间' )- Q" ]" \+ y* i% k: t
zlabel('u')
6 l. ^+ F6 p# y$ b( V3 s9 I+ c4 a% ?- @ P8 ]
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):# n. x" E( t9 s4 P! \% u* J$ {" T
, Z: B- d/ ]+ L( \
figure(2); %绘成图 2
a% f7 T ?$ N' N$ T# DM=length(t); %取终点时间的下标 L# `: m1 Y0 G. x* ^: F; B
xout=linspace(0,1,100); %输出点位置
+ p( C& s5 b, o6 m[uout,dudx]=pdeval(m,x,u(M, ,xout);" x# O; C6 c7 Q' k$ B- x
plot(xout,uout); %绘图
+ p) v) U% q% U5 x9 X9 stitle('时间为 2 时,各位置下的解')
' q! N5 S1 `& ^, ?( z- a; A9 nxlabel('x')8 S" V2 T6 [ b& a$ ?
ylabel('u') : A" X+ G1 H" f4 W y6 ?
* U& K* b( N; d4 }9 n
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下2 h; v- r! e$ N u
/ I$ ?; E" H hfunction ex20_1
9 i1 ^* Y# {5 A0 B%************************************ ?* }! Q' ^ M' g8 T, ~. l# i
%求解一维热传导偏微分方程的一个综合函数程序
! _$ h( b. {# P3 ^) K. H%************************************6 T; |0 n, ]1 l6 `' K+ s
m=0;* \/ A- C* _) M, d8 I% s# s6 N
x=linspace(0,1,20); %xmesh
: |: a) R0 S' _& i# l" \t=linspace(0,2,20); %tspan, G7 u: C Z1 e+ x$ F3 H
%************
5 a I$ H v. w3 Q2 {6 g- k, c) n%以 pde 求解
6 }! e# W* i$ Z* k, @- }%************
" l/ b' b9 R. P7 asol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
1 G) z3 l) k) t+ Ru=sol(:,:,1); %取出答案0 m- e/ V8 _& P n3 U& B
%************
# }) y( F3 J3 D3 p8 X- V' b%绘图输出
: K$ o1 I0 Z0 I P( _1 W; ^ y%************
* \/ T6 d! v/ O) [, Kfigure(1)
" [5 s4 r% ~1 D1 D% ?" c* Hsurf(x,t,u)
7 J3 G9 _5 ?( ^title('pde 数值解')- I3 ?# x5 S4 `+ x( F5 J" Z8 I7 k
xlabel('位置 x')
0 J* ~9 ?# Q ?0 _7 @" S! i2 nylabel('时间 t' ). @' T, H. [; S$ Y( y0 x
zlabel('数值解 u')6 H: F4 h) f0 ]9 Z; E
%*************
0 k: C4 |/ M7 R; @%与解析解做比较% A7 t2 h: y: s- d
%*************0 E% H0 @/ B' z% s% ~! ?
figure(2)
% J3 g& S; Q3 D9 n+ W1 ]surf(x,t,exp(-t)'*sin(pi*x));8 e& c: o$ O" [( ~
title('解析解')+ S" C" s3 ?0 W+ U( Q0 f X, P
xlabel('位置 x')
$ R. {+ Y5 S# q& q hylabel('时间 t' )
' d/ t E3 h G2 e i5 g" }zlabel('数值解 u')
) m% c1 O- x. {8 e2 ` P, O( ?" `%*****************" ~5 g5 E& r4 k4 { z0 y
%t=tf=2 时各位置之解
/ i; W7 y7 Y; q3 c7 d+ X. K8 j%*****************8 c/ T* n4 ]4 {: o2 v2 G
figure(3)
$ g5 Y+ U) I$ CM=length(t); %取终点时间的下表. e" a! C; `# Q) M% F! F. m
xout=linspace(0,1,100); %输出点位置+ y. |, i4 l& D" }
[uout,dudx]=pdeval(m,x,u(M, ,xout);0 e: R( x' [0 t' l
plot(xout,uout); %绘图
0 L* C' X1 e/ J+ `6 A( Utitle('时间为 2 时,各位置下的解')6 L2 k! G6 h+ u, V9 p ?" \" M
xlabel('x')) J- h% T2 [% ?9 B( X
ylabel('u')& d7 X! Q% n( F8 M; F' ^$ V. g( h
%******************
- E8 F( j O0 |9 \7 D. M$ z: m& y# N%pde 函数
: o2 ?, Q& R( u% L0 P# G4 |! Y%******************
4 N! X- H: i- p* v' [- h Gfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx) X$ y& u6 v2 |, k* c
c=pi^2;
7 y1 p6 e7 Q% O1 L3 ]7 y$ K' Q7 T# af=dudx;
6 U% Q3 v+ J( O; fs=0;9 ?+ e q* `% i9 s: _6 v
%******************
- V: {2 B+ Z" W%初始条件函数9 {4 B( t; s! h0 M6 R6 T
%******************! h: r* s H/ w! H
function u0=ex20_1ic(x)
% c. C" Q0 F' u/ M% K* p- j t* Ju0=sin(pi*x);
" A# F$ Y( j$ U' K, C6 N9 C4 c' Z* N%******************
0 Z5 P0 |7 W# ^- v; O+ h%边界条件函数
5 t( g/ Z$ U( @1 x7 `3 E( _%******************5 b( c1 J" X2 Q# J
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
' d9 C2 ?# @! i8 H0 s9 ?, opl=ul;
7 V2 f- u7 o% xql=0;6 h) y# N# h, t" n+ T$ d) o
pr=pi*exp(-t);
2 y0 P9 N8 a* z: m m' O" X6 vqr=1;; a2 a2 e& I8 P, L# H" `
5 @) s( x* e- `) q
2 Y2 r/ U0 x2 _, C5 T- M
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() # u' \' S! v/ h
![]()
步骤 2:编写偏微分方程的系数向量函数
S# `8 W* w ?3 R. r' r# Mfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)
+ I1 f3 [3 \8 m/ l2 m, Tc=[1 1]';5 U$ o4 }$ k' X `* q; s
f=[0.024 0.170]'.*dudx;% O, z2 K' g9 n
y=u(1)-u(2);1 q7 K; X- X/ `5 S7 r, G8 |
F=exp(5.73*y)-exp(-11.47*y);* A% f" ~1 b1 p) G
s=[-F F]';
* ]+ E9 p' {" D: U5 i7 i
3 f+ I, O& l1 _6 S( y/ S/ J
0 d5 ]0 T. Y) D7 O- T步骤 3:编写初始条件函数
2 R: i- X# X& B
3 L# ]4 S3 u% _; G( z zfunction u0=ex20_2ic(x)9 b; z# j% r' i; E
u0=[1 0]';$ Q+ ~5 T: g9 K8 Y) f6 L
, Q: E) N8 h6 R
步骤 4:编写边界条件函数; j! s; }' t) L+ s1 ? s
. e: k" ~( j$ i8 K. W
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
. U: H7 p. J# f( b& L0 tpl=[0 ul(2)]';4 }; a, Y7 W$ Q
ql=[1 0]';
$ ]. y" x- ?' I* W$ J+ w6 upr=[ur(1)-1 0]';
5 O# y" m+ d8 f- q7 G9 qqr=[0 1]'; y" V: n n8 `2 \) M* e
. C2 Y, f) q& T1 S u
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
. m; T* |! J5 a; }. D9 a% t! r! ]' C/ m5 Y
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];
( z9 z# `0 L. B% a2 lt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; . I. c% c" z" y1 n; v" L c
: V$ v4 S) Y0 n5 i
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:% W, E1 C+ \ H% C
- l3 x' X- \2 ]function ex20_20 L. V6 |/ V; K' M" D$ P: q m, e i
%***************************************
6 \2 i; F3 h$ w/ W/ w%求解一维偏微分方程组的一个综合函数程序: d$ N n U5 @4 y2 C# \
%***************************************3 L. `# c; _! J* e
m=0;
/ K+ b- J- m+ S- J& Sx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];9 b" }# D( j0 z: `; @8 [
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
2 d- m/ U7 w0 F% M4 s! v%*************************************+ [2 o. j, R$ w( m: k
%利用 pdepe 求解
9 y. \% b: x0 d1 Q U6 Z+ ?) D0 m%*************************************( \: I) t. E3 i
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
# l' _/ Z: [5 D9 S6 _u1=sol(:,:,1); %第一个状态之数值解输出
( U4 ]' M, c1 c( L( u5 J3 x5 ku2=sol(:,:,2); %第二个状态之数值解输出; L& u% J/ M" _* k4 {
%*************************************$ } G) \) [) h* Q! Y
%绘图输出
+ E4 X' _) x+ r( D( q7 a- m7 Q% m7 A%*************************************1 [; i3 m3 R& D. r Q2 M$ [
figure(1)' e+ G2 P8 [, w( Z
surf(x,t,u1)
( _' H$ ^, X" P, ~; h/ Stitle('u1 之数值解')
+ j* h/ `" c( I+ w% o4 q- f3 V; z6 Kxlabel('x')
6 a4 r: J5 H; G. H+ zylabel('t')
: L1 F7 M# y2 p2 F) w e%# ?+ E, w% S5 n' O$ c& @3 L
figure(2)2 J& g8 H) g k2 g
surf(x,t,u2)% m$ J# W+ T0 M0 I! v+ y
title('u2 之数值解')
( d* I, s \. |( G" [+ b- nxlabel('x')' i' j* s+ }; b% k
ylabel('t')
3 y. d: Q" i( v. z# P%***************************************
% `/ O8 a- M; p%pde 函数
" @/ t1 O# r/ _$ h' e. M }, `. m%***************************************
4 U2 u+ n, F( O1 Z, P! Q3 dfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)5 Y0 \7 E% r1 u9 I. @# w
c=[1 1]';
0 n2 P9 k# B5 _ ?% af=[0.024 0.170]'.*dudx;
( r0 I& q# W; `* v1 T* G+ O1 c# [y=u(1)-u(2);, t3 t" H7 B0 C' F% H; ~0 D
F=exp(5.73*y)-exp(-11.47*y);1 u1 U7 \6 W$ e, h# S, J% D
s=[-F F]';
; m$ R2 l, x) w6 y! m0 T7 b%****************************************
, Q {9 q2 U2 q4 O%初始条件函数& c! G* _: f$ C# ?* x7 z' V8 [( p
%****************************************
8 G- A7 ~9 k$ [% d3 kfunction u0=ex20_2ic(x)2 T" O: C( B* f |% d ^, _
u0=[1 0]';7 Q* J% m6 l: W
%****************************************
3 B" @5 Z) |5 t% I! f# W' e4 ^5 z%边界条件函数; J0 X+ Q( a3 F1 V: x
%****************************************
* ?# X3 d6 F2 t7 }function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)( a2 A+ k6 s/ Z! A
pl=[0 ul(2)]';
N9 d; ~# i* h% D- u+ Dql=[1 0]';1 e1 d7 A/ ^, E( ]* p& L
pr=[ur(1)-1 0]';% s% k9 w. X8 B1 q E
qr=[0 1]';+ h* }6 s1 c$ a" M: e( Q. ?3 @
3 V, @3 g, S( t6 R9 _; N. e
————————————————
6 a" ^% m8 K& ?% i7 J版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 h" j J" P2 ?! d. e原文链接:https://blog.csdn.net/qq_29831163/article/details/897066925 l" ^2 W! u" g9 |5 z
4 X. o: a1 r9 \6 L0 a, W& K
; I9 D0 ~2 V/ X |