|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() . v5 T8 {1 w! s- b: x7 h$ Q
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下: 2 |3 ?9 c! L5 d: L
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options), D5 m* ?( t! {0 ^( n" i' \0 {' `
% V; W- b' Y; v: G! N1 M, X3 V9 E7 C3 H
![]()
. e$ @5 ~8 ^2 m) F' t% j$ V# |4 q8 V9 b" ], u. C% G) f% [0 [
; \% l+ J5 P L! k. E% u Z
注:/ u9 @3 U* K- F" O7 z5 x) c/ Z
I8 H* z! y+ N* B* E: Y
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。; ~$ a3 q5 |. D' e+ D% N
% {! }) u0 B5 Q! N: p6 A. Y B2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。; y+ r8 f: z% m
. N9 v$ P! C3 D9 U; \3 m" p3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。8 ^0 o/ [% w2 {8 f9 L
' D) J# T( R, S4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:; q* V/ k- ]" r6 ?- }4 l
& [$ H, ?9 Y8 ]( Y: \/ R$ R* S
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)# [& p1 {, a6 P G( C X1 d0 M) ]
2 i/ f" l) q$ [& M+ H% x5 P8 L. T
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。! c; L, M+ r; k0 Y& ~& [
- G/ R& j" M, |, ~2 p+ o$ m+ h & M0 D9 F/ b: E3 y; N
' {( g, L8 f/ _4 A1 zref. 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.& P) L; p0 H8 v6 l, N9 N
' y. X+ W6 V5 s: p0 y以下将以数个例子,详细说明 pdepe 的用法。
: ], ~2 M; P7 E! ^# O2 y0 H; u1 n- H, {
3.2 求解一维偏微分方程
2 k/ S( M3 f n例 2 试解以下之偏微分方程式4 v/ u3 E$ \# v3 `) F
) X! x6 Z* Y& | ( l6 K, w0 B( O3 L4 j. {
; t$ h) [/ x0 p9 J2 O
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
( [) K1 E1 s7 o. j9 {& a: Z3 F& e& k
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
5 a3 |0 c! ^2 A' {
1 K5 L! z# @/ O7 q+ O 7 s+ a/ s! ?1 D* L3 a7 \$ r
) V; s1 t5 s8 j
步骤 2 编写偏微分方程的系数向量函数。
( b4 C. O1 M" h% U/ _0 Q! l$ T0 I: C8 m7 d
function [c,f,s]=ex20_1pdefun(x,t,u,dudx) , K+ `5 n8 z2 G- i; P
c=pi^2;+ ?/ E! M$ c/ x6 l6 [* N- `
f=dudx;' W" L7 _' R- n/ I% j
s=0;
8 J5 S5 l$ K5 y% j2 k$ E& m+ _
3 Y, R, P% g+ o' Q& O' z% m q# |4 \: g" a' [3 J( L& U9 K
% @2 t" j' J2 a7 T3 d9 m& J
步骤 3 编写起始值条件。! D0 {# _. B! f; g U v, v
$ Q; w6 ]' S) Y! r0 v" e _1 ifunction u0=ex20_1ic(x)/ a" c9 n* z( v* g f, J0 j3 `- a1 Q
u0=sin(pi*x); ]' d: m3 x2 @1 {5 B0 ~3 W: L0 D
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成
/ x6 L( ]: u+ Y9 ^$ |function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)" X7 F& b: r5 m) h5 {
pl=ul;
' @, v: {: W Nql=0;
; Z" [7 Q# o* r! V: p2 Epr=pi*exp(-t);# r+ I1 p! O- @
qr=1;
& N: g; y5 B: ~. |8 b' D( H: i% U1 S# N% @& p+ M
* r' N% j( m) w; G' i l; {步骤 5 取点。例如# ]% f5 l6 ?( d% U" H7 e8 M
6 C, i0 C7 D. w" n9 z
# k0 L" v u+ v5 R; R0 v
x=linspace(0,1,20); %x 取 20 点
3 q% ^5 T* d2 \6 d: mt=linspace(0,2,5); %时间取 5 点输出
5 B- m% A1 R7 p# z( ?+ a
% O( n! H2 \) D% p+ V+ U0 O2 l% m& s- R* K
步骤 6 利用 pdepe 求解。 o3 u0 E. W1 h6 l3 P4 O% T
6 k: V b$ Z2 S& B
m=0; %依步骤 1 之结果" k9 [( C9 g4 X+ d+ J: s9 w2 e
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
: n3 y* ~3 e& g
7 }% Z3 B T- F& o: \* @$ ?- a) P7 P; V( N3 r& X3 d# f# R4 d. u5 t# [
步骤 7 显示结果。
+ z; x& g# t4 J' z5 d; _. d S' Y8 E8 v/ ]2 k3 V' ]
u=sol(:,:,1);+ ~8 ~9 G/ B- y% ]8 r4 M
surf(x,t,u)& \0 d! K/ k4 W' N: `0 G: k: Q
title('pde 数值解')
! b* y% z* o; F- a" u9 H0 kxlabel('位置')! e% w4 q5 _" ?- L
ylabel('时间' )4 G! H# L; s* _3 n
zlabel('u')
2 X5 p2 v5 z$ K% H$ s Y! }. H. S7 e7 }: V1 n
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
: C. ]6 ]3 e3 v R' A8 _8 @/ n& X5 E- i- R- [( B7 X7 S
figure(2); %绘成图 2. u* v3 V* \, ?% _
M=length(t); %取终点时间的下标) P. {( T+ s# `. p- h
xout=linspace(0,1,100); %输出点位置
% s$ u6 D( \3 {5 W4 X8 Q[uout,dudx]=pdeval(m,x,u(M, ,xout);
' T3 K' `, h; @6 `5 ?; ` Eplot(xout,uout); %绘图, z5 e1 f' f/ U4 [* Z$ w9 _
title('时间为 2 时,各位置下的解')# D, m, X4 _: D7 G- ~. Z
xlabel('x')0 P( `4 }! T' a; m) M
ylabel('u')
( e" q8 d% Z& ?% X* O& r; F/ t; O' @ T# c1 v3 G5 v" i
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下- a& s: e" c" B6 f
4 D0 m+ k. G; X9 x& J/ lfunction ex20_1' ~% O, c1 Y9 @# e) d" [
%************************************ M- V' O* |6 O5 V6 V
%求解一维热传导偏微分方程的一个综合函数程序
' @, y* z0 {) j%************************************2 c- y4 S7 j& t/ w" I. L- t
m=0;
+ n" `) J) U, Y8 lx=linspace(0,1,20); %xmesh
2 j: }6 ^( V' E7 t+ w# Kt=linspace(0,2,20); %tspan
% E' s, Z6 ]1 M% J" z: k4 h! @%************
. @2 T+ y D' S( t% I; e%以 pde 求解
2 [6 t, z: }3 o+ H%************/ D' L, c X1 j7 K" \$ }
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
K! {( G% ~/ I+ p7 xu=sol(:,:,1); %取出答案6 _8 N+ U& }4 T8 n
%************) m6 n, O d! E0 T. ?1 F! ]4 j
%绘图输出+ r7 z. m8 _$ U6 _& X/ ^& x( H
%************! b1 R$ g3 C) ?7 a
figure(1)
4 E7 O% Z/ `, L8 t- ^. ^/ k+ {% gsurf(x,t,u)/ @. P8 g5 a+ B+ v: |; U
title('pde 数值解')/ Q/ _( `& ]% V9 B8 {' r! w" x
xlabel('位置 x')
/ f% m+ u$ z4 O: S1 ~4 y6 G2 n1 m) ?" ^ylabel('时间 t' )1 F9 t/ f! q2 b6 f$ _# h* d. g3 c
zlabel('数值解 u')
4 s1 t, q6 R/ K' q1 b6 S8 A! m. @+ o%*************( G7 }# g: |# y! ~; A
%与解析解做比较: p$ h2 r% W0 _
%*************" m1 D8 p2 t' F( k
figure(2)
: B4 |5 n- M# _4 b# o7 h2 r' asurf(x,t,exp(-t)'*sin(pi*x));
# f) L6 ?4 Z1 h* [" e8 rtitle('解析解')3 y! e3 |, S8 o6 K+ Q% j
xlabel('位置 x')3 T9 Y4 \- K8 b
ylabel('时间 t' )
9 I+ e; t: d1 A% m7 p0 v. Jzlabel('数值解 u')
; \) t$ _( e8 T0 E%*****************
: I0 }4 q9 s3 f; r1 A+ o%t=tf=2 时各位置之解
! E. c" a8 A# p7 X* U! [3 a- W%*****************4 N; {5 k( Z2 g/ c" d
figure(3)
~4 a8 d! _3 w8 T7 R" F0 JM=length(t); %取终点时间的下表
! m1 `- [- V, _' t& xxout=linspace(0,1,100); %输出点位置
+ A1 A1 ^, v/ T$ Z8 Q7 R% i s" N[uout,dudx]=pdeval(m,x,u(M, ,xout);( e8 Y0 [! i/ U c+ x }3 Y! W
plot(xout,uout); %绘图
) d1 F4 I0 \/ s6 T7 Z8 o0 Utitle('时间为 2 时,各位置下的解')
! U6 n1 ]; S2 U; c& c; {+ |1 a4 |xlabel('x')
0 A# F. P7 D6 l! c) J# ?ylabel('u')
" [9 T8 `# q0 T# o! Q%******************
) Z0 F. s, I; E$ p! _3 Q% ~%pde 函数% T$ C ^; ]; F0 D5 I
%******************2 \& h& A6 `; e1 q# ~3 d& q
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)* n6 ^4 H0 H3 O" }& _3 x+ U8 W+ K
c=pi^2;
- ]* a9 H; I6 b( K: h, Pf=dudx;8 E v. x w$ H# Z
s=0;
2 X) [! y: @; E' N1 o4 D- K%****************** 4 f ^% H# L$ ]0 s
%初始条件函数
! k5 K, R4 ] H1 o6 D%******************2 Q& w# _* J. j7 _( ^
function u0=ex20_1ic(x)6 g, s: ?' A) K; n
u0=sin(pi*x);# Z: B! \0 d& }' E9 k5 q
%******************
+ ~3 U4 Y7 N @. |% e# \0 P! _%边界条件函数
0 ^6 R# ~; Q4 ]* ~3 z: ^ Q%******************
8 l1 \2 D, C3 e8 {0 afunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
& ?5 H9 V; G- U+ r) Z+ wpl=ul;
& ]2 z9 k7 ^+ H9 Mql=0;
& V+ z! h( p$ Q* G# upr=pi*exp(-t);
# ]$ V6 F8 e9 b1 ^! `qr=1;
. ^& q R' d+ t0 O6 N
$ ^+ _3 U! n1 Q7 V' Y! u" |' F& o3 y- K# J
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
0 P4 t- b8 J% o$ N![]()
步骤 2:编写偏微分方程的系数向量函数
; V1 D1 U) q @( J+ lfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)' E& S1 N/ ?9 Q" @+ ]
c=[1 1]';
& P5 Y2 X5 `3 V9 b: U+ nf=[0.024 0.170]'.*dudx;, k! J- I4 ?7 @9 I; }5 e
y=u(1)-u(2);
0 M+ |4 { P1 ~. a+ FF=exp(5.73*y)-exp(-11.47*y);
9 M5 t! C/ D& o8 l; i6 Os=[-F F]';
1 j8 ^- z( V% }" F v5 a3 f1 a0 J; C' A& ?. s1 v: Q8 [; G+ t* `8 Y
5 K2 H+ @) d8 y; Z
步骤 3:编写初始条件函数: F% y9 P3 H: ?7 H$ s; D& }
, }# s* H/ z% ?- G* Q/ }$ P: cfunction u0=ex20_2ic(x)' S9 j4 k+ Z+ w5 l" w/ X1 [
u0=[1 0]';
' Y$ l9 @0 O- `( r, a( z* @
- Q& V8 [6 K( c& @% Z步骤 4:编写边界条件函数
% |( o$ [! E2 |0 U7 l! t& `$ X) Z: G8 f: M
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)9 ^/ @$ E- N$ |; A$ F
pl=[0 ul(2)]';
, U* s- O) M' m4 [- h/ Qql=[1 0]';
8 z; N4 l, _2 V3 B r! f5 Fpr=[ur(1)-1 0]';
0 O' e4 Z6 |" Z2 n' O2 eqr=[0 1]'; . l B, C6 R2 e; M
& a0 y& E& \' M8 ]; M+ ^7 @
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
. v3 g$ y% ~+ y4 f. c; D0 x3 T# E! {) A4 @4 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];
3 n0 ~4 H/ ?; o9 @" v- Dt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
. K3 s* }+ l$ I7 s6 |' ]9 \& X: b: |0 U- o: w
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
+ ]5 d8 u/ ?, g$ c2 D3 K2 |8 ?5 c% n) V* s2 q1 g+ A" a* ~9 h
function ex20_2
$ L; l) o7 j+ T: ?# Q. z! T%***************************************
]/ Q- L1 I% G- c9 p%求解一维偏微分方程组的一个综合函数程序
8 V4 l7 |7 }1 {* H7 `" D# V5 k4 }( y8 H%***************************************7 f Q9 l& z) i5 ?* F' t
m=0;
7 f; b8 C: ~1 T& ix=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
" n# i8 Q; c& F0 H* i- Q7 ct=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];6 v0 ]& a" X8 N4 B& y- ]1 D' T. D5 ]8 T
%*************************************
- _: Q6 G# U# [" J' ]; o2 k4 a%利用 pdepe 求解
/ t( `: M* O. _, ]: a' Z%*************************************
/ g. F4 T- Q0 A. B: J& Tsol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);% T; |/ r( F$ E2 u
u1=sol(:,:,1); %第一个状态之数值解输出
9 m' A* @6 x$ t5 b, Z1 t Au2=sol(:,:,2); %第二个状态之数值解输出4 |: e& L1 x8 \. I
%*************************************9 H' v) \: t- w- w
%绘图输出
) K. X. r2 V! W%*************************************
0 q3 V8 p: J. L, w. j7 b& w0 i2 J* p9 Ufigure(1); y2 W* |" |( Q) _
surf(x,t,u1)
+ Z/ c& ]: t9 ]; [3 vtitle('u1 之数值解')( y5 c+ x1 _7 ]$ D5 V6 u w
xlabel('x')
% s- W. X- L0 b+ ?0 ?9 c4 m/ \ylabel('t')9 `% s, l6 v9 {& d) ~8 K2 \
%8 W4 h4 H4 r, I1 D8 Q3 }. ~
figure(2) c! q4 H0 s+ w* X
surf(x,t,u2)
: y6 J7 A- |, `title('u2 之数值解')0 i8 L7 f( S9 B$ k2 T
xlabel('x')+ e* m$ t- v7 F% i$ w
ylabel('t')
% \: w/ c( {" }8 @%***************************************- y: M# J7 F) j- a7 c( K5 o
%pde 函数1 M% R5 k H" ]2 n
%***************************************
5 B9 x* A5 }: V! gfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)
2 {% ?3 V( i& a$ X0 |c=[1 1]';
4 U: ^# C. G$ g, f/ o. tf=[0.024 0.170]'.*dudx;
& c) }% p% P# H$ b7 Iy=u(1)-u(2);
$ L: z7 J% g1 m* Z, ^F=exp(5.73*y)-exp(-11.47*y);
0 q! ]/ \, j2 [( o$ L ` d hs=[-F F]';
8 g+ h, G: C6 z6 N%****************************************
6 W" B+ w6 f( g [/ Z%初始条件函数
- t4 {: }6 n+ [" J9 v$ [4 X%****************************************( k' ]6 [1 T d2 d, `5 c- Z
function u0=ex20_2ic(x)
; _' O1 G+ Y$ lu0=[1 0]';
k, _7 Q( n! Q' y( S h& ^%****************************************+ Z$ w; A. Y F! q4 t1 r
%边界条件函数- z$ a2 F" W4 J; d
%****************************************
# b. B/ f- D- h9 M2 j9 o! Rfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)5 t* v5 R% m& F/ w' C$ J
pl=[0 ul(2)]';
% w8 @. ?& Z( H {! ~9 a6 bql=[1 0]';/ R" H! q. s) Y( ~. S& g9 R; b/ @0 f
pr=[ur(1)-1 0]';7 R: M9 Z. c5 M1 ]# t: J+ e
qr=[0 1]';
0 R6 l0 z! B5 [; K |
! g7 a- p& t0 h5 h7 v6 V+ t3 n————————————————
: E1 q0 D, j; {+ k, s版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# x8 l5 w6 t2 ~: H' M: |) E
原文链接:https://blog.csdn.net/qq_29831163/article/details/897066924 }- n1 h6 o6 s- V7 C
- ]" r' \! C' R+ y3 g: T0 ?0 s
- Z' N' W- e. {$ o6 ~ |