|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
% d# Z+ y' [; m9 k1 m其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
) E9 E- {/ Y5 V* a sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)0 P7 L% i% b Y& `& X( H* q
; G2 o7 d% S- U
![]()
; U2 }! r; U/ Z0 l- n& v% Z4 E8 D4 E) w3 V1 j. y0 Y. h; j4 }4 o
$ _1 d/ ^3 W- {8 Y7 J9 |
注:* B2 m7 u9 U% m, R
" ]5 @$ ^ r# j1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。. ]; V. G# `1 e. I
3 D/ L' X7 H4 r2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
3 q+ M$ w& e( g: K
8 y" D; V7 y6 t8 a# Y6 D( d* a* H3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。+ H4 Q0 r! I$ ]6 ]
1 ]" F- o3 q o
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:, y& [6 ?4 f0 a i8 ~$ _
7 e# {# X( G8 x[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
# k$ q' h6 t- T5 p( i3 ^
4 ^ Q2 f0 c1 {! B5 c其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。) \. a* h, d) N2 J/ E- u
4 u# M. Z0 ^. o: q* @/ V5 C
![]()
& j: K3 k/ `4 V) [- f: Y. u3 o0 H( v+ q, c3 b
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 A! E* Q' c3 p
& z; o4 A' F$ c以下将以数个例子,详细说明 pdepe 的用法。
3 m# L4 W+ @1 g s" V; s- n q( A# M- l
3.2 求解一维偏微分方程) S) j# j( ?, r* B# n
例 2 试解以下之偏微分方程式
! x; C2 D: W% e. S* l
# ~( H- `8 A& O/ b0 n 8 P% F( D! Z% r1 {% k) q; T
3 V% g9 a: \: y9 I% a
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
& P- v' c/ V' h# M5 d& f$ L" l" L. |7 N9 i, [# W7 m
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
0 Y% L$ d k5 x; T0 n, }2 V, T, z
, ?2 Y( k g6 J: K9 S![]()
) c& | C* d2 Q7 [2 I! j& O1 g7 a/ D( p3 ~( ~) z% h' d) M1 m7 p
步骤 2 编写偏微分方程的系数向量函数。
- q: T! a( `/ P8 v* {' f/ z3 i; C% _% _( R9 V
function [c,f,s]=ex20_1pdefun(x,t,u,dudx) 6 {' ? f4 c1 N0 p
c=pi^2;
4 n; `! g1 e' ^" T7 `# Lf=dudx;; s5 X6 `5 h3 U3 H7 h: r4 U
s=0;3 i/ C- }" G" k7 v
6 L9 R5 P2 W/ i- w7 l4 U
\0 S6 v1 n4 P' N0 @, Y A( ^0 G. D3 h0 T9 p
步骤 3 编写起始值条件。3 i5 Q+ A4 K5 t, \
% A6 Z, C8 ]9 _& [. X" q4 y" `. efunction u0=ex20_1ic(x)
9 {3 |3 ?5 o( C& p- {3 P- ^u0=sin(pi*x);! i6 y& L9 o7 t8 ~9 A3 H7 A
步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 . b5 q, e8 l6 b) ]8 Q2 N
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)) I1 u0 {: d8 L; [: c: {
pl=ul;3 ~2 |. e2 d4 c" `$ i2 ~- `
ql=0;
8 ]) F# h5 z5 m9 b+ `pr=pi*exp(-t);& J2 t2 E) }1 d4 \* P' @ o
qr=1;
8 T* E. m" I% x% r; q/ C9 U6 g( j: U6 _
9 ^/ R) Y+ I; \. X" M$ @步骤 5 取点。例如& a0 E5 A) h* d: P3 A, [
, X5 ]8 K# s+ I. B3 u
3 [* t+ x7 X, X6 l5 G: g' kx=linspace(0,1,20); %x 取 20 点
" d. T3 {* }) `& Wt=linspace(0,2,5); %时间取 5 点输出
1 {- m) S. d4 a( k8 u/ `
. y3 J) ~$ c$ ?: v, f" Z3 _; [1 o" |+ `2 Q- x! x# B% c6 q9 W
步骤 6 利用 pdepe 求解。
, f$ ?4 o0 H' a+ W+ t. f$ {9 v- S
g% _) N1 ]3 F; Z& C7 pm=0; %依步骤 1 之结果
; j) i$ d% I; S" r; \4 Tsol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
@ @8 c1 Q' M* K/ n3 X! e% c b- [) d
3 \( j* M9 D3 r/ v
步骤 7 显示结果。7 ?' o! K9 M4 P/ x
6 S, ]4 m2 F: _2 a% L3 R+ Su=sol(:,:,1);
. o3 A; v: }1 }/ a0 N( @surf(x,t,u)3 P0 K$ I U9 h$ T3 x. t
title('pde 数值解')
0 k! `4 p( l( cxlabel('位置')% d0 v' X: b0 C' t
ylabel('时间' )
5 u0 s6 S" ]6 _! e- ozlabel('u')
0 p9 j: w3 M3 C/ G
2 |+ N( W( c7 `7 d# R/ L7 P3 O若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
) T/ b- k: n: D: n6 t( m. ~1 S$ B: o3 j2 D' ]+ x
figure(2); %绘成图 2
* A: d" s' N. L7 GM=length(t); %取终点时间的下标
, [6 c/ L( g! ~# _xout=linspace(0,1,100); %输出点位置0 @$ a# y0 H8 z, ~% F% h
[uout,dudx]=pdeval(m,x,u(M, ,xout);
2 h Q7 g% P% n( y" \plot(xout,uout); %绘图, V5 m* h7 y. ^4 H
title('时间为 2 时,各位置下的解')3 w# W% R- O- s0 B7 }4 q- J
xlabel('x')
" [, \% M6 T7 l- Vylabel('u') 2 K& i. S% i, i% H
8 V$ _: h, k0 p9 I$ t4 M/ p' j
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
( C- w& v( b2 Y1 x
* u0 V8 v. _' Afunction ex20_1
0 s5 |. d% a) ?( R%************************************
4 N0 q- [: E) ~. P- n9 d- m4 n: E+ ?%求解一维热传导偏微分方程的一个综合函数程序3 f* f) B V6 f& f& \7 B$ c& T
%************************************
" j- J' ^; l2 T, [: o7 @4 ]: L* p1 um=0;! d3 Q* f" E+ q0 t7 S" O% c
x=linspace(0,1,20); %xmesh. {! B4 [/ i- \3 O$ u7 |: ?* i% b& c7 ?
t=linspace(0,2,20); %tspan4 L# S% H1 H! J5 W$ F
%************
" m! q" \: n$ k; n%以 pde 求解2 q* t% h+ `3 P
%************7 j% a7 W5 j$ [2 ^
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
1 ?# r' c' `& |. s- I' mu=sol(:,:,1); %取出答案; @# B1 j4 p% S7 h
%************
5 _( t1 n2 L( Q7 u%绘图输出4 h* x+ s$ H' N' v2 q+ \ t# t
%************
1 f" D+ r( Q4 t& _figure(1). \$ H, R- q: D: l2 G
surf(x,t,u); c0 A) A4 W' k) R/ B' A1 R
title('pde 数值解')
! o9 d* q, G2 X; ~ xxlabel('位置 x')
2 ~+ R @, r# B2 Iylabel('时间 t' )) Y- w& Z: p' g3 \
zlabel('数值解 u')4 H2 @6 L! }! \% G/ O0 u% X& [
%*************) {; e5 x0 Q: E) R6 m$ J
%与解析解做比较
; C4 u$ E3 l' G: c1 r; a, V: y& g%************** @8 e, z! k2 H G$ i( _6 P0 s
figure(2)3 u( I* g; H; V3 M# d. H" q
surf(x,t,exp(-t)'*sin(pi*x));- O' Q( |/ ^6 D
title('解析解')
( f8 b: H; y. p# f2 Oxlabel('位置 x')
8 m% N7 ?- \$ _: ~ M' _( Oylabel('时间 t' )
7 O9 b5 s7 \2 p9 {" |/ |zlabel('数值解 u')) G5 l' [) w: ^6 m) D( Y' U: E
%*****************
. R' p' ~1 r, ?0 Y Q4 f: P$ E%t=tf=2 时各位置之解7 p" _1 C) A+ D$ H$ g
%*****************
& [2 Y8 d0 \4 H3 `! _4 @figure(3)2 \4 o$ r: ~3 W9 T% |8 g
M=length(t); %取终点时间的下表& d, a; `4 P& p- z2 W" J: r4 @
xout=linspace(0,1,100); %输出点位置
5 o4 p' y- U( T ~! }[uout,dudx]=pdeval(m,x,u(M, ,xout);# q+ {5 X8 y7 I& @
plot(xout,uout); %绘图3 }6 L6 B+ J, t3 _3 F# `, a1 H
title('时间为 2 时,各位置下的解')0 \% J) E" l$ V- s7 w
xlabel('x')
. O( o4 U# k+ m& A9 |ylabel('u')
. b3 |% Q R8 R' d: H+ O%******************
) u* \- L! v K3 l: Z7 S8 x%pde 函数% j4 o5 O7 s) }. y3 B
%******************
$ k" T2 H7 @' q. ^6 rfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)
. e, d9 c* [$ [+ E* @: Q2 w- ic=pi^2;5 R3 t% ^" r) w) c3 @2 G) L
f=dudx;* L; a! U: v$ P
s=0;5 V( s# j S) e3 B5 ~2 |5 V5 X: Z
%******************
1 }. g5 U4 X% n& q%初始条件函数* h4 X9 {; u2 Y# ~4 n/ h3 j& _
%******************7 ]$ c3 v. e8 d* a4 l2 m5 A
function u0=ex20_1ic(x) G3 k( J$ F8 k8 _3 h2 f
u0=sin(pi*x);7 U! ]& A1 j! w' a
%******************
4 C6 n7 f; X0 g0 e3 {$ w. ?" T. X%边界条件函数$ D( J1 a/ ^7 T
%******************
7 v8 V) h& Y" U8 Ifunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)" g# s0 n! p) p' {( K! s/ N
pl=ul;
( |" n' c9 G" M7 m dql=0;/ v" q! q& x. Y/ w/ b9 x5 y
pr=pi*exp(-t);
& s2 A% S- V$ L: [% g% l ~: H' O$ Bqr=1;6 M2 @, Z1 f' O* k4 s* a
2 S6 ?. i; H" {* L$ ` k- i( u
6 p- @3 `' d8 [9 N3 ^/ Y9 B
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
, ?8 `, M0 }( g% W4 l2 t![]()
步骤 2:编写偏微分方程的系数向量函数 5 B! R% u. h- {0 Y) q. \$ [
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)1 A# O R0 f6 ~# d% }1 t3 G
c=[1 1]';6 P$ d/ e) l+ V
f=[0.024 0.170]'.*dudx;! ~1 B' A% E. j% L% p: i; h& a8 b Z5 t
y=u(1)-u(2);: ^ n" [4 h3 }2 s4 M
F=exp(5.73*y)-exp(-11.47*y);) ^( L! D! G2 d& P
s=[-F F]';
. R6 T7 {" J/ f/ o2 ]0 c' ]+ z
5 E5 j, i$ z/ h1 U
+ s" M8 m& ~+ G0 T' A& y3 ?( V# q! s步骤 3:编写初始条件函数- k! T8 ~* p& ]" P' B( y
) o4 {$ ^8 I7 }$ p9 I7 |$ G5 w J9 Sfunction u0=ex20_2ic(x)
! D2 V2 e0 ~6 C' ~u0=[1 0]';8 D- }! {# u9 W- B. a
b4 X3 i1 @4 y8 H" U' _0 O0 L$ f步骤 4:编写边界条件函数0 z) S2 t0 E. `8 y' ~; q& ~7 W/ n
6 P, C. N$ y9 ~9 u; `& q3 a
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
/ w* z" A# K' T, xpl=[0 ul(2)]';3 Y0 l; c7 V3 Y# t; L
ql=[1 0]';
9 ^2 h: J/ ?+ }& {8 a8 g: W) qpr=[ur(1)-1 0]';
; ^1 y0 s* F, D& qqr=[0 1]'; 5 N& L: ~ ~/ f
7 L0 r; }7 [2 {: X) f6 P8 i步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
) H1 h2 J) B& D% w+ o2 d: f( U, N+ {: x/ P
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]; J. J; z5 I3 R
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
7 |$ g0 _ ]! a' X ?5 S
$ ?6 X9 x9 i6 G, d3 M以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
5 E" V3 r$ ?" _3 k
* w5 ~% e# T/ O+ G! u1 ^function ex20_25 L8 |/ n6 N' V9 u7 j9 c
%*************************************** / B6 B |2 f3 @: W% s- e$ n* l/ G
%求解一维偏微分方程组的一个综合函数程序
% n* `! _0 |3 e a1 a%***************************************
4 E) `5 N! Q" r" `1 j% C1 w0 P0 ^m=0;
! c0 A4 H# q" o9 {$ Px=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
b H+ ~) Y, m0 p0 Ot=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
0 [' v5 o8 Y! M( t8 {: U2 l6 a: a* G%*************************************. ?/ y9 ~" U7 _1 A( @# x9 R
%利用 pdepe 求解8 P1 R( p' `0 M$ {0 G) y
%*************************************
- H8 |3 |9 ^& I4 \) S8 ~sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);# p D3 K D$ f' d+ x. L* l
u1=sol(:,:,1); %第一个状态之数值解输出
3 b& N w1 V( ~6 g0 K# ?/ _% d! ~2 Gu2=sol(:,:,2); %第二个状态之数值解输出
0 Y3 _. f1 e6 P%*************************************4 h4 v% g! X' t8 C' e3 G) l8 X7 z
%绘图输出# Z5 x$ P4 q j/ q6 w' X7 _
%*************************************- }/ Y# v @, j2 @
figure(1)) `3 G7 n6 a: U: z0 e7 o
surf(x,t,u1)$ n5 J! }" {( m( R. n4 u
title('u1 之数值解')) Y# i0 n0 l% ~+ k# c2 G
xlabel('x')
" F( Q, S8 M% [! dylabel('t')$ @; H* L% u5 w8 W: _3 j7 \
%
; S! J' R% z+ W7 X8 Z/ Pfigure(2)
+ M9 l# K* X1 X3 usurf(x,t,u2)
/ \4 ]9 Z# T* N- D# stitle('u2 之数值解')
: Q/ d/ C# N# f9 o2 \: } Jxlabel('x')' f5 l/ u& T, ^9 g( b
ylabel('t')& { p( [& W I1 {
%***************************************
6 d! {3 q# `5 S7 X; ~. I6 \- \8 h- a%pde 函数
% B' |6 t. p+ G0 \$ Z%***************************************) T5 v- R$ p! N8 e
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)& z( s2 ~7 Q1 Z5 s2 W
c=[1 1]';
3 |, P3 a) [$ c! O& R5 T! E; T2 Mf=[0.024 0.170]'.*dudx;
7 ^) c( k$ d& ~, t3 v5 qy=u(1)-u(2);
( x- D7 Z1 u7 gF=exp(5.73*y)-exp(-11.47*y);
7 b: ^* t; e1 G9 |s=[-F F]';3 p2 S8 C* L9 z
%****************************************
( {& s' H- ~1 Z: B8 F- |6 S%初始条件函数; ]/ O7 {, u3 N' T
%****************************************' V% ~; d7 O* G$ u- Z
function u0=ex20_2ic(x)
" F a- E, r+ cu0=[1 0]';
, q% G+ z4 u" |; K0 f6 ~. g7 k%****************************************# ^; _: E/ G, w! C- m2 s4 ` f
%边界条件函数, O3 u5 U. ~ ]4 c5 D
%****************************************5 J( R( Y2 {( r0 S* ^
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t). i: `) {. J; D& ]8 o% B
pl=[0 ul(2)]';
8 s: ^* g/ Y; z: d! `/ Q/ d( m2 a" _ql=[1 0]';6 y$ T' H6 u5 J) F
pr=[ur(1)-1 0]';
* `. l, v9 X+ n9 H+ uqr=[0 1]';
5 B) a) g. I% U- ~: U* `, b1 A1 A4 |
* q' e' r7 m; X( x————————————————6 C% b( O0 P- ]! G8 j' ^) t$ z' i1 }
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* P; K, o5 D% @$ U5 S6 @
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
& v1 f* ?; c9 O) `9 F
$ K4 h+ c l# O+ q3 ~$ o3 c& w( p: b
|