|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]() 0 Z) c/ i+ [9 `0 I" X' d( `/ O0 v1 L
其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
) H& V8 B: q- l5 Z' e sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
2 s* c; F/ u Z& `: i7 G9 Q: N S# G3 l0 |
![]()
; x; S9 s! q8 t. f' N# e/ s4 T7 U5 z+ s5 \
! Q/ p+ j8 \6 t4 R" _
注:
6 y% g# Y) G. x/ q, W% G7 J9 E# V E6 F/ l. l' D: W7 I Z
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
1 u: c! x8 a6 U% {# p, g
' }7 M$ o2 r: }2 W2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
$ c1 F, X k2 K% t. ~9 {; r& S) U1 x1 p
( z8 ^! x6 Q- }5 e6 Z3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。$ t. x% W! t, h. A, u
0 O4 ^! f0 N9 P0 h' J
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
' i; M& j" N5 e/ s8 e- w$ ^$ B# N- j1 w' {, L0 ]( B
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)6 N2 F: K, U6 m0 E8 c% T' A8 l/ [
6 I" X# M" q1 j! q" Q7 D
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。2 ]4 [1 C* ?7 \) P
; S" [& [: | V9 y6 x![]()
( d2 e" E- r/ e1 c; ? F
* T+ {- @' [2 }8 ?9 S3 eref. 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 B9 o1 o# {4 h, L1 I5 G1 ^: I$ S; M
7 v0 v; S, V" `5 M4 a
以下将以数个例子,详细说明 pdepe 的用法。1 K2 c; m9 b* D* q D3 W' n4 o& m
& s w9 s" a% P3.2 求解一维偏微分方程0 ?3 o5 P. u4 I3 m0 V
例 2 试解以下之偏微分方程式$ H/ y( \. C4 Q' f$ U0 G3 w
/ \- X4 l' Q6 p' N
! x; k- N. T b% v8 m1 z
! z; o s( j- w* u" D8 B, @3 t3 ?解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。4 h% m q" Z" S/ e" D) q1 ~
7 [/ B- o# |" U$ C. Z步骤 1 将欲求解的偏微分方程改写成如式的标准式。
# n+ {: E6 J. z# o$ K8 w: ` E9 Q L" [1 ^
![]()
2 `* {$ f% x" v% }- d: \& H6 m$ h# V& v; b* J
步骤 2 编写偏微分方程的系数向量函数。, O5 k0 f- O; ?
- a' a. k$ {! a! gfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx) 6 M( _1 t! Z g) j$ l
c=pi^2;
7 A; w+ U9 G% r' Y' n, y6 yf=dudx;
0 \( W, g; g/ h1 Rs=0;
/ [- |4 p# u/ m9 y, q; h0 `8 c
; ]+ M& |5 v% e6 Q3 {. G- z% O& J; W4 Q" T0 ^
! @0 n6 r: [+ l! {& E7 g
步骤 3 编写起始值条件。
* z' v$ U7 m/ J1 |7 ^8 l* |% g8 b8 [
+ I! e) ]& g% [* sfunction u0=ex20_1ic(x)
* f$ {4 L. I0 x$ k, Z( Gu0=sin(pi*x);
( X! @( J2 E* `) W0 t" Y' e* c/ c; X步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 ; ^5 \8 @* K1 }
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
# R: r I8 D& e5 O2 dpl=ul;
: m& C2 ^6 P# \ `5 ^ql=0;
6 A2 R& _: s- ypr=pi*exp(-t);
+ H! m) U- ]0 }4 h# Kqr=1; ' V# a2 J$ i u$ F, z3 a
& _5 W( V7 Q9 q; t
# P' c/ N) x5 ~4 y; Y步骤 5 取点。例如- |8 h4 F& t5 q
+ v) M: Q$ Y4 ~
' @ R8 C6 r ]! jx=linspace(0,1,20); %x 取 20 点( @: K8 I0 {% ]
t=linspace(0,2,5); %时间取 5 点输出
" j- S' \/ D8 f1 U( U
& v6 W+ ]; F) l" ~: K
0 k: j4 F" `, k$ g1 k: I# u步骤 6 利用 pdepe 求解。+ }5 p4 x* ], Z" ^* x0 R
- K; p: U P" ]" t3 K" cm=0; %依步骤 1 之结果+ G# ]3 I' X" d( e8 u" X$ M
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); ) o0 Z2 M! t+ K6 G1 Q
1 k/ E: A; I* h) k/ g: g% o1 w
; j/ G- a) G9 K6 f9 ~" F
步骤 7 显示结果。 N. ?$ Z( \1 m* d8 e
4 ?; r0 X7 [( S( u }) c
u=sol(:,:,1);* q; i4 k' p5 t [7 |& E# \
surf(x,t,u)6 J& j: E$ J9 z
title('pde 数值解')
" n/ N4 V7 K j- C/ n6 V( Jxlabel('位置')* j: C7 c% o! I+ p
ylabel('时间' )
/ g' n& p- N( N$ K6 ]# O9 dzlabel('u'): g/ b' U ^& I* x8 G; E
4 M6 n. \! h% J( x& o若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):, N. b" G& B z
5 f" N" \" o7 E' o+ W* E9 yfigure(2); %绘成图 2
! J1 R3 |& M5 e6 i5 zM=length(t); %取终点时间的下标, p* s! r. e+ L- f
xout=linspace(0,1,100); %输出点位置
. V9 {) \5 g7 S6 T[uout,dudx]=pdeval(m,x,u(M, ,xout);) p3 `, D2 ~& L+ R. ]
plot(xout,uout); %绘图
% o. N# `! z7 X2 x" T# ctitle('时间为 2 时,各位置下的解')* v6 L( |7 h1 T, j: f8 @
xlabel('x')# |* _1 J' M, J* ?( R+ s
ylabel('u') ! f8 v0 x- _( j' c. s
; ]* m. n1 g" r+ q综合以上各步骤,可写成一个程序求解例 2。其参考程序如下
# I6 d( A& D. @ Q \, }! r. R5 f) u( q+ i' n# ~
function ex20_1
( o2 ~3 _3 o# O6 l2 [" G) z" A, x%************************************* G1 f" F% [! k
%求解一维热传导偏微分方程的一个综合函数程序
: N5 S: o3 C4 C7 R' ?# u%************************************
& V) \5 ] U6 Q1 bm=0;
" j/ o! I) \& y) Lx=linspace(0,1,20); %xmesh1 O* C6 |2 [' U9 S, f3 A
t=linspace(0,2,20); %tspan
! Z+ x3 V' ]3 P0 C U) ^4 r%************- z. o* g( B/ h2 @" y% }$ T& r; Q
%以 pde 求解
8 O4 T a* Z# k6 d. Q8 c* d# M/ _8 Z%************; Q j' [; R9 ~! j& [
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
' T7 w- v$ J7 `( y4 Z' x7 Q* Wu=sol(:,:,1); %取出答案
8 A% g. c5 ~+ O5 u%************* _) m4 T# |: j6 Y+ O0 W6 d5 h
%绘图输出9 r6 O7 U+ X! @4 \
%************: {" g3 A2 S+ f( Z- P# k0 k
figure(1)
/ b* f8 ^; }# P" F& U( Fsurf(x,t,u)" X1 z: v8 V R1 O3 w8 o1 ~
title('pde 数值解')
, |9 M( d F' }9 @xlabel('位置 x')8 j7 R7 w- ^9 s% c
ylabel('时间 t' )
) ?* x/ n: S# W; w5 _% vzlabel('数值解 u')
[! }" S+ J/ f% N8 Y%*************3 y/ G+ K ]" Y1 F# W% k
%与解析解做比较2 F8 g3 {! b0 e f6 P
%*************( f' C: ?8 ~+ E% z
figure(2)
9 {+ D a Q( [' bsurf(x,t,exp(-t)'*sin(pi*x));
0 {1 ~8 l6 [* B9 y( b2 utitle('解析解')) N( i0 B- ^2 o& Y5 i& s
xlabel('位置 x')" n/ |# I$ L2 k
ylabel('时间 t' )$ P$ @! y" O( I6 m
zlabel('数值解 u')/ S+ {% `, \6 X U# Y
%*****************
# s, A! N4 ]. x%t=tf=2 时各位置之解& m; a% U! p) T
%*****************- m4 i1 f3 H% k
figure(3). j# `7 }& u+ m i* T
M=length(t); %取终点时间的下表
* p, t2 R8 L- q$ z, }/ lxout=linspace(0,1,100); %输出点位置. S9 J8 R }* P
[uout,dudx]=pdeval(m,x,u(M, ,xout);3 T0 ]$ I4 o6 O6 J: N
plot(xout,uout); %绘图
2 {2 M0 D4 u; H" k$ ]title('时间为 2 时,各位置下的解')
! U# h( \8 j0 W/ U- M( Bxlabel('x')
: U; z6 E' r( @! ]ylabel('u')$ f+ F/ T7 R" F2 V
%******************
) [ n) o9 e2 ?' |5 [%pde 函数; q5 J, ^& U5 P& M( q6 Z
%******************
. e, K4 Z/ G0 n2 Wfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)4 s, o5 c6 x8 B4 f3 V4 \% @
c=pi^2;6 c, S8 ?, \& C
f=dudx;
" _8 s- g1 p6 s2 s9 ]4 j" T) h3 W9 @1 ls=0;% H0 t. U3 f! i6 A" y4 K1 q
%****************** 4 h; `. R; [2 C7 e6 Z; q
%初始条件函数8 v9 ]- Q: \4 ~+ n/ |
%******************9 R+ a9 I; k$ v1 h) m* D
function u0=ex20_1ic(x)
# B/ b) e& y( W% F9 x- q$ b) Cu0=sin(pi*x);* j F8 n( P; Y) v4 S" g4 ?( M) F! W
%******************
1 |8 p* H- U6 B4 Q( u%边界条件函数3 S& y/ ^5 r1 O/ G* |) O. D
%******************
! j3 q, F" ]( p7 dfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)- b* a, ?! Q8 V' `' [
pl=ul;
) U7 k( P; i: J6 d) I/ rql=0;
! Z9 C0 b O4 ^ }7 [) q7 i8 r$ ppr=pi*exp(-t);
( R/ M" a( A& i) y& bqr=1;
' r \1 \" D2 M; j/ h" B6 G$ W- K. i6 E0 ^- j6 K. y
/ N. v1 I% o- d/ p8 j
例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]() 0 p; b, o/ b/ e0 Z/ q; c
![]()
步骤 2:编写偏微分方程的系数向量函数 9 y+ y1 c7 n$ ?
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
. E: q: J7 A7 d2 ?6 o5 nc=[1 1]';
% N. J1 `. }: Q& z! l! uf=[0.024 0.170]'.*dudx;
6 E; L) N" @4 R& py=u(1)-u(2);
/ Y& S+ S& s$ w, _# b$ h6 k: ~F=exp(5.73*y)-exp(-11.47*y);
/ v# c4 D) P$ G" S3 ts=[-F F]';5 B" }8 @& n1 e4 U4 }
0 |) A# b, \+ W4 b- [! c0 F" L2 D( f- X3 Z1 w7 z
步骤 3:编写初始条件函数6 r# i @+ E' q w5 x/ b0 r
. g5 p4 a0 p# P$ k$ f* B. d; h
function u0=ex20_2ic(x)2 C: |% u; E3 F e' l6 _! v
u0=[1 0]';
: E8 g; `/ i5 W: F0 R* g% _3 `" L0 z) O" `0 v/ h. J$ [
步骤 4:编写边界条件函数
Q& g3 m9 N4 s4 d8 V1 U' [% q# u/ O/ O8 b$ s# f
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
( I% K4 ?' U. d1 Ppl=[0 ul(2)]';) n2 s2 w, a7 V+ L' d* s
ql=[1 0]';" j5 ]# ^$ b3 b0 \ T5 S
pr=[ur(1)-1 0]';4 e- K0 i& v/ b5 j
qr=[0 1]';
# W/ _- {# Y4 w4 x+ @
+ i2 h. Q# w4 a步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,$ X1 W% R$ {! I; w! d
& b) V5 K% c5 N& rx=[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 P% A) i* g- S! p- V# `t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
8 S/ T: {, P. J& D0 D
; |/ x' x8 I( h M. T以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
; c5 m- ?$ R3 N% J" J5 Z4 a L
( o7 {1 `( o3 H6 @! v3 @function ex20_2
. `# m1 l6 l K; r. \' }' Q%*************************************** # R0 p7 w0 Z5 A0 G* B9 w
%求解一维偏微分方程组的一个综合函数程序2 c: a8 ]$ ^7 N+ R; e
%***************************************
& J: W0 E8 Y) j3 J( e, Ym=0;
9 o' e: [- H0 T4 L/ v) mx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];4 i2 H- S0 o- _% P9 j) m+ S# x
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];- T/ j2 m; E# E* F0 m0 d; Z
%*************************************
- Z" i7 v$ g8 R: K3 x! ~1 ^%利用 pdepe 求解
8 A: _5 K' y2 d( I5 ] N& N2 _%*************************************
8 O2 s6 j( ]1 r0 w' N/ g5 Q) T; Gsol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);) s6 A, j! P& {9 X! x
u1=sol(:,:,1); %第一个状态之数值解输出# ? G$ {$ \; |* i5 @4 w" G
u2=sol(:,:,2); %第二个状态之数值解输出4 Z8 z: C6 u( J& w" l1 N! L: Q
%*************************************7 _) ?& o) f2 W4 ~, t5 p* `
%绘图输出- R, I: w$ _# g. g
%*************************************
& v' l0 S4 B5 v3 k- o7 Wfigure(1)
6 r) o2 g% r7 nsurf(x,t,u1)0 |. ?* O9 E' q6 }* @
title('u1 之数值解')" H$ r4 {: C( {9 `1 U. T2 M8 f
xlabel('x')
' ]. W; Y* J( F5 p6 i% i* Dylabel('t')4 g) _" L4 p1 ], F. C
%
: P, z% `! U+ U4 o8 h' Ffigure(2)
1 ]1 I4 T+ W' ^surf(x,t,u2)
6 n: ?, z' k, {& C0 atitle('u2 之数值解')8 B; L/ A3 ]* B6 S
xlabel('x')- T# |6 n, P' e) K, D
ylabel('t'): X' o1 W. K, p% v$ M
%***************************************: k, v- F4 `! K& P. o/ P
%pde 函数
/ L [, ]1 b" k+ c7 S" j9 k3 ]; ?6 z%***************************************
7 a+ h9 m, G9 Gfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)
, Y! t" I8 ]' p5 x1 {c=[1 1]';8 Y" U+ y. {& S3 v6 M5 S
f=[0.024 0.170]'.*dudx;
( Q% G. c/ y1 y9 v# gy=u(1)-u(2);
% D' _7 V' ?# M" A* r6 u8 IF=exp(5.73*y)-exp(-11.47*y);
8 [, K8 {* V& Us=[-F F]';- }) g% y4 l# {7 ?+ t
%****************************************
' b1 C) ^. L: |! Y) ^& @ j1 c%初始条件函数3 j1 a2 Z3 K( {8 r5 R) h9 |
%****************************************
5 U, o) C2 N2 ]function u0=ex20_2ic(x)
0 A( W8 {4 `' b" m. Mu0=[1 0]';( w2 g/ Y' Q9 Z4 S, t6 D
%****************************************
! A+ }( Q, w3 x* M7 b! j6 ]8 K J%边界条件函数
% z- W6 H7 {& }3 g%****************************************' o# d, Q; x2 F
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
6 }$ v {$ Q9 X! k9 H4 f- {pl=[0 ul(2)]';9 v3 L8 M/ q5 `; z2 |
ql=[1 0]';9 L# N4 @" ]. o9 {
pr=[ur(1)-1 0]';. W' z) y. @" q+ U) u
qr=[0 1]';
* \ C0 `/ `# _8 F
6 T9 g; ^& Z$ I" P2 A8 E X————————————————
) I- d" \) F- p! w' C) P8 w, H版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# F1 d9 I5 D& L# l! F! Z0 p' [
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
- W1 c ^- D( U: k |2 `& `# h
7 r3 W [6 y6 H1 I% B' g! n
% p# ~6 k2 \; C& c% C' V7 x |