|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() ) T7 m" q" ^6 X
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
; F- n2 J6 z. K8 G$ s sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)# N6 I+ A) G7 s4 G3 B" e
; H* ?3 J9 v# `8 n+ b: o![]()
4 d/ r; q3 A8 O0 W9 ~
& }$ k/ J3 E4 Z3 v' v8 u Y2 k+ v1 l- A
注:" F. J" P* t9 \! U" U
9 W$ Z& r f! k6 |' J- x2 M1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。- l7 Z3 O+ o& N) I" N6 h
3 R7 D, r+ a7 W8 W/ m* e/ V
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。# R+ |* l0 N H1 a- z" |- Y& S1 K
4 P: W) d$ z; u* r+ w4 a
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。% L. }0 Y: ~1 \4 ?& u
3 z1 i' m8 ?. R$ R, e
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:: Q6 z. U5 {( i! t, q& |/ W# F; W% |
+ H, s9 D# R8 P
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)$ W& C* {6 @: g6 H
* I( u7 F5 Z, k$ t8 V
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。" l. @8 |8 _; _* k
& S4 ]! M/ ^: u1 B h) b- [![]()
9 o- A6 Z4 _3 p& `1 d4 w$ a0 u! Z, [* t9 c" {1 l1 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.; I3 z4 w. A* X0 ^
/ J; ^$ @- F7 n1 b7 x
以下将以数个例子,详细说明 pdepe 的用法。- d1 l0 ]8 N/ T) v7 D M
& x$ c4 I( \- d5 f! u3 B" C3.2 求解一维偏微分方程8 h# K7 s! m1 ~, C
例 2 试解以下之偏微分方程式; T8 [1 o7 E1 W" n
, w: D L5 ]& R& Y' K
) S1 m% E" C6 G% x6 |% S k! G
. j( Y y3 `* J1 D6 P6 j解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。6 f c; l; K I) Y2 U) k6 u
9 S4 Z2 x+ ]$ |1 c/ t3 S# d
步骤 1 将欲求解的偏微分方程改写成如式的标准式。9 O: e9 |3 l$ k* N
* Q( }) }$ h C+ x0 w+ y" ^![]()
8 n) e2 T- }: _& u
; B; P9 U: Y$ u- Z. D步骤 2 编写偏微分方程的系数向量函数。( s% }$ A+ u, |- r
5 }$ D+ V; P# R# P* ~ H
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
& M: U$ T' L0 C' S# M1 Xc=pi^2;1 S: ~3 N9 n! _- W7 E
f=dudx;
6 X! Y: ]% b& O! [+ y5 G+ Zs=0;" u( U$ I7 E3 r7 s# n, G
+ J0 k7 n7 [' w; [9 e# X0 N, ~3 @1 D# U0 o1 [: I% m
! C5 P+ I1 I% \8 C. d
步骤 3 编写起始值条件。
$ J& C7 [9 g& m$ r+ C6 m
. \* N3 ~1 b5 N$ {; ~function u0=ex20_1ic(x)
% K- w4 I; W8 U* a( |- M: o- ru0=sin(pi*x);3 f/ _6 s5 m8 P
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
, V* u: f. Q. k ^function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)" c& O" v7 j9 m9 |" x) W; h; B
pl=ul;4 X- W' Y4 N7 R+ b% x
ql=0;
2 m7 T2 \: ~5 u. f( `* kpr=pi*exp(-t);
: k7 E! C$ i; V* K4 ^8 jqr=1; 3 ^: G1 l" n# ]) j
) m: O( a9 y/ S
$ p7 M6 I- c; v0 T
步骤 5 取点。例如
* o: [* C7 P3 A3 J3 I" [* D
& k! P8 [8 M1 a0 p2 B+ X" S1 G ^% O! _0 C
x=linspace(0,1,20); %x 取 20 点
+ [' \4 `, f" W, Y2 e! i2 Gt=linspace(0,2,5); %时间取 5 点输出. t7 o! y9 M( r/ m- H [
L) J' W3 E# n
( X+ j% O: [( m3 ]1 b0 g9 z: ?7 p
步骤 6 利用 pdepe 求解。
( i& i; d: R0 [! `) ?- `3 d, S! Q" [$ W
m=0; %依步骤 1 之结果
( |6 ~- X5 V! K# k- c* h) Usol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); & D5 G2 ? ~6 l4 }+ h& Q
3 c) P0 g: [$ t# O- t0 V& @" Y" N9 n' q( D
步骤 7 显示结果。
* e6 M* i! @+ L4 M3 f
; |& V, s8 }. a/ r+ O3 du=sol(:,:,1);: y" H0 ^2 z/ h- \7 _7 h6 U* J
surf(x,t,u)
4 F/ v% w4 a) j; h+ Ntitle('pde 数值解')6 S' g2 h! J h: b! Y
xlabel('位置')/ t: o$ Q# K3 m! i$ ]) J! I8 h) B
ylabel('时间' )" X+ N- y5 u- F* Z# q g( f
zlabel('u')
: ?$ A2 D- u% z8 W1 N+ V* {" b1 }+ K% n9 f- Y
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):0 E0 m- ~. O; g1 E3 a
, c2 W$ f S. ]. o8 E$ L" @
figure(2); %绘成图 2/ d" h* g s% d( u; d
M=length(t); %取终点时间的下标4 F. b% q& R r
xout=linspace(0,1,100); %输出点位置8 g) Q3 Z2 i( E4 Z% L) r$ _
[uout,dudx]=pdeval(m,x,u(M, ,xout);
( J9 c: l! F) }; W5 ^- {7 }plot(xout,uout); %绘图! p' y+ q. n; Z3 F9 q) Q
title('时间为 2 时,各位置下的解')
( s, p# J8 ?; J0 T0 _$ T& Nxlabel('x')8 Y2 _( }$ v. T/ g8 B% @7 ^
ylabel('u')
+ b3 m& N9 L/ b+ ^; C8 I( E
( n5 d y3 H# w4 z7 y/ e: U6 R: Q5 d! C综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
9 G6 d0 n% Q( V( k& M$ M$ Y* M' f, T5 v; c2 j& h
function ex20_10 D- b) e- _9 ~- C
%************************************
/ W, }4 s/ \% H1 R3 t0 n& K, e%求解一维热传导偏微分方程的一个综合函数程序* @ Y' c( R' W% ]
%************************************* `' s+ |0 w4 d
m=0;5 A5 c% i3 X" o/ T% y
x=linspace(0,1,20); %xmesh
L. B8 ~4 ], o6 S% at=linspace(0,2,20); %tspan* o3 H( B2 {! P7 z
%************
. K8 p$ [7 s' ?%以 pde 求解
9 [8 ^0 F) D9 b5 z& ?& b; l" H%************# x6 U, C# C' x( w5 m8 y
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
3 R9 d( l! c( [- Nu=sol(:,:,1); %取出答案5 y/ w, @" N/ {4 e
%************
* w; ~- G _' s2 ]) ]. {7 M7 r8 m%绘图输出
$ o& _2 d' [3 k$ r, M%************
a3 G2 t, i9 I: j' _! V( `) Wfigure(1)
7 }% U# _4 Q5 a- `4 wsurf(x,t,u)& j5 m4 `0 P! J, l+ x8 h0 e
title('pde 数值解')
% }5 V+ |- u7 G0 [" @) P$ Qxlabel('位置 x')# O+ p/ c# J' |
ylabel('时间 t' )
0 r* G4 n' N! ?4 m! t0 L) xzlabel('数值解 u')" T# ^. _8 @) ~; T, z: L1 M( \
%*************$ i. Y8 e" ?; Q& U: L
%与解析解做比较% K' z! O2 O& l- R( o
%*************
" S% q) n4 O' y+ E' mfigure(2)' `6 Q. q" H1 M
surf(x,t,exp(-t)'*sin(pi*x));
+ V. X# V$ q8 V% Y( |# {( Rtitle('解析解')' `8 n2 `' {! Q+ [* s
xlabel('位置 x')
5 O; {* C% J0 }ylabel('时间 t' )
% W8 [9 C/ x5 `& C7 Rzlabel('数值解 u')( v4 h n" y! X! N2 l& M% p
%*****************
2 W( m' |- | B# j3 ~3 D%t=tf=2 时各位置之解
: H1 e7 z+ Z W& d d( e7 ]; H5 T+ Q%*****************1 m4 a2 ^+ g0 B" H" q
figure(3), g) N+ [1 b! o, _9 [6 W9 ^
M=length(t); %取终点时间的下表 U0 Y! T, d9 L" m/ M4 ~' p# H
xout=linspace(0,1,100); %输出点位置
$ [! j6 h# D& t: ]0 s/ {[uout,dudx]=pdeval(m,x,u(M, ,xout);
7 v8 \* W s& e6 Z& y6 lplot(xout,uout); %绘图
' x0 p$ L' B$ g* \- p4 N- o9 U2 Rtitle('时间为 2 时,各位置下的解')/ e$ Y$ s7 G" Y: [- Q6 [3 T
xlabel('x')) a8 E, H. n+ i- B
ylabel('u')3 R7 m* ^! l6 F, }
%******************3 k+ }' E9 _* D: J
%pde 函数5 K9 w: Q9 t+ Q" [% X
%******************% O+ Y* w, s" ]+ ?( ^
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
8 z7 P/ L. c6 qc=pi^2;
x! t9 ]3 V0 U9 I! Y ]/ wf=dudx;7 t- M6 s0 c( J
s=0;3 P: @1 }% X! n9 o% E N+ ~; Q | g
%******************
7 d; K7 S% k( Z0 b* e3 N5 {" K8 M, e%初始条件函数& i6 Q0 s' h1 v
%******************
% v9 _! T1 a6 c1 {( Rfunction u0=ex20_1ic(x)! B" M+ N. k3 V# z
u0=sin(pi*x);
1 S X9 P1 M8 q4 s, [, }%******************
6 y% J' M2 B1 z& t6 T%边界条件函数
- }- a- D1 J$ r6 S- F1 Q' V%******************. d; _9 T8 l6 s: c$ b! e( C- o- I
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)2 M- w% u; |% Z, I
pl=ul;8 p! ]1 x8 R+ E) { {
ql=0;. U1 v8 A9 e* k7 Y% q( Z
pr=pi*exp(-t);
! M$ [ {! u% _. N! qqr=1;
- \4 w& Y+ O' C* Y i
: C8 D) M7 h5 x \" Y9 v! Z+ ~" z+ u6 o/ [" [! F6 e
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() 1 H% \8 q1 g% f; J- b3 P2 S4 ~
![]()
步骤 2:编写偏微分方程的系数向量函数 q2 U- f p; B$ J7 F5 b8 Y
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
2 U1 E$ D7 y& Z+ C- R/ k) {c=[1 1]';
) B1 e' i' @6 m/ a& d% hf=[0.024 0.170]'.*dudx;
2 @) G4 f+ b( m ` o sy=u(1)-u(2);
0 X1 @, E# C8 o4 ~) Q& QF=exp(5.73*y)-exp(-11.47*y);
' }0 h: D# [/ I4 Vs=[-F F]';* r I$ @/ _& `. c
- j, q3 l( l( n' S( ?4 g# j- n/ }8 M4 g7 s. \( t h- h" R# p& Y
步骤 3:编写初始条件函数" s# I: Y2 h% c6 L6 @) D! B$ A
0 S0 l8 B3 N, X, F* Jfunction u0=ex20_2ic(x)
6 J; r' M! O" r) L6 ~u0=[1 0]';
3 ]. y! q( T3 ~2 ^
- N, \0 u* M4 s步骤 4:编写边界条件函数9 j* c" v" k6 m' g, o
- A$ V1 Q. J4 Mfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)5 x, h( v O) j( n1 g/ r1 k- X9 t
pl=[0 ul(2)]';4 R6 x# h4 H* N0 T+ y# a- B0 G0 e
ql=[1 0]';
0 B4 w! B( X+ i3 z8 Z; rpr=[ur(1)-1 0]';
) d1 C8 L* t' L- `, Tqr=[0 1]'; 3 X% P, u- }5 k3 ^& h
* M/ y1 q2 c1 W" F
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
% A# Y7 _. u# L( u- I4 k" @/ s/ q: r( y" W: P) p+ x
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];* ]5 a) p6 Q1 n% C% Y9 e
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
" `4 t7 N! l& P8 k: u
$ x( J+ F D& [8 _/ s以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
' q! h9 e7 o* f
/ W4 K* g& ^' L* efunction ex20_2
8 Z* j' @! b: P; E8 x%*************************************** / i4 l! s0 v1 ~+ H' w! \1 V# y3 \
%求解一维偏微分方程组的一个综合函数程序
/ ~6 X3 [$ I! y. f" o%***************************************
6 x: O! [3 x% W. r; {m=0;3 s) n& @1 N4 d% K9 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];" O4 n+ R h; z; z6 t
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
- i$ @1 b/ M; S/ T2 s%*************************************
7 \+ e! B0 Z8 ?+ N3 @6 `%利用 pdepe 求解
' K( y B1 c0 U7 O% b* c%*************************************
8 I+ C* k0 j( F! B: {8 Vsol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);7 F6 a- U! G# F$ B/ O
u1=sol(:,:,1); %第一个状态之数值解输出! A( P3 B& \4 H: R& W8 a( L
u2=sol(:,:,2); %第二个状态之数值解输出
, `* C5 J8 l: S8 c& x%*************************************9 V/ z N& L6 b9 v- j$ W( o
%绘图输出
8 w+ U2 z# G5 M. u%*************************************: T3 G/ p# a7 @* E
figure(1): A0 a- z6 h C- i7 b( k
surf(x,t,u1)
; P% R" J: n% N% Ntitle('u1 之数值解'), d6 x; k! ]( _. Y
xlabel('x')
1 @) c1 [7 H P/ R& fylabel('t')" F! z: e- E# }; c1 X1 Z
%
! d; l0 H# L$ c/ [3 U5 H6 {figure(2)
3 j) C5 b5 r7 z0 G. d4 lsurf(x,t,u2)) O5 [% \# G" B& V8 y4 g |
title('u2 之数值解')
% x( {; k/ b! a8 @- A5 p$ K% f% mxlabel('x')
; h' o6 g( U8 u( R6 h( Kylabel('t')
5 T+ V2 ?" W2 t. E%***************************************
! u1 }: F, n: |%pde 函数5 {4 `6 d3 i k0 J" H8 o9 Y
%***************************************
. ^7 _3 x: L8 t) x* t. g. zfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx): |5 { [* n# F4 T
c=[1 1]';$ ]$ |( Y3 ^, t( E9 C' G4 |+ X$ X
f=[0.024 0.170]'.*dudx;: J( }3 E# a6 `; l$ v6 b
y=u(1)-u(2);
! X8 `/ F" T; S+ \- ~F=exp(5.73*y)-exp(-11.47*y);
7 ]- S9 A- {/ n, @8 @$ N ?& ps=[-F F]';
! d6 n, `( Z8 |9 n: Q/ h%****************************************' J$ A: K3 n4 f
%初始条件函数) e, e0 d1 N9 O$ |) B2 u5 f
%****************************************- r( E; y1 `/ X% I$ s2 z7 X2 @$ K
function u0=ex20_2ic(x)
0 Q4 E4 y$ D2 au0=[1 0]';4 Y) P @! \% v; h8 o- I' Q2 Z9 u B
%****************************************+ s: s8 y& c4 f( E+ w9 k" E, ]% G
%边界条件函数- b: |1 u: R) M0 A% F' [! F5 j
%****************************************% _* D, V" N, P6 a% W
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)1 v3 j. q- x; \7 w! h4 i4 c' L3 u
pl=[0 ul(2)]';
: D9 ?( K& h! uql=[1 0]';! Z, C6 p8 q8 h' X+ E$ N$ \4 E
pr=[ur(1)-1 0]';
7 W' X: E* h" M& c4 n) N1 Pqr=[0 1]';) \2 [2 }+ c9 }& |- P5 d
6 |- Z0 N0 t- o7 _————————————————& ?) l& H3 a0 S% L# B$ n
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 Y2 Z6 S# @2 G3 W. z" X
原文链接:https://blog.csdn.net/qq_29831163/article/details/897066921 h) l0 a3 ^! L6 s: L
2 u: h. N2 u& [$ R) W. M! U/ l3 |; h( v2 T" F* b
|