|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() . v. o0 t5 m8 f* {, }
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
8 ]6 i4 B4 E D2 m" ?$ O4 n# ? sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
6 s/ v, g4 b7 J# v. G4 S# c( D' ^5 M: F6 \1 m3 E
0 B; M2 L2 m4 F& I+ p
! E3 n# |9 _2 i' M( E- F( k
9 j6 a! I! V2 ~$ j
注:3 D7 \" n, X, G f7 Z4 r
& B+ ~7 b. l7 F% q5 Y- q |% @1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
% e( x# p Z2 L% H+ Q8 n$ t, y- h6 D0 o4 j, ]/ a( |
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
$ ?6 P( k" _! K7 D' z& c: i: j& D7 }9 K) [, m5 b
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。+ J/ F3 |* V9 t# c
# @& T$ s+ y/ Q+ D) r
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
8 K3 i) u( g7 P6 A6 I. V+ V/ @+ t% ?8 S+ M3 Q4 M
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)1 i V- K i+ K" }2 P+ d
9 n' E8 f6 v! Z( T
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
$ y; ~3 H0 E. v& b1 |0 G2 T+ M+ ]: P$ h& Q& J% d
![]()
+ t0 t6 R5 b6 M+ A5 m
: A9 P) Q- X' e; J5 ^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.
) \$ L C/ G2 W9 v5 ~4 i8 \. s
9 S; P6 ?% i: O3 e I以下将以数个例子,详细说明 pdepe 的用法。( y5 z* K& `0 A. s
G9 _7 x& F* v3 f6 X, N+ z6 W3.2 求解一维偏微分方程
, X5 V5 i7 [" X+ S% _例 2 试解以下之偏微分方程式
7 D9 L$ o8 v( w# [/ v* J3 r6 z8 I V% s+ B3 W
![]()
) x* z( Q$ f6 J- @- W
5 d! U2 Y! s: \1 \$ L, j0 C1 [: c解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。; L0 l, ]1 M. j% D- F' n* k
$ v R5 Q7 _, y& b; f- H
步骤 1 将欲求解的偏微分方程改写成如式的标准式。
, S2 Q- C7 M; d
3 e& {+ W4 A0 P![]()
9 ~- b4 V$ B& w; I
# D0 i: ^' ^% f( Y* v步骤 2 编写偏微分方程的系数向量函数。
# F8 T) c& f% e- x- Q, ~/ X8 I# L: Z6 ]+ k
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
+ q( r* N+ s& j& Z' p/ ^% x- gc=pi^2;
" N- }$ n; ]& Z: m' ~# `' F. Tf=dudx;2 @( h$ D- u- c1 t' v# [% h
s=0;
1 a0 h6 p1 G& H+ M* d& f( L; z+ u# ^& L. R; Q; ~8 m
' r1 @+ c7 f/ j) k& H, |0 X4 d0 W- c, A- A8 x. q9 l. c8 }
步骤 3 编写起始值条件。$ Q0 e8 x* a% C# i9 D
( F; o9 B2 U" n! }( Y# Ffunction u0=ex20_1ic(x)8 q: H6 @) R" Y% j% x# }0 Y# ?# G
u0=sin(pi*x);
7 i: A7 D1 B0 F- M: i" M步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 # Z6 c6 p7 w+ Q# F2 o7 A% Y! d# k
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
* b- \4 O0 e! P. Tpl=ul;
& @! t0 m' }# n) Fql=0;, X" W: t/ y6 `9 \
pr=pi*exp(-t);5 o) ?3 ^1 u" S* l, w
qr=1; 1 m, S- F3 s8 d- W2 ]
' _! b8 Z* O! E% q
" u6 m8 g7 s* ~$ f s9 Q, S. J步骤 5 取点。例如( t( A7 ^$ X3 i
3 w5 o2 ^( V$ q S
- Y% O$ o) b9 I1 L! S0 C; M9 Qx=linspace(0,1,20); %x 取 20 点
+ |/ c# Z5 [0 F4 P9 [* T2 ]t=linspace(0,2,5); %时间取 5 点输出
B# ^ {9 m+ V6 ~& u' Z2 Q
3 c7 u2 Y9 b8 l
+ V/ w4 W% @1 y6 o/ y \步骤 6 利用 pdepe 求解。& O% I0 K$ d7 W: m
" B, ]9 ?! ?" u8 N
m=0; %依步骤 1 之结果8 w" U/ e7 y* p2 _3 v
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); + r1 z$ b% I0 l! Y! Y1 d
+ u8 g2 e$ E3 S5 z5 @8 x
$ L# V7 e4 `/ Z* h
步骤 7 显示结果。
! I" t: X" Q8 J# |' U7 P/ i* A* n$ U
u=sol(:,:,1);$ }# g/ ]2 F" s( X0 d' T
surf(x,t,u)
1 {! ~6 X/ I* Y! j1 Gtitle('pde 数值解')
7 d* @% ?' P( `( A& U+ J& P7 ixlabel('位置')
5 r* @- Q7 `" w& ]ylabel('时间' )8 Z @5 W8 U% P! K$ K0 i
zlabel('u')$ o2 V4 a" T* a% L/ a* w V
" g$ L8 L: ?5 j" U2 T% h+ U
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):8 @" Y9 E0 ^; G
# M7 E: n) N; j9 efigure(2); %绘成图 2
; Z: ?1 {4 S* V! `$ @8 l+ F tM=length(t); %取终点时间的下标% D% k* f# C) B% ]
xout=linspace(0,1,100); %输出点位置
7 h2 n% ^7 j; m F[uout,dudx]=pdeval(m,x,u(M, ,xout);
* r; K2 Y- v" Splot(xout,uout); %绘图! B5 ?# ^- s6 H7 E, J8 o
title('时间为 2 时,各位置下的解')
) [' q1 a7 K& b% }0 n% Cxlabel('x')4 v, e* [# p8 l; y* A, s1 T4 \
ylabel('u') , N9 {! e6 \2 F3 s8 @4 A
" {8 L0 q5 k# k1 P- o3 ]
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
$ l, t4 R1 c; e* g; d# {2 X2 K, p; \
function ex20_1
5 J) h2 w' y2 }: T3 t$ G- u# a, e%************************************) ^* T- v1 F+ m# J
%求解一维热传导偏微分方程的一个综合函数程序- \5 v- ?3 h- k( l
%************************************# h. U* b0 M+ H2 |& G: ^
m=0;+ ?% e1 E4 Q! `. P! z y
x=linspace(0,1,20); %xmesh3 w, Y6 `6 `/ r J/ m) t
t=linspace(0,2,20); %tspan
" G" `& v; D- r& l" i9 B! s# a" E: b%************! R b( a0 h' M$ k6 p- ]2 ]
%以 pde 求解4 A' t8 K3 r" K s
%************& A- S, g1 H+ w3 ^
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
, `6 Y& F. C1 H+ _2 ^ Iu=sol(:,:,1); %取出答案
/ N* A: D! t3 X$ g7 W: Y: a/ U%************) b3 ?; g0 ~1 }, w: v- O
%绘图输出8 J+ b/ t1 h2 N5 y+ i4 @; v2 i6 U
%************
! k. G7 P# M0 K# _+ m6 Z) mfigure(1)
( f1 V- D9 u' i5 _# nsurf(x,t,u)
: T7 i/ l7 [9 y: z9 w1 w0 A9 @title('pde 数值解')
% R5 g3 S0 F1 cxlabel('位置 x')" Q+ n% C( o; X/ C+ y* l
ylabel('时间 t' )( G: t$ j3 G/ R- h' S& x2 q! X1 x
zlabel('数值解 u')
9 d7 @$ C1 u6 |7 @%*************
: G; ^1 c5 U7 }' A+ K& [%与解析解做比较 B7 l) J8 g/ P* \$ j( x8 C: x
%*************1 \, E7 K. W- e9 w, [( }% S% ~' C/ x
figure(2)
( g3 {' F9 a! e1 Rsurf(x,t,exp(-t)'*sin(pi*x));
8 J' V9 K2 e/ |- n) b; stitle('解析解'): v, ^$ R% i" K$ A7 c
xlabel('位置 x')! y& c( F3 Y* a0 t6 O2 y
ylabel('时间 t' )
# G9 [ |/ ~$ _4 }4 v; b/ czlabel('数值解 u')0 V5 E z d! W! @- Q
%*****************
) F) f8 F4 K' W, D/ C%t=tf=2 时各位置之解
. t0 K/ [( f0 J- Q! n%*****************1 i/ f$ {" A' Y, Q1 c8 A M
figure(3), V. b" n% G" Q! d1 V( c0 }. Y2 w
M=length(t); %取终点时间的下表2 {+ t; [ {, Z6 m O, S
xout=linspace(0,1,100); %输出点位置
. `2 T/ |6 ?, H$ h" `/ r# o4 |[uout,dudx]=pdeval(m,x,u(M, ,xout);
2 U( P4 x: e% [" ]6 I4 Lplot(xout,uout); %绘图; ~! L X0 h; {4 t8 k
title('时间为 2 时,各位置下的解')
) i' a; j0 _" H4 G# E2 N6 u" Xxlabel('x')
1 y( R# B4 q% R7 b! uylabel('u')5 ^* r7 k- H% d
%******************
0 H% ~! z8 B7 P" B) D0 Z- p- ~%pde 函数
4 t6 a: g9 P2 a _%******************( K! D- H% C0 X6 F
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
7 q6 Q, ^( g/ g1 hc=pi^2;
1 F! u2 d" e; k, ]f=dudx;5 k$ ^6 {) T# ^1 O' Z5 y4 R
s=0;
6 C+ q' S8 j+ H/ i/ g- V%****************** 1 i, _) w- A4 `
%初始条件函数
4 @" ]1 g. _7 s: d7 ] f%******************
+ G- M/ f# A x m9 s% ? N$ ?& ?function u0=ex20_1ic(x)
& z( @2 r0 A1 |u0=sin(pi*x);
0 R8 N& m8 I* q& v6 u9 D%******************
$ t3 j6 K% T& t%边界条件函数
2 U1 }+ }, L, q: L J! E. |5 J" d%******************
9 n1 N5 S0 L* ~% t L4 ifunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
$ D% K% g" G: @- v, a! Zpl=ul;
' C' L' F( B' ^4 A8 h7 ^& Sql=0;! v: A" u4 k* Y/ T, u
pr=pi*exp(-t);% }2 V" a& S- C# h9 m: D3 k/ M9 h
qr=1;
" I9 ~( ]# }7 A% [
" @$ R7 o. c: \$ }
3 r( z2 S' g. F' }/ p# r; ?例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() ! r1 z6 F2 X+ g0 q( k1 |7 T
![]()
步骤 2:编写偏微分方程的系数向量函数 4 { H C8 B# P3 U- `$ j
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)$ d+ b# R/ M( S3 @% }, w( R; r
c=[1 1]';
4 n2 x. K& t1 x- w3 ?$ uf=[0.024 0.170]'.*dudx;
# d) C$ Q/ n7 |y=u(1)-u(2);
1 m" n& e) T- T; X! IF=exp(5.73*y)-exp(-11.47*y);
4 r# ?6 @. Z( B4 h, \- rs=[-F F]';
% J) d7 L5 J- g: O; E( G4 l; J! {7 }5 |+ H: s9 i' J
: X% E2 o. w/ S
步骤 3:编写初始条件函数
/ M, ~; t6 \& `+ {. H4 k# w ]
function u0=ex20_2ic(x)
" C; Z+ q1 C) x% z$ s0 w% ~u0=[1 0]';( [% w( [* t# @: w+ `% V
4 Z% B+ _3 v; H, y* |. Q步骤 4:编写边界条件函数! K Y+ s7 L% ]# B" I1 Z Q
, ~2 C: W- b7 V1 B; Z" D5 ~( }0 O6 a! w! n
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
+ B2 ~, l& G, f9 ppl=[0 ul(2)]';
& Q" _# g* [9 F& ^5 G% p& V9 ~ql=[1 0]';5 x' h9 S) L) I2 L# l9 g7 c# A
pr=[ur(1)-1 0]';& F* B( o& }" G+ }/ S
qr=[0 1]'; * M; ]! T! R) ], H, c6 d8 s7 y
7 J" Q! L4 C+ G: M' P0 W4 _# U
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,* ^$ e/ G1 i8 h
x0 J p% E5 M6 i$ yx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
6 h* I/ c$ D) l- V8 q9 x4 et=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; ) D& H: N' O. T: N3 h( f" I, Z
+ y; Q# I" a$ f5 ]以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:: `' Q9 [! ?; F$ ]0 o+ {1 F
0 @5 k, y8 K- `, Y8 A0 bfunction ex20_2
; a1 ~' c0 H/ T. U2 H9 Y5 J- G" y%***************************************
2 i: F. ^: ?" r" M& K%求解一维偏微分方程组的一个综合函数程序0 y" `6 s: P3 r6 t7 C) A8 M3 o
%***************************************
! n* z0 N" `# Y& b, f8 K7 M' |4 v) mm=0;
% U; m7 u; b3 S- v6 _: z( Z2 ?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];
* a3 ]2 P/ D0 F5 ?! I& u; z% M; at=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];: J$ R9 d b1 ~, w$ |
%*************************************
|0 f3 a# e V p( q%利用 pdepe 求解
% D' C2 ?0 v; ]! C) r5 t4 I" M8 A2 P1 j6 h%*************************************
. [* M% l% d4 W& y- msol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
* Z: Q6 E2 P7 h( ju1=sol(:,:,1); %第一个状态之数值解输出: _) d( N- l/ e" M
u2=sol(:,:,2); %第二个状态之数值解输出
: x! v9 c k2 K) }0 V%*************************************
B3 w. n& k0 c" M4 A0 p%绘图输出) a6 d# F$ K% t
%*************************************& R5 g3 G# I) R; h0 [( z
figure(1)2 A' A$ F+ M$ ?7 t0 U6 f R
surf(x,t,u1), v) g* ~% g- V0 ~
title('u1 之数值解')2 A) s0 s( T, f3 s3 R( m8 y; E
xlabel('x')3 n" r1 w" D# q7 y" ~3 ?
ylabel('t')( F3 s6 ]( h# O; Y3 Z
%
! V; G; F$ |4 A, L1 H7 Zfigure(2)# S0 T5 x R, {& O' F3 y
surf(x,t,u2)$ R8 f) @" {: `5 l- _$ d6 B
title('u2 之数值解')
1 O' X d5 L& l2 x" Jxlabel('x')
& X- R: c0 O/ N- I# X6 ^1 d7 Q9 Gylabel('t')
/ I' w" X& Y+ v1 s& n w%***************************************
/ b4 l& G' j3 l" h4 a%pde 函数
- J: y7 O9 K6 P, X# Q9 ?. W; l5 T%***************************************) h8 y- l5 O; C
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
- A: w( @; b& l. {( @9 _c=[1 1]';- d3 V% ]9 i9 d9 E* l
f=[0.024 0.170]'.*dudx;' M, j! l8 A# @
y=u(1)-u(2);+ }! B; |5 k5 W5 {7 k
F=exp(5.73*y)-exp(-11.47*y);* o$ t! M& e, W8 G* s: a& O* c Z: J. d
s=[-F F]';
. v& U/ \/ _# H8 p6 V$ H: p%****************************************8 D5 a) S+ X4 P$ I
%初始条件函数# q( h! U# [% Q; u4 ?: S
%****************************************
/ @$ x/ H7 Q+ b( m6 L9 ?* Afunction u0=ex20_2ic(x)
1 P6 L2 w% n. m1 G5 E- @, N. f1 tu0=[1 0]';0 c0 R6 h4 b+ L& W5 y9 T9 H9 `
%****************************************; G. C/ q% T) i6 v. y) N7 c
%边界条件函数) B+ c4 [) K' L5 q8 q2 d, {7 p
%****************************************
8 P6 d7 x) V1 Qfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
* j& V: q; @3 `7 j+ upl=[0 ul(2)]';5 u6 X2 s* x l7 }
ql=[1 0]';& z6 m( Q6 f: y, S3 ?
pr=[ur(1)-1 0]';! M" p9 ?; M3 M/ `
qr=[0 1]';
% k7 k1 F( p+ U3 p: Y8 T" G u* w( R* C- M8 M1 {. V
————————————————: ^) _+ U, n8 E, e# }0 q- n6 q$ s% g
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! n0 o$ q& _) e- W- p$ Q; U5 t+ E
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
: m' r0 F) [" t# `. T# z+ Y r& D# H' z* L
" H8 q: ~$ {" m
|