|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
. l5 x* O4 E4 b f' G8 M其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下: $ N) e, A( |, }
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)# q& x* _/ d- d' h: Z/ R$ q' Q
. W( P( ~" p9 ? G. K5 j( L ! F& c2 u% _ G) h( j
4 O# D S7 k3 V. }; \2 ?6 ?- r$ p: W% L: i
注:- H1 r6 I, k. c2 A: v) }! R8 m7 U
2 z7 Q8 m6 J5 Q
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
2 c) x" X% L4 g9 Z+ s4 X6 k
& F) i! U( j; s& i ^2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。$ C4 y8 j8 ^* ~8 w
1 f9 \% L0 Y g5 d9 P2 G, j. Z
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
; e. u- H+ b) Y' j4 X# ?& d2 h& B# \- K- t9 l) u
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:' X, ~3 c( U7 _
& J8 y/ i( X+ j5 h# Y( j' o[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
/ d5 @ z A/ s1 ]4 B' K
0 J6 A- h7 a' o# S其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
A2 ?, J- K# A: y- u) y6 N* Q7 f. K9 x, s; o7 M7 D
![]()
( L2 a. W( Q- o3 O( P* U3 a W, E0 O; l: 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 L1 P, f- d' ]5 ?7 s5 v; k
) {8 R0 G2 i4 W0 m8 E* d
以下将以数个例子,详细说明 pdepe 的用法。1 P0 T; _6 B. ?2 B2 {' d+ d) Y
2 }2 D: N9 t$ B/ v7 [! P# g' r3.2 求解一维偏微分方程
0 d8 c/ L, f/ d0 F' L. P: V例 2 试解以下之偏微分方程式
2 p& R/ R" W7 o9 D2 |6 X& l) ~* b
![]()
" `: I' L; l, e& M& k
( l% y" W$ _7 M4 W( l& F解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。. O" W$ ^8 m9 A5 W+ e) C( q
3 f/ a, ^; w& u6 A步骤 1 将欲求解的偏微分方程改写成如式的标准式。, M; V0 r; i3 \' w9 b/ q/ n8 W1 C
5 m2 q) ~" v0 ~% ]0 k![]()
: [1 y3 ^) ~4 I R$ q4 i4 Q6 o2 g B
" Q9 u/ F9 n( E ^步骤 2 编写偏微分方程的系数向量函数。
5 `, H" r$ j: i& o
. U# i8 I$ T* E6 Y1 R1 Lfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx) 1 ~# L7 A1 `$ n5 O- ?; N- S. L! R
c=pi^2;+ m) g! W4 X# l: _7 I2 m1 X0 O2 j
f=dudx;& q7 T& A# r& G2 X
s=0;" b4 R; p4 G) l. n/ `/ V
' {+ m c% [5 n0 m; K5 f4 q9 D& h
" E# e6 b' y3 ~8 b$ K步骤 3 编写起始值条件。
3 K' C7 `& v+ u# @0 y) a
% }# l( q- _- H4 D- Tfunction u0=ex20_1ic(x)6 k& s9 [' |# |- |7 p
u0=sin(pi*x);$ J$ S) o) S r/ `0 B8 A
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 8 x- S$ T0 V3 F( c
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
( _2 J- R! r0 ~; j# I6 N0 Npl=ul;. w+ _0 H% q& V* V" _) [/ i: _
ql=0;
H5 Q7 M @! kpr=pi*exp(-t);
- A/ h; g2 @7 U' ?7 Hqr=1; u* H( W. `, \5 \$ B0 J
. `! C9 T4 Q! u9 s) }, T- P7 H& m/ h) O! S3 u- Y
步骤 5 取点。例如. q7 H8 ^9 {0 m: i: X
2 r6 i( _; [# Q# y
2 O* r+ L5 h% N) zx=linspace(0,1,20); %x 取 20 点
/ s8 Z5 g) o0 h1 N+ ?# ]1 H& Jt=linspace(0,2,5); %时间取 5 点输出% c+ r- b5 [! _* u6 [( S( ~
* m0 W$ L" N; n. J; L$ U0 E: @: |* W+ D$ b- G" B: T& H0 b
步骤 6 利用 pdepe 求解。: C0 ^' j& i# u4 C" [) f2 ~: o
- f8 e* T6 o, n5 R* a( `) t
m=0; %依步骤 1 之结果! [ E* K9 Y9 k
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); w( _( @3 q+ E1 [1 h
$ p: `( s' g) k) J8 {" g: [
& d# R6 Y6 M/ P1 N& j
步骤 7 显示结果。
, j# s9 P- V! _: y0 H
1 X3 _( ^% A- k3 cu=sol(:,:,1);/ h* @- n7 V* a0 O3 T# o* ]
surf(x,t,u)% R& o# e6 _4 h6 W. c8 F
title('pde 数值解')3 J! m |! y5 K, e; B( ~7 v
xlabel('位置'). j o9 E4 g1 a( ]* ]# l/ S; v: u
ylabel('时间' )
- | @" Z. N1 C- a) I! e; L \zlabel('u')
9 Z, f$ U# n/ o l$ P
: o( T0 W. H" j若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
, n3 P" x/ W5 x- e. |1 C& r, d3 E7 v' j$ G$ ^9 }
figure(2); %绘成图 2
' l: c9 Y1 F# t" M5 U1 IM=length(t); %取终点时间的下标
% S F0 s7 [( x, _9 B$ K6 h( rxout=linspace(0,1,100); %输出点位置' ~/ h7 k. C* t f* j5 ?$ ]" J I
[uout,dudx]=pdeval(m,x,u(M, ,xout);" L$ r5 f" E* y: e. g: a0 z
plot(xout,uout); %绘图( B4 R; K; x3 g* [. ?6 ]
title('时间为 2 时,各位置下的解')
; a1 {5 E% b# n% I. e, |xlabel('x')
& [$ Y' o3 o' `! @/ ?ylabel('u')
- J+ I: f* V* g8 A( L
; ] I) D+ C- {" T: z- J4 H# J综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
0 P- M6 p7 G7 X9 N$ r
- b* v3 {, \8 S$ s: z2 n' rfunction ex20_1$ Q% r Z& e- k8 P5 G, L: W
%************************************
& `2 v4 I' M0 d+ f) u4 F5 d9 w# L( e%求解一维热传导偏微分方程的一个综合函数程序
, D! b4 b/ |, X%************************************
8 x. X" [. T, k+ Im=0;
/ C; ]' _: _1 x ^, Dx=linspace(0,1,20); %xmesh
) S6 F5 I- ~6 ^" L7 vt=linspace(0,2,20); %tspan
" o8 P! S" p3 x! Z( A) R! o%************
$ }) U6 Y! B; t7 I# A%以 pde 求解 [7 Y( V6 w7 o
%************5 E" M! m. E; U0 q6 t
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
5 F g# @ S) V; x9 I: P9 ~& su=sol(:,:,1); %取出答案 }; [+ ~, R+ J8 U, l1 A; s. j; N
%************
9 @2 [" O% X; h$ C L% d* I%绘图输出! c. f. M" D3 w ~
%************
1 Q5 z, e. |8 x; Mfigure(1)
8 _4 d2 r/ [1 @/ isurf(x,t,u)
8 _8 L. s: r# d' f) J; Y9 {( ftitle('pde 数值解')
% F/ Q/ [# C( V! Qxlabel('位置 x')6 a9 c! U4 k( M# u
ylabel('时间 t' ); u1 l* t) N/ ]3 B# V* e
zlabel('数值解 u'), \* f4 t9 i& t+ F7 f1 g; ^
%*************
% m* P4 K' G& [9 D%与解析解做比较8 y w3 L: P" r$ l
%*************
( p- y+ [+ r) K j1 ufigure(2)
, E% p2 ^1 x: X! zsurf(x,t,exp(-t)'*sin(pi*x)); j) R6 r' i" @4 K3 T
title('解析解')
, P2 b/ i$ E. Dxlabel('位置 x'); E' y3 u5 e) X; B. {* V
ylabel('时间 t' )
7 K3 L% u; e, T3 Izlabel('数值解 u')5 K- U6 d# R0 [ K, t
%*****************
4 E0 p+ N+ j6 i6 Q$ o1 x* a%t=tf=2 时各位置之解
0 A2 U: i P# |! z8 [%*****************
9 N: e% f: |; h; Xfigure(3)
1 v% d& f( [! L3 \/ D8 ]+ zM=length(t); %取终点时间的下表" [. x! K, E6 A, y5 q6 f
xout=linspace(0,1,100); %输出点位置/ I& L( a. a1 s0 t
[uout,dudx]=pdeval(m,x,u(M, ,xout);
4 U3 l) {& w7 N. Zplot(xout,uout); %绘图
R: a5 T! F2 t3 T0 o; ]4 W2 jtitle('时间为 2 时,各位置下的解'): l3 K7 g" o' C" H" T
xlabel('x')# H/ T$ ?+ ]0 f4 L
ylabel('u')7 r1 r" k: Z. O2 K
%******************6 I/ }! y3 _+ G
%pde 函数
' C+ f/ a; A, j b6 C7 J6 Y%******************3 K& K7 D5 T5 t9 g& {
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
+ @8 ]3 I' S+ q4 n2 a2 `1 cc=pi^2;
- v" R1 ?$ u( l, ~2 Xf=dudx;- Q: C7 y7 n( q: F7 z
s=0;
" c0 T. m( s+ @+ I: E: R) x7 P%****************** + [( r3 {. w8 w4 s6 h! R
%初始条件函数! L j! t( `- e' B" ?
%******************# e4 l3 u( g/ U
function u0=ex20_1ic(x)
, b4 f5 Y) @8 `# J1 P& E3 d6 Bu0=sin(pi*x);
. N r3 N& a8 _2 p, f- p! S6 |%******************2 P, y5 j6 ?8 _
%边界条件函数6 s7 w9 ?! ~ h- R
%******************
/ ]( G4 @: p1 F' Ffunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
" \) r9 v8 x7 U/ S% Z- A1 Z- Hpl=ul;' y8 Y- d, y# h O) r
ql=0;( S) U% I1 B+ H& _1 K; }% P
pr=pi*exp(-t);3 p7 c1 J8 `& s) n8 ^
qr=1;0 ~) ~5 s- f/ g0 B& r* y
2 N2 t; q7 T- N% F# ^
" V1 J' Y" G) L
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() 4 ~% Q1 n# y7 x' R9 N
![]()
步骤 2:编写偏微分方程的系数向量函数 $ C! z1 G+ P! h9 t, P
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)5 ], h: t- [ Z9 [: R4 O( r1 p2 `2 M
c=[1 1]'; _+ n, K. p5 b6 f. Z- E/ f" ]
f=[0.024 0.170]'.*dudx;
+ I! g& x. k0 l5 R1 k- S$ M2 Iy=u(1)-u(2);/ B3 D! a. N7 I% V# [( t
F=exp(5.73*y)-exp(-11.47*y);
% f7 R9 k, ?8 A* a) P/ O8 Xs=[-F F]';0 Z% ]) c* o; k, R% m
9 ]; B) Y/ c+ V4 l* a) D, r
) F: `; R6 g$ Z- Q5 @步骤 3:编写初始条件函数7 B" D& m! i* F7 Q
# w+ L( _ _$ w1 J
function u0=ex20_2ic(x)1 Z5 i5 p: Z1 U7 S
u0=[1 0]';) T2 X& i8 a+ K% w2 j$ ~9 I
1 [3 X( c3 @9 H! h2 C- G步骤 4:编写边界条件函数
! _5 U4 }" |9 s0 u, j; z
& l- d9 j1 s" G8 b. F) z' `function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)) a- }. i! {% x9 `
pl=[0 ul(2)]';
, I" W% m; R v7 j3 Oql=[1 0]';
8 e |+ @. G2 v' ppr=[ur(1)-1 0]';, J: w" S2 L1 w: q7 {+ _0 Z' z V
qr=[0 1]'; $ U6 z# x s3 C; g7 v, I
+ r5 p; f! ~- a) G
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,! n# i0 v3 O+ n E7 J: ]( {
9 @" ?( [" U# P- I8 K! G% z- t9 Vx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
7 Q8 }( u0 r- S; W, j- {8 it=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; 9 \# v$ O8 }$ X
; T' ~. ?& \5 x) ?" u/ r- @$ {) D以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
2 }' Y- N% p p- v$ R6 f5 X0 L
& G3 n* r5 h! g. Y- E3 P- Z+ sfunction ex20_2
; p# b8 c, v" W0 o8 K, T* R%*************************************** # \0 m+ m0 y' \. c9 j
%求解一维偏微分方程组的一个综合函数程序
6 X' A" I, _' d- `7 p# |3 [) {%***************************************1 H U: Q) t B- c4 o/ s
m=0;
* |6 v+ u7 A5 [1 t( m& Ox=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];8 y6 M. K1 x* n8 R9 x
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
8 D$ \& X7 U/ h%*************************************- x- K" ?$ t: e# e% A
%利用 pdepe 求解
& X- J# y. `. L1 |, |%*************************************5 N: ?- J; ^. x) ?* ~$ I* h2 i
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
; @5 F9 k6 c% Z1 p* n4 ~u1=sol(:,:,1); %第一个状态之数值解输出9 N; ~0 h8 Q7 ~/ V
u2=sol(:,:,2); %第二个状态之数值解输出
( g. Y# K8 n( | U9 j0 V%*************************************; s) A: |( @, V) t, A; k
%绘图输出# A! }% x" t. s( L/ }1 ^1 ~
%*************************************$ g, ?. `9 W7 J9 E6 K
figure(1)
+ O( `& |9 o. j; x4 B- Osurf(x,t,u1)
4 [% v# F1 R( N4 \1 z( ^title('u1 之数值解')
2 @$ g. u5 E' u1 [* K9 rxlabel('x')1 C1 ?9 u s8 o# u6 z+ e4 ~! i
ylabel('t')- r' M( f6 J- T9 f' [- v
%2 b( [# u/ E3 P! R7 T7 w
figure(2)
4 M m& C# ~5 Z9 I' s/ Psurf(x,t,u2)9 t3 j; Q3 ^( A0 ~ _' J
title('u2 之数值解')
) {8 E1 V8 \% s) _! b7 E. w" Xxlabel('x')
+ l1 m. [$ K8 pylabel('t')
" p+ j4 r7 c9 w5 a9 |7 R4 V: |%***************************************/ }1 r. n: w$ Z- a) w
%pde 函数
: i$ a |. `5 N! ] F%***************************************, l& v T; c7 h% p
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)! u+ w$ ^9 a9 W+ \. v
c=[1 1]';5 _" j7 G8 q8 r3 a7 k
f=[0.024 0.170]'.*dudx;, u' s# R: J5 c) ~1 ^
y=u(1)-u(2);
8 [/ ^7 B5 c1 A2 n& H/ fF=exp(5.73*y)-exp(-11.47*y);
2 `) P- L0 I, z" ^7 u& Is=[-F F]';, @5 w% V6 a/ a% e; o: U/ p; [
%****************************************
; F9 }% u8 d4 |) b! \3 c1 ]%初始条件函数+ u. L' |2 v" s' _
%****************************************1 c _+ J6 @% p8 m9 |: e# J) r
function u0=ex20_2ic(x)
W; C+ [6 K) bu0=[1 0]';9 U0 P8 P. s- P3 j$ `; c
%****************************************
K6 y: E9 t t, F" W%边界条件函数
8 U1 `5 v* A1 Y4 x$ n8 k+ n%****************************************
' Z6 h8 e$ U& {) _9 I! ifunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t), Z; z7 W! b. B4 i; I! Y
pl=[0 ul(2)]';* O2 _3 u- T) {' V% s8 h! W/ h* `
ql=[1 0]';
- p b8 q; P! a jpr=[ur(1)-1 0]';
* ^9 P' e% V6 ~" W+ n. h w* qqr=[0 1]';
* J& V2 J* d' A0 p
" S( a1 P! F$ R8 a7 y; `; g4 i5 J! i————————————————
/ Q3 a- \( X1 D; y: B版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ O/ K4 A e) z
原文链接:https://blog.csdn.net/qq_29831163/article/details/897066921 F* Q% a0 O' v
0 p9 D" r: J7 u4 l
8 Z2 |# j; Y3 j
|