|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() ! F) a4 H& A( O: r1 ^, {
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
, B7 s$ X" {& C% b9 Q9 U( v sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
- r4 z; F8 ^2 r* s$ ~. [, k: n" K5 g$ N1 n& z
) ^. Q. I8 m3 v; a; q. S
6 z6 B/ e+ ]. C, J1 D
+ r7 N% q z2 b& K( D$ I+ D注:& Y& s& a4 S! D" \" ?/ X) G: f
& P) c2 j# l D* a9 d; j
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
, |1 [5 H: L% k: i5 r+ `/ j% S1 }4 N' B2 P' L
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。: Q: d* n3 d! G3 v4 {: A5 X
8 D( @0 ]! S ]5 b% W/ z3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
/ C9 u$ i* H9 F( W k, G
. D2 S" _# C1 M0 y% _4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
$ I/ [6 t f B0 h' c, M3 T6 e& C& A/ ?4 e4 q
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)1 E- \% j! X7 _+ X% V. o0 o0 a
2 Y+ E- R; M# S2 ~6 x7 N0 j. X
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。. p5 O9 J# A1 X
% C/ r$ w$ h9 s' `' c m% U0 H
![]()
# K% ?. W. V+ A8 B$ ~2 o
% f# C( Y; ~% {, ^" i' oref. 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.
. g/ q: x" L" C8 n: \# P, s
' \3 ^ K: I+ C# f4 d: l6 l0 c0 w以下将以数个例子,详细说明 pdepe 的用法。
, P+ H; h& U$ Z5 y1 B1 H+ o6 c9 T' \5 X! j3 [9 _
3.2 求解一维偏微分方程
4 y2 p/ H$ k: M% {+ P) I% z F- E例 2 试解以下之偏微分方程式
5 x2 u" B! s1 k& y5 O1 e; Q# A* d
6 W0 v9 a4 k& g* p / k' k8 i I3 ^0 o& A
4 d2 N# e5 l2 s$ H' W& V! h
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
. H& d1 y7 S: u% l& k" h. B- {4 P& Y4 p3 W
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
0 c9 M, J0 d: W8 v1 Z. X
1 ^8 _1 y: u3 P( j" J: @# M 1 O) t$ }0 a0 ?3 o
9 I6 y0 M; y( r d7 _. w3 H
步骤 2 编写偏微分方程的系数向量函数。
. g/ F& A% l z, K7 z
7 n7 J0 m% L( `- bfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)
( r; U% J2 u9 p' nc=pi^2;" `$ e9 W; k! i/ m% c9 |
f=dudx;( ]6 o, y& c1 C/ |4 z4 k
s=0;
9 k0 T$ d3 I8 I, F+ x8 [3 G9 f3 d4 p' ~# ^
! m; \# R5 W# \. O: ?8 x, @2 q0 X
1 c( ?6 L3 j# s步骤 3 编写起始值条件。/ S$ i4 c8 X7 p% R0 l& `, l/ q+ o
* @9 c; k* N; q2 U2 p4 |2 N7 Vfunction u0=ex20_1ic(x)
* V% O I0 I( Y0 {6 g0 X5 ou0=sin(pi*x);
. q/ O. }/ H. j步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 : I# f6 O. V1 b+ R; s1 s
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
+ ]. ^8 {, f- @ l" epl=ul;
% K4 U0 k- P& _6 kql=0;
J$ E6 v5 H! mpr=pi*exp(-t);( x3 h' B" z4 V6 ]4 \6 k4 \, T8 g
qr=1;
. I) ]7 J ~) J- C1 C! X
' _; U4 q1 S, z0 @1 Q$ v! _- s5 e- U
步骤 5 取点。例如
4 X% b% V$ Q/ U8 h3 ?( l( q
, l( n% i/ J# f( p% \% p; s1 j3 n" l& a8 |- i3 u5 H* T2 {
x=linspace(0,1,20); %x 取 20 点
/ I1 S3 A+ s4 Y' e' [' F R; rt=linspace(0,2,5); %时间取 5 点输出
9 M% i* N5 R4 z' Q5 V6 W ~+ W( a$ O, R# {/ x5 s& w* o
4 y8 `2 N$ g& F! x1 \步骤 6 利用 pdepe 求解。# ]; e- Q, a& `# X' {1 m* j: I
s6 V3 s: V6 G b
m=0; %依步骤 1 之结果# m; p% \3 O. k0 O: P
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
/ Z1 T+ z1 O# T0 y0 g' u: X# g1 g; M. D- e( n
) U1 Y, ]$ ^* [9 E. }4 B步骤 7 显示结果。4 {% O* d' H+ Z1 f3 w+ z
% k( |$ } `% A% f" t3 e: }, eu=sol(:,:,1);! b; c! K5 {& f$ S5 Q
surf(x,t,u)0 R' y5 x0 a5 `1 W5 X
title('pde 数值解')
( V$ m |- B" @xlabel('位置')# E4 \+ u. p D& b
ylabel('时间' )
2 c* `: g) M% I5 f. Ezlabel('u'), O. ]1 Q: O# b
& H1 X/ [, X4 p
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
" k9 z7 e& R* d$ S5 `8 b: `8 I8 q
figure(2); %绘成图 2
% g# |7 ~& m$ E2 i+ q7 _M=length(t); %取终点时间的下标( B" m) s) S2 J) [. n- x- ]
xout=linspace(0,1,100); %输出点位置
/ I5 A/ n1 r7 p1 Q2 Z7 b% w[uout,dudx]=pdeval(m,x,u(M, ,xout);) Y' g. h4 P$ m% [* o$ }
plot(xout,uout); %绘图8 s& f$ r0 @2 ?% \
title('时间为 2 时,各位置下的解')
' H7 v5 Y" C! b' ]3 ^xlabel('x')
/ }% W# I0 g }9 eylabel('u') ( } g! t; }* w! q, f' h; p: f& k
" D# E3 i9 O: V0 M0 i
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
' ]& M' L/ S* o' M: V
8 E$ c6 G8 f3 J; ]# g' Wfunction ex20_1. f$ K. L6 `7 h% {1 s* k; l$ k
%************************************ Y: p7 h- b( a$ S/ [$ b
%求解一维热传导偏微分方程的一个综合函数程序- N7 x" m0 T! U* Y3 g! w4 U8 s8 j7 G, e
%************************************2 k6 H* X7 L* Y
m=0;$ N' f) @- s! F& d! h7 O
x=linspace(0,1,20); %xmesh. L! l& N0 ^9 h# _4 i1 W
t=linspace(0,2,20); %tspan
$ L' \ g+ r" C$ T%************& {8 p4 Q6 |- o# W
%以 pde 求解
5 V! r4 ~+ t: D. j$ S%************
" k2 ~, f% z8 Q* fsol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);. x# {! L4 n, Z5 d: M; }
u=sol(:,:,1); %取出答案 F: X' ?; x7 H- ?2 ]9 I; L
%************
7 G! O5 @3 b. @. Q7 f%绘图输出
; I7 p$ }+ W1 H) a%************( e5 ^$ Y1 O2 r4 P# T5 K
figure(1)# h/ Y, r5 @2 M, v- A! L
surf(x,t,u)& c( L$ R! j' F( V" G S
title('pde 数值解')* a' E7 b( L, A, B* ?: j
xlabel('位置 x')5 ?+ L( _) c% W- s
ylabel('时间 t' )* N% v: Q [7 y" C# o Q
zlabel('数值解 u')
7 t0 b$ t( N% n9 y! o" b* o4 q%*************
* r. i* X2 G8 z$ q; H%与解析解做比较
3 n+ f9 D* ?! j& Q+ U) L; P%*************% J; s# s; Q5 M! K! y
figure(2)
! I6 b: M6 M# c$ dsurf(x,t,exp(-t)'*sin(pi*x));3 @- p; ]; \; ~5 ?; l- T! u
title('解析解')- R$ ]0 F' b. Q- _' ?
xlabel('位置 x')
1 {6 T5 L$ X( o7 sylabel('时间 t' )+ J, a2 ^+ d2 Q* n
zlabel('数值解 u')
1 D9 I0 c# l2 J0 a( ~%*****************
% j; r5 F% l4 J+ U* j: q$ N4 I%t=tf=2 时各位置之解% k5 g7 h/ R) O0 h& ]7 k4 {
%***************** Y/ q: i0 N! J" o. k6 m, g
figure(3)
& K6 ^- ~4 r( TM=length(t); %取终点时间的下表
: o( h: l! t1 E4 J0 O2 _xout=linspace(0,1,100); %输出点位置
) ^6 w2 n" E1 n[uout,dudx]=pdeval(m,x,u(M, ,xout);
2 ^6 s/ [: [) Aplot(xout,uout); %绘图% s2 L, i, J5 T$ i* h( p1 H9 Z
title('时间为 2 时,各位置下的解')
L1 U; I1 S4 w, y. ~. Rxlabel('x')$ K' O! P' K& C$ p( u3 G& r+ Y
ylabel('u'): @9 o) V h9 z7 ?' I
%******************
5 T" p, ^8 i2 W, ~6 C* z%pde 函数
; U" f+ j9 p0 g _1 i7 E%******************# u5 W V/ s Z G3 \( U: Z
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
2 q0 W$ x- o1 y, c* p9 d: ~c=pi^2;1 S2 p8 e! R/ Q5 ~" c+ v
f=dudx;
2 v5 P. A: O; X, |. M5 f4 Xs=0;
6 q) Q) e% C: J. Y( G" I%****************** 8 N! n) `1 z) k4 f4 }
%初始条件函数5 G9 X+ K4 Y2 P' h- }# j
%******************- U" C* L2 ^* p9 E
function u0=ex20_1ic(x)4 ~( q A( t1 P H/ S: N
u0=sin(pi*x);
+ v* n3 V; H* n d5 U, X%******************' k+ u. {' V4 _
%边界条件函数6 W' I7 D% V' T. e' t3 m
%******************
# }9 w/ N1 m: k! }# m0 Mfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
1 W+ `/ [* @. Y& i# H5 B1 O% m$ B9 C, z9 apl=ul;: d- D6 }: y- a
ql=0;
: @# ^+ j% {5 p9 O1 U" g, opr=pi*exp(-t);! A5 a- C1 r2 w7 q
qr=1;% W- b8 h( R8 d* e4 M+ ^: a: C
# j7 b. P; G) Z" g) c
1 g, ^1 i# D2 z; m/ c例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
; W, Y/ _) y4 N, {![]()
步骤 2:编写偏微分方程的系数向量函数
. e1 P9 L4 K) |6 s. ]function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
- c; Z( v& k+ q. U g7 E5 Xc=[1 1]';0 p, e. E, N% v( }# h4 `7 X; [
f=[0.024 0.170]'.*dudx;
. t4 o" Y8 T3 A$ K" j5 l! c7 ny=u(1)-u(2);
' m1 H8 M4 \+ c7 k( HF=exp(5.73*y)-exp(-11.47*y);
7 S; B, g: F1 {! G3 ls=[-F F]';
3 s; A- i) u' c: H5 [
( |1 n6 i' K7 c1 x6 s, C- ?9 f
; i9 c9 ]/ M& W3 b. `步骤 3:编写初始条件函数
4 N) o6 u1 ?/ R* f: R3 x5 X7 z, e4 O) S- j& X
function u0=ex20_2ic(x)
3 r3 y3 H, _, c; k7 F! `2 Lu0=[1 0]';
5 r( {6 ?- Y/ K) c3 i& j- {; `$ q* Z$ Z- e/ t: E
步骤 4:编写边界条件函数
' F s( @% G) [' _& b2 ?+ A {. [0 _' H+ l
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
$ }, p* n# k) o) p3 F* l2 V9 mpl=[0 ul(2)]';8 ~+ @+ [* M+ z7 f, k
ql=[1 0]';
9 ~- o% j: [, dpr=[ur(1)-1 0]';
, u3 b4 @1 H* i1 ^, zqr=[0 1]';
' [8 i4 p( B. ?+ j( `$ t* k" x) R+ y- k+ I- l6 \4 \
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
6 p. C, p0 X4 Z5 Y) R7 o4 R1 F
3 g+ k2 @, B: \5 n7 r7 ^' 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];1 V# [- f6 t& d- s2 k9 z+ x
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
! V! ]5 `: _* J( V/ G
; ]+ h4 N( C- G$ j9 |% i( X% r以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:; T1 p0 N0 T: w- i. u0 c+ t
j% H/ i2 j% E, g
function ex20_26 v- {6 I- g3 p! X4 `& y
%*************************************** ! o( d' F0 G; r: b d
%求解一维偏微分方程组的一个综合函数程序# L3 e, y( U' P" V" l9 E3 j
%***************************************
7 O5 ~: ~4 l5 E! u6 D; c' Sm=0;2 G# M! H2 i) M) \: i: L% k
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];/ @, O0 Y. _# O% M& q8 t+ Y
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
3 p! _& h; A M; B. b%*************************************
; r+ p" }5 I2 T4 O%利用 pdepe 求解3 x4 y1 N- O) X# Z8 n. N5 |
%*************************************
3 i8 ^7 L: P! H5 A# Zsol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
4 |+ N) p' E: \" Yu1=sol(:,:,1); %第一个状态之数值解输出
6 |' n) {. v5 `% M; Hu2=sol(:,:,2); %第二个状态之数值解输出
/ ~ g1 V0 o1 e6 @4 q%*************************************3 N+ e( m" c% v* Y
%绘图输出) B9 m. u8 J! }* d3 n) a
%*************************************& e1 o2 W+ X6 z2 [
figure(1)
x7 P- P2 T X7 P* k* Q9 ]3 ssurf(x,t,u1)
4 Y1 \/ `1 d5 B; l! Ititle('u1 之数值解')
+ O8 H3 d$ q& g9 `xlabel('x')/ R( ~2 e" T. }- v; ^
ylabel('t')
+ ~5 n5 K Y' z' m8 ~%
2 Q# x( w. J- c; g7 Y5 X/ E+ m' |! Sfigure(2)* u7 ]: U7 V3 m& Y
surf(x,t,u2)6 j' L' l6 C' T( o- z: \! A
title('u2 之数值解')
; G4 Z1 N: V% dxlabel('x')% q- K7 Y" G( B& S% B% y, Z' a- z) z
ylabel('t')
, B9 g; B& v- T: P- V. E%***************************************
8 ]& e+ `# G& K z%pde 函数
* `: T" X7 t5 M2 p0 z' \%***************************************$ E) v+ O/ J4 p$ S
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
6 L o& x) r" \1 vc=[1 1]';$ J% ]) J9 h2 r3 L% r1 h
f=[0.024 0.170]'.*dudx;. |4 z [( @! O1 c0 D) U/ y
y=u(1)-u(2);, g. K; x, U/ J: U$ O( l! n
F=exp(5.73*y)-exp(-11.47*y);
7 ^2 O: k- V- h& P( W8 Ls=[-F F]';/ _/ u j0 s2 _7 C. Z
%****************************************; u1 m- G8 h5 ~4 y
%初始条件函数
) h4 }: T7 ~7 n+ X W7 \4 t. h%****************************************& l8 U: ^1 S1 C' r
function u0=ex20_2ic(x)2 _+ y7 L. c9 T! v# ^+ A }+ X
u0=[1 0]'; R8 {9 ]; T; Y8 W: N5 M7 v; d
%****************************************- i q! T' G, p
%边界条件函数
0 Q1 g4 z1 q% q0 k1 D9 S%****************************************
/ x- i6 X/ [) s8 ?8 B+ I5 rfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
2 B" V, Y8 t) k& z: ypl=[0 ul(2)]';
1 h/ @; b& y( I% l, pql=[1 0]';
' o3 q% B& U M$ Ypr=[ur(1)-1 0]';
* @, W4 v8 Q( p% x: ~9 wqr=[0 1]';, w( c0 x- U- v) ^
/ f6 P& B8 R* N: i. ~, r& P0 W
————————————————' r" r# c) q% F3 {' Y
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 S7 d/ f% e$ \/ b原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
( M: ? ^: m9 r# V
, H# w/ `9 k9 S+ i) Q- R _* x- X. U! d6 h
|