|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
% D# s& U' l5 }/ k, b5 {其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
( _2 E$ y: ]) w( S% H4 O sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)) @* }; I; q* [6 ~5 K
! k8 J4 t, P$ `9 Q( R, Q8 E% k) n/ I * m& ~) ]6 M% B; u/ Y8 p
% Y* e w/ c' L `! ]2 `3 K
& y* M7 s' @7 [/ q+ E" E注:2 s# M/ J+ v- i* O4 k0 N) R
O* Y) v6 j8 L9 }8 k& p+ U
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。0 v# `/ O: w: D) @
/ ]4 D: V s) n4 x- r& k% j
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。2 B+ ~- F* U1 ~
8 V9 `5 e, l8 T: }3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
- V. c2 @) s) I, l( S* y) s+ ?. `, |( V: }
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:) P' h! h& t( E7 P+ [/ h6 t
) C4 C$ i" Y3 H4 ^ ~4 n[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
( E! O( b; W8 m2 m" Q0 \8 V3 L9 h# N' Q3 U. E/ L
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。5 U3 n$ o* o. o- @6 B- N
|# H; M! Y( p" T: G8 V$ D 3 Z; F4 a K. X* g6 S7 t
6 d* Y7 |2 |* g$ cref. 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.2 P, k2 d; r+ D% s) ~5 i9 ]* Z
! S& I7 L, a$ }以下将以数个例子,详细说明 pdepe 的用法。4 W- w6 L/ u5 y1 f. q" j" M9 p
" ^9 G- C$ I! O4 F( p
3.2 求解一维偏微分方程
5 J3 m8 s5 d* P- `! c, ~6 \; Z例 2 试解以下之偏微分方程式3 B* s1 t0 ?5 r$ h
" l, R* q" h- C- h1 u![]()
2 }+ ?; b/ C6 s; c) J. y$ M. E8 `
/ t' b; _7 l. N% s: g解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。) m0 k: P8 {- j" e7 ?! s
. t. Z1 N! b0 b9 O- p. `8 I ~# U
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
- Y# k) l. ~; K4 I) Z
% r( m5 Y' q7 b$ Y" M4 G ! O) Q# g2 ^0 _* {
+ S2 f1 S; q7 s" c1 G ^! P( O. r
步骤 2 编写偏微分方程的系数向量函数。
/ j& g! B# C0 W5 Q& |' o3 J3 M s2 G8 ]5 T
function [c,f,s]=ex20_1pdefun(x,t,u,dudx) 9 e+ s9 @2 \7 ?' r
c=pi^2;4 j# c' q) [: ^# h6 X
f=dudx;+ [) ^; v! J* }9 P x; @
s=0;
4 k& Y/ N, \4 @& _- ~! b
) h* Q! c) \8 r( w: [. q% u- k: G# B& E# Z
* q, p7 v* T) O, |步骤 3 编写起始值条件。
: I6 f! y* [9 Y4 A9 {- }" \/ U* \- H; |& N# A7 Q- `, z5 U
function u0=ex20_1ic(x)9 O6 u: ]- U2 t8 Y2 S0 r
u0=sin(pi*x);
! b' J( I7 H' M2 C步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 ; H- o0 A9 y5 Q9 o4 o. ?
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)/ x( C+ E# u+ n# w! w7 E8 W( S
pl=ul;, E+ Y0 f3 B J! u( W |9 r
ql=0;0 T. E2 u1 U7 a+ P# {6 m, G6 j- ]* g
pr=pi*exp(-t);
3 i) o- q" `0 Sqr=1; . P0 H b9 n! r: {
! v; K2 S2 F, Z- G t+ T) I
. j' L* b" ?! I- H' Q; b: _7 ], X
步骤 5 取点。例如
9 ~- ~: h/ r. _4 W3 D6 Z/ t
! d8 O' i" c! T( U. k
% G l6 ~6 a9 vx=linspace(0,1,20); %x 取 20 点
) C8 ^" Y- p, w+ b0 l! P/ Ht=linspace(0,2,5); %时间取 5 点输出
) D: e1 ]# z' k
# I! b. w1 n' b( w; e& }0 _/ L* g, r9 x8 R. |% h
步骤 6 利用 pdepe 求解。+ C) N; G B6 e% N* c
7 u4 }# D9 O+ i/ e" N8 N
m=0; %依步骤 1 之结果& g4 |" G+ R; e. e+ u8 S3 c
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
' i. n6 T: G3 B$ D" K, G$ f$ R1 M2 u4 V8 Z, }8 A
- I0 A( q8 ~0 c5 n, R9 J
步骤 7 显示结果。
7 F: E! b% I9 S( M+ W4 `
- s2 v7 k& {- F) d# q' Mu=sol(:,:,1);
" ?% r7 v: @) W9 }surf(x,t,u). y. S: [7 q: c/ n, l: M8 H1 a( `
title('pde 数值解')2 T" n' o* P" V5 D2 q- e+ ]
xlabel('位置')
2 [) O6 X6 J7 d/ P8 i. Gylabel('时间' )
. s O2 ~7 R Y% p. `8 _* wzlabel('u')
+ P; t) y6 c: [' u4 d
# S; Z: b. g2 ?2 X- _' ?- k若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
[6 h+ p. B0 _8 ]( |6 C+ c+ g" e- Q z, E! ]0 N- W* k
figure(2); %绘成图 2: c, E: @8 p- n+ m& M
M=length(t); %取终点时间的下标
& I" [: g" T$ I+ f" k6 T' F/ ?xout=linspace(0,1,100); %输出点位置7 M [6 D; p5 G T5 ~1 U0 b3 ]9 S" s
[uout,dudx]=pdeval(m,x,u(M, ,xout);; t/ z8 x; ?+ C; R5 D5 Y! j
plot(xout,uout); %绘图
2 Y# ^! E3 D' \6 S7 X1 |8 a8 jtitle('时间为 2 时,各位置下的解')* N) s) a8 c! b4 Y6 `
xlabel('x')
& _2 a8 z' Z7 uylabel('u') ( L+ X8 r @9 w, H8 B7 K
: f8 d2 \, k. Y0 _6 S7 I' X5 ~. k! j
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
$ X8 Z/ T! k& o0 z7 s8 ^ h& a0 w! ~! d% I
function ex20_1
+ Z5 J6 M) X$ A: C6 h4 q%************************************# V2 u V4 g4 I; C: S1 U. v
%求解一维热传导偏微分方程的一个综合函数程序
7 n9 ]$ ^% Z7 q3 j0 C# E D%************************************& b5 J7 o# N' A- ~9 u' h1 n$ [- E b
m=0;
8 }4 G# C6 F8 y# E( |! P* |x=linspace(0,1,20); %xmesh, H0 |) K1 i# q# n
t=linspace(0,2,20); %tspan
. J. |8 {/ e9 ^ w%************
+ L: _4 t8 C0 O%以 pde 求解4 k9 q. R% [5 O+ [0 k, a1 }; k& H
%************
; V8 @& N7 h! ~+ @sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
5 M& |* R; `# ^- G7 S. {u=sol(:,:,1); %取出答案
+ q! W z5 L3 p; ?%************" m4 y+ h5 c/ ^2 D/ o
%绘图输出
- b0 J! H$ a) I* \0 C) j%************( j9 d( W/ }( w$ p5 Y$ T" _' L
figure(1)& A; C9 H6 j9 e. f5 O% Y% Z9 D& \# t
surf(x,t,u)
( q2 `& s! Z1 qtitle('pde 数值解')
- ?: C* R/ U! X- H, Exlabel('位置 x')
! F; [4 r9 r9 n/ }9 Sylabel('时间 t' )
" ^2 ?) d* u( Rzlabel('数值解 u')
: Z0 T- }! x$ Y$ h& @# n* I% f%*************
! Q6 Z4 _6 S I- D1 A%与解析解做比较
L4 ~4 B% M6 [% f3 u. w8 q; S%*************6 z7 Z# M1 ~" V& y/ T; g
figure(2)
4 j o3 x. M1 a: C! L, usurf(x,t,exp(-t)'*sin(pi*x));
1 x- g" K2 J/ A! q& utitle('解析解')
4 H9 Z8 T: j8 Txlabel('位置 x')+ X/ ` \6 l, v5 o: u. u! z5 q% o
ylabel('时间 t' )' R* c. k W3 v& Q/ v
zlabel('数值解 u')
* t0 f2 k/ o5 T%*****************
5 p: F( M) \% z( s& |' N%t=tf=2 时各位置之解* _7 @6 n( Z/ M
%*****************. t5 [, G- ]6 S
figure(3)
$ r1 U2 W$ W/ T4 W M3 P* ZM=length(t); %取终点时间的下表
3 u; d5 ^' X! H$ Z: E4 L: a6 Zxout=linspace(0,1,100); %输出点位置7 q/ S0 B" z, E, O: Z
[uout,dudx]=pdeval(m,x,u(M, ,xout);
) h. T8 e( v% k! [4 \: X. Iplot(xout,uout); %绘图
, s4 S. Q/ C5 ?( G/ ctitle('时间为 2 时,各位置下的解')! p- U8 k y+ @0 {- N
xlabel('x')
6 C- i4 w8 D% w3 C; l! ^ylabel('u')
1 h1 j2 V# x+ ]2 N. E: }%******************1 R2 J8 z) s+ X* m& X
%pde 函数' u0 E( [2 R4 S' ?- k: S
%******************
' f) A+ d& v( B- y' R2 tfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)
+ h( T! w: l# }# u, S# R, {9 Mc=pi^2;. R2 ]0 f( r# t
f=dudx;7 R, k2 S1 J+ K6 N
s=0;* E5 p0 N$ z7 f! E* n; P! R& Z
%******************
2 `/ S) b% ~+ Z$ @6 a. r* }0 w" Y%初始条件函数8 D/ j6 t# N! M5 i
%******************
# e# b' T* v0 h! vfunction u0=ex20_1ic(x)% h) t% o1 m& G: I& c
u0=sin(pi*x);
3 a7 t3 f: o! i4 e2 t- Y& Z- l7 x%******************, [9 W. @5 s8 h1 \" I2 A
%边界条件函数
2 s W# I! C7 a* R0 p$ J%****************** x$ ?/ z# N1 N" y8 ^2 G/ R
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
0 O' _$ g( Q! Z" w$ g; D0 Cpl=ul;% X5 l7 S3 O9 i$ u# ]
ql=0;+ O' {, u7 {2 U! K G& x3 u9 I5 A% g3 `
pr=pi*exp(-t);
' ~' I+ I3 i2 j' [3 Z9 V' S" Jqr=1;& }0 u' e$ e) t/ U' H
3 i% }4 t. A0 I* ]. A+ @1 s
% s4 v3 C$ B! V例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
- u9 h- C: i* ~. C: q0 }& ?/ _![]()
步骤 2:编写偏微分方程的系数向量函数 3 ]) C0 D' z0 E' Y# {% B
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)" X" }9 |8 r @# F
c=[1 1]';
$ E/ N7 \1 C( }# B* J. ff=[0.024 0.170]'.*dudx;
) h6 a0 U. \* ^9 D+ ~+ ny=u(1)-u(2);2 }! k8 A$ k- R5 V& f
F=exp(5.73*y)-exp(-11.47*y);5 q( c& g9 d7 i! E, }2 v
s=[-F F]';! |& W4 n3 I* Y6 {$ k
3 ~4 F! V! J" s4 W6 S/ r, O, s- [9 \& D
步骤 3:编写初始条件函数' I, A4 p+ a( u' c
" _ G. Y# ]1 F/ s) d5 C& w+ `function u0=ex20_2ic(x)
+ p4 | J" t' n2 Su0=[1 0]';$ p: m; |$ H! @
8 C0 r/ A7 Y) T- z" G) x# m6 |步骤 4:编写边界条件函数* [" ?# V |# p5 W2 d# c9 U5 J
& j/ W8 [6 P; d* hfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)) E5 o& a' {7 P, k6 A5 b) e5 T
pl=[0 ul(2)]';7 G* Z) N0 q0 d& y5 e5 ^7 |
ql=[1 0]';
; Z8 R1 {. M" [5 D. m0 y$ Dpr=[ur(1)-1 0]';( B4 G0 a' D% @- i" L, l4 [( p& H0 ^
qr=[0 1]'; ( ] t, z4 [, B7 Y7 p
( P7 ~* S( C* P# S7 c( x步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
|8 j0 H ^, E& k' J
+ q: V% s5 E+ a& 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];+ a( Z- d! z' \
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
( q, D0 i9 h# K- e1 k
/ ^ f1 @/ _( G: M$ a- ^# f以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:& K5 c* B v; e+ A! d( F
( j- W+ \7 ], }7 H/ G$ Yfunction ex20_2 ]' U9 ~% z" e; }: q' _. ^
%***************************************
, I! m, Z2 g; X1 g6 W%求解一维偏微分方程组的一个综合函数程序
) u% w) |0 G) w5 x5 o0 ~' B%***************************************
; ?2 q# H' I8 G% w. {m=0;! L; o; a8 M- 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];
' R8 k7 L$ p8 Y8 |7 G$ ht=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
6 q9 C/ e0 x1 Q1 F" Z9 |2 O%*************************************
, z3 @9 e; X8 x4 @%利用 pdepe 求解/ y' [5 O! N P9 c: N! }
%*************************************) ]! r7 Q1 v+ F7 ~) O; C7 w# U
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);0 M' ~2 M( b8 k3 a9 M" b* L0 ?* I: D
u1=sol(:,:,1); %第一个状态之数值解输出" b! H n* X$ Z: O& A) W! a* h
u2=sol(:,:,2); %第二个状态之数值解输出
2 ~3 s" }% R: ^. p- U; E: O3 n3 ^%*************************************8 E) c# _1 c* Y7 a$ U4 _4 X& j/ K4 f
%绘图输出
% S }+ Q8 A% V9 v%*************************************
2 }" I+ a) e3 Z3 E) w7 sfigure(1)" v9 |" F% P/ H
surf(x,t,u1)
/ {9 v( h3 w1 {7 r+ gtitle('u1 之数值解')
8 G7 V( d# n. C4 Cxlabel('x')
+ w1 h3 B) @1 U, j( ?; bylabel('t')0 j+ K+ g' ~* J6 B. p7 f5 _7 S
%, M# s+ A8 M: B' P
figure(2)
* ~' B/ V% M- y2 C; Rsurf(x,t,u2)% a! c9 ^3 d$ F% ?1 w
title('u2 之数值解'), a/ R, F2 H' U3 x n
xlabel('x')8 B5 q6 ]% V: X+ F5 r
ylabel('t')
; ]- F& T# J" U" f7 G3 V1 z%***************************************2 n* m& S8 T4 i" }$ A y4 r& R
%pde 函数
A8 @- |7 g# B%***************************************" M* \# C1 ]% f% ~. |
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)* l7 X- C) B8 n# E! b# \3 J" X
c=[1 1]';
! M& F& t* j, @& tf=[0.024 0.170]'.*dudx; C/ t$ [8 N }5 j- ?' x9 m
y=u(1)-u(2);
O& u+ J+ H, b% [" E& E0 r& RF=exp(5.73*y)-exp(-11.47*y);
9 p: k2 w# G6 l+ m6 cs=[-F F]';8 ]0 h) }" v, D3 `
%****************************************, E6 Z; z; Q' L6 u+ P
%初始条件函数
/ s8 N' p+ w5 p3 E6 M7 c2 `8 s%****************************************
9 e+ V% n- V; Afunction u0=ex20_2ic(x)
8 _, M6 {2 `# u* z5 ru0=[1 0]';5 _# F8 [ J7 Z0 v8 j
%****************************************
$ m. o1 S8 B8 t! X%边界条件函数; v* H L2 T9 \
%****************************************: x$ R$ O8 G7 T1 S- |: ?9 Y; l
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
- r; s% H7 r! }! n+ npl=[0 ul(2)]';
( ?1 [: d% N% I1 Wql=[1 0]';4 Y/ l, P8 l, Y$ O$ T( s) J# R
pr=[ur(1)-1 0]';
4 @$ Y, o( K0 a' a8 \9 q F0 P, xqr=[0 1]';, B. P i$ B7 \% c
; ~6 _/ Z' l U+ u- n5 e————————————————
5 T& x% k2 m0 c2 y( Y版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" L/ f, U' W! [) n
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
, K% m3 e! G% B% E# a; j0 g' f6 k
. o3 P6 _ y* m# m* {7 W" r) ?- _1 e# z* ]( j
|