|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
* J; ~7 _7 Z7 U其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下: # ~3 K9 \$ A* M/ H% Z X, _
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
& d' `- f+ b. t7 Q9 A: e5 p
6 Q2 v0 Y1 M6 t2 Z# Y: S : e9 m7 Y: x K5 Y
, {7 |/ l: B; p7 t( K0 S# [9 i9 g
7 e$ n( _( t+ X+ Z) ~注:# m+ F2 @2 K5 k, @/ Q9 ?
! f4 U u- `; d9 c6 x6 v B9 }6 f1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。& L ^- {. y: _
; X6 W$ o" r# e4 R" T) K' J* Z
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。% ]. b9 ^ s* u
% {; L3 B3 E8 u( T3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
1 b) T3 L$ o/ n/ G
- k- Q0 ]5 U; a& g ^& U" ~4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:8 R; I [. m1 f$ z B- ?
: Q$ A8 w6 G( U) j& o
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
n( v% i, f0 J
' ] y7 u6 j [4 y& I% ^+ B% F1 Z4 I其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
! F% d% N5 ]: V# D; X$ X
1 j: s5 Q/ y, L1 U' Z0 O![]()
7 v$ M" s/ Z! _* _7 |- R# B5 j# {+ D# D: ^
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.
. O" `5 ~6 P& }* P& A* _ ^
# @* h* w7 y8 y& _; k以下将以数个例子,详细说明 pdepe 的用法。3 W1 o3 g/ [% M( e
. V: k1 Q( i: M) i# Z3.2 求解一维偏微分方程2 ?" d( T- a. h/ l8 g
例 2 试解以下之偏微分方程式! @1 `2 @: \3 r8 u/ t
8 F# k+ W, Y T3 D1 D! {$ j
![]()
5 g2 \" s4 X; E7 G8 H
3 h, f, h' R! p% @0 `解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
i4 C( j& A2 x: K% {1 h: P/ \* Q v; W# U2 a( \
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
* u! y0 B' t/ `
) ^/ z, U' q5 Y" {# D$ p H# P![]()
% D% c1 f) v% E8 M" g }* m8 o* ^: o# g/ Z5 v
步骤 2 编写偏微分方程的系数向量函数。- `3 F% z- z% c2 s& x e
! `( v( \0 ^. O, S* z/ o
function [c,f,s]=ex20_1pdefun(x,t,u,dudx) - l- D8 n1 [1 [0 j- c! s" t1 p3 m
c=pi^2;
- ]/ f- k1 H! e# B$ \f=dudx;
4 W" Y; |6 P4 K8 rs=0;
1 [9 z5 J$ ^ r* d( [- e0 E3 E9 ]5 I6 v2 T2 ^, d
* T: c8 J: z; e) ^+ L' @$ r
; W. l% d# P# N步骤 3 编写起始值条件。
' N# p2 i7 R0 v" B8 q$ U3 n' m3 V
function u0=ex20_1ic(x)) Y9 `# _0 ^* N
u0=sin(pi*x);
4 X' S# s- E8 `/ h% |4 V步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
. e* o0 `) }% U6 }3 _function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
+ c/ S2 e" W, s- }* jpl=ul;
4 y7 e" g8 I7 k9 F$ {ql=0;
$ Y0 \) `) K( T$ A( upr=pi*exp(-t);+ Q2 v* o! s4 i6 f: Z: |0 P! o, R
qr=1;
5 Q6 Y+ ? T9 `1 r J
; }$ ]* O5 q7 N( [' y
. g% V( `# l: c. T4 l& Q. j步骤 5 取点。例如
+ Z; ~& T. g" [; ^- {! N
9 \* ~& D+ Y3 V2 P1 V* s' B9 v4 D: g" H2 N9 x$ I
x=linspace(0,1,20); %x 取 20 点
+ {: `& z9 }, O4 w1 Ft=linspace(0,2,5); %时间取 5 点输出
" v |6 b% a$ I( Z* D+ I1 {; j; u0 V1 R9 D
' }- g: g$ K' z步骤 6 利用 pdepe 求解。
7 c! T' c( w3 f% L4 V: r$ f0 s, ?- \" R$ u Q, Y
m=0; %依步骤 1 之结果$ ~2 j' r9 R: O( P2 w
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); 9 X/ k& n1 |9 t, \2 U
# r) L9 `5 b. U* H+ a! @5 T3 D
+ P4 f6 o4 D: J; j" t
步骤 7 显示结果。; F2 n8 @7 j; F
- ]# N2 a/ L2 }4 G9 L- |# T- lu=sol(:,:,1);
/ f2 R2 f$ J% m l L0 msurf(x,t,u)
8 W5 |' N, S" U' ktitle('pde 数值解')
( e/ }9 i4 n0 S8 s |( a1 x8 o' Kxlabel('位置')
Q" p: R$ j7 X4 s8 }8 t n# {- E2 kylabel('时间' ), [; H O% @% y. E l
zlabel('u'); r9 B+ h4 _! T) ]# Z, B0 x$ C
0 n5 G+ y X3 n' X( a% ?0 B
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):, t- x5 o5 s$ X7 ?; [. v5 f
% C( M6 `6 l+ _7 w" U6 kfigure(2); %绘成图 21 E5 B3 \- X, F9 q5 p% \/ W
M=length(t); %取终点时间的下标2 Z( i: W" X9 T& r0 T7 z1 L7 q, ?
xout=linspace(0,1,100); %输出点位置. F, z+ X) V1 m0 {" I/ d# k) @ f
[uout,dudx]=pdeval(m,x,u(M, ,xout);& t7 u6 S8 a+ g: I! A4 o5 U
plot(xout,uout); %绘图+ b+ s0 j: T! c( q: {1 ~
title('时间为 2 时,各位置下的解')6 c- H' x: y. g) G
xlabel('x')" B( m9 h. T- l, V n1 i
ylabel('u') ; ^7 G% g# V: J( q$ w
( `/ `/ W. D0 s" Z综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
6 e3 T$ J/ o9 [# L# L3 h9 T3 k/ U# ~5 t1 C
function ex20_1& S3 H# F+ ~5 v/ n# [4 j0 f: Y2 W
%************************************
1 b" p6 p% ]; K9 x- R, W O0 `4 a%求解一维热传导偏微分方程的一个综合函数程序
N% d8 [% ~3 }4 j: y- S%************************************( F+ }$ m, I9 K o
m=0;
2 w+ t) k/ s% o+ V' e7 T, w: Cx=linspace(0,1,20); %xmesh' q( i& h7 W: E
t=linspace(0,2,20); %tspan
& E! r# P. t0 i) j3 R) |( i: L%************3 f- R* ~8 d' X, ^
%以 pde 求解. _# b7 D$ K$ W3 ~
%************
. z1 Z( @: g! b& L2 Qsol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);+ T5 a$ J& F( \( Z2 ^ }
u=sol(:,:,1); %取出答案3 ]% j) z& `0 N2 A+ M4 d
%************
9 J4 [8 y5 f5 h%绘图输出6 a+ ^; }( ]# c H3 W3 {
%************0 k- j7 [1 e/ C" g5 D1 H
figure(1)% V" R( c- u, D- b d
surf(x,t,u)7 Y" D2 h$ G j% @4 E8 v8 c
title('pde 数值解')
$ a' k3 F+ _) c2 O/ [xlabel('位置 x')
9 A2 ^! W9 v8 E8 L I9 C! kylabel('时间 t' )
R6 i Y6 @5 z8 Y, kzlabel('数值解 u')
9 J' z( c0 v: O9 I%************* `) ~5 W/ i( l
%与解析解做比较
9 @0 D5 @9 n% O ?$ k: ^%*************; }; B5 V4 d" [9 O9 p5 a6 s* l
figure(2)
5 p0 ?( b) F" I) fsurf(x,t,exp(-t)'*sin(pi*x));
( k; X0 F9 u) [/ u3 ptitle('解析解')
- N4 E. q, H- X$ C# F3 Dxlabel('位置 x')2 G# b2 O/ `' x
ylabel('时间 t' )+ x# w7 O& E& o1 d2 J
zlabel('数值解 u')$ `) ^$ ^. K* u$ M# V1 e
%*****************' K& \6 E* p$ [* ^# v7 L) Q0 z: T& ^
%t=tf=2 时各位置之解
2 W5 R# U/ R: k+ n%*****************
, w- w ]/ J# S) \ b# Lfigure(3)$ _( _9 ?/ L3 B2 M9 z, q9 S0 {
M=length(t); %取终点时间的下表
3 V% y* i" N( Q' K6 ?% i5 Cxout=linspace(0,1,100); %输出点位置
& s: M3 b3 D+ |: K: K[uout,dudx]=pdeval(m,x,u(M, ,xout);
8 h% d% d8 Y' p2 F8 ?& ~plot(xout,uout); %绘图; Q3 u$ [- U, h* b0 s& l
title('时间为 2 时,各位置下的解')
% l, n6 w, c0 N9 H- x9 uxlabel('x')
E& t1 h& y Z: v7 lylabel('u')
6 G' T' [. T, q: S0 A%******************
! A7 q6 Y8 H* O" ?* o6 i3 p%pde 函数$ `5 |+ \" g8 B2 D
%******************* Q9 @: a$ d8 H, H: S2 j6 q4 q: X
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
: e4 ^ n$ b' s k) |c=pi^2;
) s4 K4 V: F; O% [" F( L4 Y6 [f=dudx;/ k/ B. o- U& Z: \% }
s=0;$ C! K9 j2 L, u
%****************** % z4 R' x- }% g( C# U3 D2 e
%初始条件函数! {0 y6 p8 C* u* t
%******************: s9 o: C6 P2 Y4 x" j, h1 j
function u0=ex20_1ic(x)
- r& D" T4 {: ?u0=sin(pi*x);
3 Y1 `6 k0 f$ @9 ?* C% T%******************
' N' d F* `$ E0 x) {%边界条件函数6 d7 B, {/ |1 \
%******************
+ D+ j+ z5 H* G9 F. i5 j/ J @function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
# C& x; W# t% Q2 y2 Opl=ul;( l s: ~3 q5 L
ql=0;
( K" G8 l: |1 l; J6 z" K d: apr=pi*exp(-t);. V- {' K( N0 O/ _) H' h
qr=1;, N& |& O* o0 y/ f8 q% l. I. E; ^
( b3 q0 J, I; o3 f" ]
; b0 w+ Z1 k0 J; A( a) k例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() ( |4 w+ t4 B" J0 g0 \
![]()
步骤 2:编写偏微分方程的系数向量函数 * z) w4 m8 _6 W$ A
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
& q% P# Q7 J* L( K7 t- ~* Uc=[1 1]';
: |0 p9 e3 C1 l; @0 y* {) of=[0.024 0.170]'.*dudx;
( E9 ~+ g$ @4 B" w' j% u1 Ay=u(1)-u(2);
+ q. C1 j8 n9 Q/ u% `7 H" x% a7 bF=exp(5.73*y)-exp(-11.47*y);3 F: z/ u* D) l [9 b& t, h
s=[-F F]';
$ ], V! i' v& ]$ d! z3 M
( [2 b' N3 ] J1 l( b6 C8 c( c1 z; z$ Q' e i2 d8 [+ W0 z' K. [
步骤 3:编写初始条件函数
) M7 P% y% \+ E( P* g
" W! ]7 Y9 l7 E8 n% \- Z: yfunction u0=ex20_2ic(x)3 |0 _8 G& N7 Z8 b1 D/ C
u0=[1 0]';* M+ L, ~ L* f! {( M; }
, E2 }7 i6 E6 C, |" ?# N5 ?
步骤 4:编写边界条件函数4 `- z6 W8 r5 `2 d4 f/ k% m" Z
8 S) U$ {2 {- Xfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)2 B. r4 p9 g: a( E5 y1 R( D0 c. P
pl=[0 ul(2)]';; y) t: c* i' s+ y- n2 z9 n9 n! A$ l
ql=[1 0]';
, W- n' ~* ?" T- V4 }pr=[ur(1)-1 0]';
* A3 q+ A( G* z* Q% C _qr=[0 1]';
8 A7 s2 X- C+ C' g3 O. P6 [; s' @
, p k! J& ~. @8 A" x8 n步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,8 n, M5 V g" Q& t) u
" E% y6 v: p* G
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];
" P3 r! Y" c7 H" |t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
/ c. ^2 r5 R P) \3 l- ]) x
/ F2 I6 n9 {- [( O( E以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
: u. y' I0 L0 R$ t" V7 X
( V5 ~# p3 [2 z5 [/ Nfunction ex20_2
( U2 F! e. `( G% w6 ~% V3 F, k%***************************************
1 c$ y z9 J" D1 g6 s* ^( c, ?& g%求解一维偏微分方程组的一个综合函数程序
D) r G& x% f" E F) U%***************************************+ y% d" G1 { z& f! B, G0 U
m=0;: P$ M* c8 s1 u; N
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];9 s: z( u$ _ e$ o. D1 E
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
+ H; Q1 l0 [ O# u6 N1 g: A%*************************************
9 g1 h. \( O5 N" p# h0 w%利用 pdepe 求解# q: \& i7 {; B4 o3 s8 K7 Y5 C1 {
%*************************************! }4 D/ r$ U. d& P
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);3 S" Q1 u' s r2 K( O
u1=sol(:,:,1); %第一个状态之数值解输出
8 M$ L/ u0 p M' R% Hu2=sol(:,:,2); %第二个状态之数值解输出; J1 I2 m( v; D; E5 q3 C U
%*************************************
( R$ L7 v. ?; w( W! O%绘图输出
4 s+ e: q6 B( \' @%*************************************
# C% o( P" \4 n' m% Q9 rfigure(1)+ t: R; S+ U) i* e6 `/ H$ u* e
surf(x,t,u1)
$ ?6 R1 E! o% p6 B8 ?0 {title('u1 之数值解')( f [( Z# z% N4 a- f
xlabel('x')
/ Z* }! \9 ^5 j- G. Wylabel('t')# K1 a& H" f, d! b( h- W! i
%
1 _! P* ]5 s# a8 L, A2 c0 Tfigure(2)3 Q# O2 @& j; Z$ ]* @. X u- n
surf(x,t,u2)( y6 G/ s, t" T) P4 j
title('u2 之数值解')+ S9 b3 M) N8 k& _! D5 P
xlabel('x')6 n' r/ [/ n0 Z+ n8 J1 \
ylabel('t')& D9 }% B( ^5 d2 K8 x$ t+ k+ t# \
%***************************************
; H! A; q/ o3 L; C( y8 t%pde 函数
+ T& g! @8 W9 E3 ^7 t, G%***************************************
+ P' z0 u- w! b: l `function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
3 Y* g! n& q, a! tc=[1 1]';8 [* [, v3 K# `& X' G+ `6 z
f=[0.024 0.170]'.*dudx;
/ C3 r% u) v: ]; oy=u(1)-u(2);; Q0 L$ ?+ U7 H( B/ y# ?: ]
F=exp(5.73*y)-exp(-11.47*y);4 u" |! G, {; K) b
s=[-F F]';" d5 ?1 W A) G+ q$ k$ v
%****************************************2 e5 f# v4 }* ` l- A
%初始条件函数 }- {* l$ w3 P& ?7 \- O( _
%****************************************1 F3 `6 _ ?4 e, N9 e; R4 P
function u0=ex20_2ic(x)
# Z* J& K0 {& u6 pu0=[1 0]';1 M `$ s, @& B4 r" X$ W2 O. }
%****************************************
* d ^; o% x X% \0 f- ~%边界条件函数 c1 @: p! W, R0 |; F* [
%****************************************5 e& R' J( G) ?
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t) s p+ ^1 P" n0 q" t$ r
pl=[0 ul(2)]';
. ~3 @* d! |. a1 R2 [ql=[1 0]';
. S6 I2 G6 W) L9 x0 X/ v3 O$ U i/ Spr=[ur(1)-1 0]'; w. \( q/ Q. K6 c) T3 D1 i
qr=[0 1]';
5 H i8 J& d1 b- V
) g8 L' j# e5 U" E$ m————————————————; z& U/ `3 y6 X7 H
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 I0 v# ^$ J& t) v b: B原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
. z0 e% H0 Y3 x9 h u) z, Y' u* k3 q9 _0 f
9 Z: X2 ]/ f+ g6 ~
|