数学建模社区-数学中国
标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法 [打印本页]
作者: 浅夏110 时间: 2020-6-10 10:25
标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法
3.1 工具箱命令介绍MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式


, Y& z$ ~4 r' P( L% k
其中 x 为两端点位置,即a 或b
用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
- B% I9 C0 A J) D
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)& q1 j2 B1 b4 m6 ^) s. R3 M
0 t+ |5 E; Z3 B, U

) h7 ^3 ^( N! C f& h! _& e. R% P- l. F" | ~
( }' }7 Q& A3 G8 c: ?) S. W* K1 K r4 W; {注:
: u8 x) ]# r. F, ^3 W+ o# l/ m' n. Z, q6 @. A# a
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
4 n" m8 \, B. F1 L* S7 l" ]
4 Z- |$ B3 B- J$ T7 Y# X2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
$ A9 B" ~1 |8 d L3 N6 _$ _
% ]# ]# Y2 }3 o1 `& u- h, q/ W3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。5 H) n6 ^9 T i" ?$ T! C# O" \ F! m
& P$ \; _2 e( L* v' C2 D! d
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:3 w* Y' H) s H
4 r2 @% |% x1 P/ q
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)1 X: n3 b. Q- K- d4 H2 k
6 l2 e9 p( e. e8 D. m" t. e
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。- c F3 J) `/ J9 }, v* a9 u4 }
- O' B4 P1 U% c, }0 d
1 A; \4 ]- d5 O
. i |6 Q8 o3 B; r* p; {
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.: P2 [6 k* z( m! j& M- a" O
- N' w* D5 {( f3 m9 v以下将以数个例子,详细说明 pdepe 的用法。
: N. d: l4 s% ?* ^
8 F6 Z# u8 a* C8 H8 ]! ~3.2 求解一维偏微分方程
+ o8 z2 O$ @5 v; J9 H% ~% C# W例 2 试解以下之偏微分方程式+ M* {# ?: [+ a& r$ j
' U' }- d+ c7 Z4 K
- R4 W: z* D$ F& q; K$ o% h& H+ R) S1 s1 i; P
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
# L% b. `( a( P E2 w* B& z. P1 o: }+ _2 x$ ]. m7 u
步骤 1 将欲求解的偏微分方程改写成如式的标准式。, i+ b u _' ~# [. }
% R& `7 {. A5 m. J
$ m8 ]( s6 Q J; a' O0 `: \0 d8 {5 w0 m4 g
步骤 2 编写偏微分方程的系数向量函数。' y9 j0 F: m: A4 o# R
9 g9 N& `0 R3 ~; W" Vfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx) , m% ^" Y D7 t
c=pi^2;8 u, _# Q9 R5 y; ~
f=dudx;
2 F( R" j. r0 Y6 u6 X& g1 j( Ps=0;
& n' F+ I4 a) z5 D' B! Q# I e* H x: j# z
8 w" c# S; _# C& j& W# a
/ c3 J1 ~0 b' E
步骤 3 编写起始值条件。2 {0 V- \5 W( \( n' o& ^4 M
# k ~8 O5 W: q n( }function u0=ex20_1ic(x)
, O4 z, M" I6 J" uu0=sin(pi*x);
* v" @# [. M: e% {. Z$ p5 H步骤 4 编写边界条件。
在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成

因而,边界条件函数可编写成
( j7 `! u; ~* K9 J
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
7 ?* C' B; Q7 w9 j; Opl=ul;/ A5 M2 X2 G' s- Z" A7 k7 _8 P
ql=0;% w, n6 r$ L* s4 q$ m# ?
pr=pi*exp(-t);" i! d$ J! ~2 v4 ]
qr=1; B6 e3 s3 O0 f2 V) d
9 m, \8 I0 G" w! @; l2 n; V, d- F7 o) S. Q' W3 H0 E y4 A
步骤 5 取点。例如
$ ~1 C. h$ [" @' D' z: R& g0 l+ w5 c, q2 z4 P( i# p
4 e- [8 k& d1 |1 C: qx=linspace(0,1,20); %x 取 20 点
: u" [* r( l( O- u$ I7 |; vt=linspace(0,2,5); %时间取 5 点输出
2 m ^) ^; b& M& u. \0 ^1 @8 G7 H5 \/ Y+ R
' ^- |# ~ j, i& G
步骤 6 利用 pdepe 求解。5 b1 u, U0 x1 Q6 r1 N& J6 L1 I( }- e
+ C3 K* m/ y7 H/ F1 Um=0; %依步骤 1 之结果
% M+ r2 r7 T. j6 h, _- Asol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); - L$ V+ l6 s& T K% S6 g. O
8 ~+ Y7 s- @" F3 w$ ]
7 f0 Z% ^ l8 a' J: L9 p
步骤 7 显示结果。$ v$ p( b0 c( x" M" d
0 ~5 B2 ~8 y N9 L8 r+ q" h
u=sol(:,:,1);6 E6 M2 m# G: g: {0 u
surf(x,t,u)
1 @' k, O. }* {( ~8 q. z8 Ytitle('pde 数值解')- s f0 I: j/ a4 V7 B' O
xlabel('位置')/ d( ?! K( h1 y, K
ylabel('时间' )' b5 d. D- a, q2 C& A! z7 ]
zlabel('u')) H4 c: R" \( D. |
6 P J' F: t3 B3 v1 `若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):$ ?5 ?" r' L1 K2 f6 u
5 H3 r {8 @, L& g" n, }
figure(2); %绘成图 22 S) f3 [1 ?4 S7 o( Q2 m! S
M=length(t); %取终点时间的下标
, @0 @6 Q& }( s8 E/ oxout=linspace(0,1,100); %输出点位置$ B( V0 n/ d1 ]. h9 t
[uout,dudx]=pdeval(m,x,u(M,
,xout);
# X2 R6 X! a$ c' q) m# a+ s% Xplot(xout,uout); %绘图# h( N: J. h( X, r6 k B! m
title('时间为 2 时,各位置下的解')7 E6 t0 c6 B$ s: \: F# ~2 ~
xlabel('x')
6 m( _4 J' J, ]; C( `$ Q+ Fylabel('u')
3 @" R" S" I4 G2 A# [
' [+ \+ y2 {) L. V4 J- R5 |综合以上各步骤,可写成一个程序求解例 2。其参考程序如下; ]! C- K ?) u' q5 m0 B
- ?+ p5 n4 }6 ]! x/ rfunction ex20_10 n0 z& U2 U% A u9 k+ W+ D( g
%************************************
x: u+ c2 M2 A- s5 U%求解一维热传导偏微分方程的一个综合函数程序
, ]) N) W! h/ F( [' H$ m%************************************6 ^' ^( M7 p* A# `+ Z: A, B: R
m=0;
5 B9 C" P. A P3 Z3 V1 K+ ^9 r9 Q* F3 sx=linspace(0,1,20); %xmesh
8 ], q2 E V; O1 @t=linspace(0,2,20); %tspan; d0 b" n' x; }& c0 X
%************
7 F) }0 @' t J3 v9 N% \+ X%以 pde 求解
/ ^; m0 T5 {8 T4 c%************0 j/ R* d. v7 d4 K
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
& z0 X- H7 o) \0 f" g5 w0 wu=sol(:,:,1); %取出答案
' X$ J" j& F6 n0 L! X* i%************- c) s9 C2 R0 e/ j
%绘图输出
# [0 W& p9 {+ S' ^' h l5 J%************- S( ]( y; B/ ]/ c3 i& U; `8 j
figure(1)
4 a6 C1 F- ], P# [' i9 D5 nsurf(x,t,u)
+ _* q$ t* @0 R, V- a& f2 dtitle('pde 数值解')& ~4 A4 |6 Z0 O
xlabel('位置 x')# U$ b8 E3 G! \% D
ylabel('时间 t' )
- d( `% n6 D$ v- rzlabel('数值解 u')5 q3 K1 S; ^, O9 c
%*************
8 n; b2 G6 Y4 |3 z! B4 o( h%与解析解做比较
" ^4 T+ W3 a2 S6 Z( N%*************
% P# K3 ]" f4 n& y, i1 P" `figure(2)6 |( P; L! |5 ~ d
surf(x,t,exp(-t)'*sin(pi*x));
& k% [$ t( p, ?. H0 ?1 b" b5 mtitle('解析解')
* R! Z# @! f9 o" U6 }% Bxlabel('位置 x')- `' j+ B: D. h9 f6 |
ylabel('时间 t' )
$ x/ \; c# d, C$ Mzlabel('数值解 u')" @* W, n+ w5 o/ b; ]4 r
%*****************' c2 s6 M4 K0 K/ r* X
%t=tf=2 时各位置之解' I6 c( v w$ f% ?& G6 r
%*****************
) b1 c4 P, r: o& Efigure(3)
! x- L9 r7 }9 @9 NM=length(t); %取终点时间的下表2 I7 n' h/ A. U" p1 {
xout=linspace(0,1,100); %输出点位置: v" z) L- N2 ^5 R
[uout,dudx]=pdeval(m,x,u(M,
,xout);- a; V8 ^+ ~# F! x8 S, O: x( O
plot(xout,uout); %绘图0 b7 ]0 C& m: }$ n
title('时间为 2 时,各位置下的解')
! P! w+ S4 W# n( q( S/ q- } F) Oxlabel('x'), z4 J5 S( y2 H/ S1 X' a: M- V* t1 Q- I
ylabel('u')
, [& N4 Z4 \6 V3 u% p%******************
; E. s0 Z W) D- W%pde 函数
0 L1 ]) W/ \" f% k%******************
. B5 D4 G) a5 [2 I! h: Ifunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)
" X8 a' A2 q. Z3 q- h% J) {* T+ {c=pi^2;
0 ?9 c! ~6 H6 pf=dudx;
5 B( H* O, `1 d* F: y/ a6 ps=0;
1 f/ t% h0 v0 A& u( ]# ~, e2 `%******************
- Y& F7 l: V4 V) c6 @%初始条件函数
0 k* V% `" M8 Y, P4 d: |%******************
4 E0 s: i Z" |! t7 Kfunction u0=ex20_1ic(x)- c7 U, C% l: s. S1 `
u0=sin(pi*x);9 [! j. j2 ~, C7 k; x4 `- E
%******************' ^0 y, k* j4 h6 c
%边界条件函数; I+ \8 M9 M9 `3 j4 ^: f1 q. V; {
%******************
& c3 {) z4 g8 Y: \# f. [function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)' q, f+ L' u0 y9 _
pl=ul;! I9 M. R \% f8 C; l& g s- d
ql=0;; G' o% w* ~! G
pr=pi*exp(-t);& E! B& A& G; I }- G6 _
qr=1;
# Z9 Y& B+ q. h0 I1 G" N9 x4 Z0 n
% E* ?; a8 S$ L7 i% Y
例 3 试解以下联立的偏微分方程系统
解 步骤 1:改写偏微分方程为标准式

# {0 z, T+ ~) T1 S! J* E
步骤 2:编写偏微分方程的系数向量函数
5 t, W' [1 o4 K" P: X
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
- a, x4 n3 k6 U1 H0 ` G1 X+ P5 zc=[1 1]';
4 q- w0 I4 R; J$ ef=[0.024 0.170]'.*dudx;
7 w Y# j J& t) d( v4 v- ]3 gy=u(1)-u(2);) m1 H% b( c9 C1 k a
F=exp(5.73*y)-exp(-11.47*y); X+ ]8 \6 G- G+ g1 {
s=[-F F]';
( u- z* J" W: x+ f& W% X& _( i, r* m+ x
3 @' x7 g9 w: e/ P8 ^9 W步骤 3:编写初始条件函数8 _8 Q& r! z! U; ]: G
. M, k/ `( \- U' T5 l9 dfunction u0=ex20_2ic(x), m6 ^* \) G; Y1 H
u0=[1 0]';' h0 b) m: u* A# G
9 O9 v1 o9 U! R. g" o3 @& m
步骤 4:编写边界条件函数: \) W# b8 Q8 ?
R9 F3 h, J& b) ^( ifunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)1 Z! e1 c; t$ P
pl=[0 ul(2)]';$ K/ o2 p0 ^2 }; T7 P
ql=[1 0]';
, a. ~+ @2 i( _ A. X" Kpr=[ur(1)-1 0]';+ e( m; a* [$ `4 n" S
qr=[0 1]';
( B* k( q9 g2 N6 n
0 r; c$ Q, v) |" U8 e, o步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
4 T6 m% C( B3 T( z2 [( W8 c. F5 D! w
5 d5 M8 ?1 L; e+ @' x$ Cx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1]; R( U! h, ^8 z0 q9 U4 U
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; ) X+ y2 T' ^" k9 ^- u# E
3 N& p% R- T: t* m0 {以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
/ ]- `7 T8 r A4 m( o: A7 x2 {1 k; q) z* j
function ex20_22 R7 S! j& M% |2 ^
%***************************************
7 S& i! Y1 @" q! p9 ]%求解一维偏微分方程组的一个综合函数程序
: `" z7 `* D' u3 }- g N1 ^, o& v%***************************************
; c8 c1 w; ^* \( M5 V5 Q: Pm=0;) I. x7 W: r3 E
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];
, _6 O7 L( g- j1 jt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];% I0 O$ R! V# v7 y
%*************************************. Z' r/ Q+ t* v
%利用 pdepe 求解
+ B# O( `' V- Y# S%*************************************
. k1 n: r1 T. O3 C7 @; Msol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);% k# d; `" c4 B W# T- k% c7 ]
u1=sol(:,:,1); %第一个状态之数值解输出9 C2 ]/ n6 ~5 }$ w0 S$ K
u2=sol(:,:,2); %第二个状态之数值解输出* }3 N! ^; P4 h0 ^. {9 b% y
%*************************************
- a; i1 I! F# v0 J1 K/ M4 S7 K/ z3 x%绘图输出
0 z# u/ F. ^& d6 Z2 ~( T% ?%*************************************
% ?/ E7 v. W: pfigure(1)
# o! g/ n& `* A" C5 V+ D2 L: zsurf(x,t,u1) o9 s/ B' ?) E- e0 R6 {0 S' @
title('u1 之数值解')9 G$ R4 r7 ~6 c8 |
xlabel('x')
C& |" U& l- U8 E' xylabel('t')
; @/ k1 B& C- k%
+ C9 b/ D! n* L! r% u! \3 V" Nfigure(2)
3 S- Z$ B9 k: S# ]% N/ Msurf(x,t,u2)
$ {7 E4 y) j3 y! @title('u2 之数值解')
3 b1 V( n$ o4 _% t# `xlabel('x')1 `4 i0 e! K# d
ylabel('t'). c2 Y% d) h' O% @( p
%*************************************** O5 W; |- \; Y! q$ k( o- K9 q5 A
%pde 函数$ P8 s# b1 N- E4 u; S
%*************************************** m8 c9 p; X/ t7 E8 E/ J
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
8 ?4 k& F' x% ^; |' Ec=[1 1]';
4 D& @% L. A3 cf=[0.024 0.170]'.*dudx;& ]* R9 `, v7 h0 h- F3 \
y=u(1)-u(2);4 y8 G. V" [' V" h# g f
F=exp(5.73*y)-exp(-11.47*y);& N: L" B1 w5 V( W8 [) H
s=[-F F]';
9 C" k3 R1 H/ F" }) N7 R6 q5 y* K%****************************************
' E% S% f4 S4 ?. [. h7 c%初始条件函数- y5 g8 a' o, S* Z( y' t
%****************************************
9 M: ~4 h( n! {6 f* j$ Tfunction u0=ex20_2ic(x)
7 V0 ~5 _$ J k7 m) }4 Eu0=[1 0]';4 ~1 L2 c) A+ ?
%****************************************
' `( d7 e2 t6 ?/ ~' P4 o, X2 A0 @%边界条件函数) Y3 Q" M8 \. Z4 t
%****************************************
( w c, A0 m6 j/ U$ P+ c) Y# hfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
- a2 I3 U% ~3 H- g9 Zpl=[0 ul(2)]';. D# f5 X+ E& X# X; \3 N
ql=[1 0]';1 q2 u+ W! z& K( ?; V# `
pr=[ur(1)-1 0]';1 C" O5 j3 o$ c: t9 U
qr=[0 1]';+ N; w6 C- u" w7 R4 {
# m/ F2 f8 {$ f————————————————
, \; o I2 ]$ Y/ H A" C版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 `. X g: X" Y, ]5 c% D原文链接:https://blog.csdn.net/qq_29831163/article/details/897066924 H2 x4 V7 J7 `+ J
; @8 v0 U# Y# J( `7 v+ j) m% _7 w" l5 a2 J; L8 R
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |