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


% p) l: X8 s6 q& ?/ x, o( J* f' i
其中 x 为两端点位置,即a 或b
用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
1 V. t# M0 V8 z! ?9 L/ j$ B# y sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)8 J- g9 I5 H- S- D6 S
/ O/ B9 P" d( f4 \. b+ I
1 {) O' K" _/ d/ h% N+ R2 P4 c
+ f g5 R$ a+ F/ g' K- e
+ E/ z% n4 C- k+ B9 M" ^% L注:2 @9 Z& w6 q! i7 P- \ p
! w% T. h3 r% ~1 }) q( H, k: S0 B7 d
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
8 o' M8 j( W" P: }! ` F9 k+ I4 f% ]: ^
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
8 ?: B6 f2 G4 a1 E3 x/ H7 F7 Q# Q4 R1 n& |2 Z3 @
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。: q2 A$ ~7 y- ?; E7 G( A
2 Q; q6 q t9 c
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:8 `. s; a* `( f# @, r5 x) N: E2 @
6 b9 ~& R8 c9 G& e: R+ {[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout); q" C+ {. h& w6 g n9 C
9 g! i: g. n* ]
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。% G4 ~ ?; w1 L! z& z
]: F6 N7 K# d6 t' Q

; j+ b) o# p) x5 j- E
' x$ @# c4 w3 Q. [ k' |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." T! a C$ a, F: m4 {3 ~( `
F! \/ }; V1 e以下将以数个例子,详细说明 pdepe 的用法。
+ Y8 J( ?' ^, |2 H2 C. q/ P& l- i/ p5 t, ~; K
3.2 求解一维偏微分方程0 e/ `, Q5 x3 U6 }5 H3 _
例 2 试解以下之偏微分方程式3 v& F$ b( H0 X9 j& K0 [
# c% o8 c5 g- Y) {1 N
$ c7 {7 w% q/ ^: A( M) V- F
0 E# p# A l) l! P8 ^
解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
7 n8 D/ Y2 y+ Y, ^/ F- T
3 k0 J; Z- a9 y+ i \2 M步骤 1 将欲求解的偏微分方程改写成如式的标准式。
/ I' ~. m) o# G9 C
8 V5 d' t) k; N9 y
) s( s ]; i9 E
6 p: c. v& C d' M/ V. Z' y% a
步骤 2 编写偏微分方程的系数向量函数。
/ ]9 R. c: d& F3 V0 ?' e, j8 y- \/ v$ f' B( x, g* y; H3 t% u
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
* X) Q% l+ G. I4 Hc=pi^2;
! T' e! J Z* S% |f=dudx;
. M# d C( Q& G: |. q, bs=0;( F$ l7 T6 R; H3 b) z
: I! D! D; d |, Q* V
% i. t0 z& ~7 p
& V8 I; M. V! m- s& J% u& F( e4 d/ g- c步骤 3 编写起始值条件。
" b+ K, {6 I, M+ [! Y5 i
. ^, @* I+ S4 T7 \+ e8 zfunction u0=ex20_1ic(x)
2 I! W5 y6 B' E6 A! h8 Fu0=sin(pi*x);4 k2 B/ S* k- U0 o: X; M5 F
步骤 4 编写边界条件。
在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成

因而,边界条件函数可编写成
; `/ j, }- w' U, o8 V @4 Cfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)5 b0 I4 {$ m7 ]8 o" [+ z
pl=ul;
# k2 P( g9 i& w% q. Aql=0;5 T- R+ V) c" d3 j
pr=pi*exp(-t);
7 d. x8 \3 @6 F6 s# ]# Qqr=1;
- R/ N* C9 Z- C' W1 W9 b, B* M/ e: ?# p, V9 R! N, P
4 H8 g/ |: S: x8 e/ c4 D
步骤 5 取点。例如 d. m8 G) j, c0 }# ~3 ]8 {5 ?- R1 V
3 N$ N& I% H) l9 } C
" S3 i/ O h5 m5 _7 i$ ox=linspace(0,1,20); %x 取 20 点0 i3 U1 W4 c- j4 e S r+ \
t=linspace(0,2,5); %时间取 5 点输出* v, x7 _, Q$ N" o- l5 o5 g1 B* F
7 h( Q' ]( z8 b0 Z: Z
6 @5 E: C j: | }: {
步骤 6 利用 pdepe 求解。
. L' F# A' L. a& G2 U3 f: ~+ n
9 _ k! N* }0 r) l( ^, }m=0; %依步骤 1 之结果' b" s+ L, U% F$ O0 N* O' R
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); ; L) D2 h; k6 R" W
6 b. ~# ^' X( M' s
2 F- I5 O0 F& I# N6 B步骤 7 显示结果。
* B8 o5 H. T: W+ B( {" f6 s1 u1 B h# S" f& V
u=sol(:,:,1);
" o/ m; C5 F3 j' c0 E( Usurf(x,t,u): Y/ H7 ]' ^9 c# @
title('pde 数值解')
n8 q" E h# r7 ~7 ^xlabel('位置')
( t. ^$ _$ j6 A2 Xylabel('时间' ), R. o' Y- q, M0 B0 O
zlabel('u')
- K9 F% } b. G+ Q1 \2 T; u
* Z0 p: H' ~! c4 X2 f% w若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
/ ~ } r x# d l
0 p$ c6 e; U4 m V- `+ q- ~figure(2); %绘成图 2
: J' e; M8 c. n* H+ c+ x% \. |M=length(t); %取终点时间的下标5 H% k: D3 S/ [* I* j% Z
xout=linspace(0,1,100); %输出点位置
6 B g. S% r7 G[uout,dudx]=pdeval(m,x,u(M,
,xout);
; }8 u7 L/ m9 Splot(xout,uout); %绘图
# q, s1 W3 d" `* L: ytitle('时间为 2 时,各位置下的解')
& A+ l$ G# D! d: L1 f. @xlabel('x')7 Q0 v2 |9 s- S0 a ~8 m
ylabel('u') 4 U3 x q, L8 I
( M* m- v3 J5 ]综合以上各步骤,可写成一个程序求解例 2。其参考程序如下* T5 b2 t% s; I" J6 c" M
3 {! m8 f, K7 M0 j: @1 L: f
function ex20_1
1 G" b/ v, M. h( L# r/ E2 f%************************************
- }3 w) M6 x% j" h* b, Y1 U& P%求解一维热传导偏微分方程的一个综合函数程序7 Z1 X$ q4 O, G/ B5 T2 d3 ?
%************************************! o# \5 b2 N0 R( Q+ f7 e9 r! n: ?2 ?
m=0;% l. h0 B- Y2 I8 H1 e
x=linspace(0,1,20); %xmesh r% B. f9 S+ X) T& _: q
t=linspace(0,2,20); %tspan
+ u/ u9 }1 m |%************# u' Q) B @/ x2 B
%以 pde 求解
h8 ~% w; |, W1 p2 Y%************
3 Y3 y! U& ]; y1 A a0 P, n( h0 ssol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);4 d0 @7 I' G- M9 D8 q: U
u=sol(:,:,1); %取出答案
% l9 | \. M4 a%************- A# f' w% Y; f- L9 d$ U. d
%绘图输出
2 n0 ]2 ?7 N) X6 O%************5 D: Z, p s6 t" M
figure(1)! Z9 Z' O7 a$ R+ r4 [( a
surf(x,t,u)
) W/ A) x X2 r" a, ^title('pde 数值解')
. A6 h- C8 o& nxlabel('位置 x')5 k" L: _& y) h4 ?
ylabel('时间 t' )
( A0 u4 @% }$ G, t* Z0 \3 r& Azlabel('数值解 u')7 Z; M2 j5 p4 o+ b- h) a$ d( [. i
%*************2 i9 N* ^9 \& [6 y
%与解析解做比较9 }& K& G0 h) l6 e9 [! R& }2 {
%************* N1 ^" G0 Q7 R7 V" K: n, Y6 V
figure(2)
0 M! h$ h. u' A2 u' `surf(x,t,exp(-t)'*sin(pi*x));. F9 N' { D. F" Q3 v8 a/ P
title('解析解')
1 B2 e Q1 r; R9 w0 g \xlabel('位置 x')
, v4 `. w& U+ B5 P1 V$ p5 Pylabel('时间 t' )
# j5 s: a0 Z, {0 K6 X0 i9 ]* Vzlabel('数值解 u')) V ^$ _0 l! b g& P
%*****************
6 G, _7 U8 _% J. T%t=tf=2 时各位置之解4 S0 \( O6 H% D) q5 V2 d. r
%*****************
( q. i) f( C7 d) l/ ffigure(3)
* p9 Q; T5 {* A$ tM=length(t); %取终点时间的下表
4 ~3 f) e, V/ W4 ]- Uxout=linspace(0,1,100); %输出点位置% t7 B T' k r c
[uout,dudx]=pdeval(m,x,u(M,
,xout);, o1 u t" I! s! R
plot(xout,uout); %绘图2 c& f9 }/ Z' Y# p7 C) H* f7 Y2 A
title('时间为 2 时,各位置下的解')
/ g8 h! \' j+ [" _. cxlabel('x')
/ O# e `$ m9 bylabel('u')
* A/ B* j1 _2 k& }- E M%******************
7 T- U3 s( i+ }- `' M; k%pde 函数
( N7 l! P( X1 Y- v* H%******************
) F! O* s3 R l1 J: J% wfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)
l- C2 L, ~0 K& l9 r. Q% ~c=pi^2;2 I' n2 Y( r, s$ p1 }3 h
f=dudx;& E+ Q) I' r; k* M0 _8 @' o
s=0;
* p8 Q `$ w$ P4 r7 E. r%****************** % F0 [8 h. @6 g x ~% |+ F2 F
%初始条件函数, n" Z n) Z4 F8 ~) v4 C( Y4 n2 {
%******************# h' @ D2 Z- I; D3 i/ `- m/ D0 Y
function u0=ex20_1ic(x)
$ {* w6 C. _) m5 L d: q' Uu0=sin(pi*x);8 D; q" V* A# J0 k7 y/ [8 T$ \9 c
%******************1 a. t% k4 H5 T7 f$ P
%边界条件函数9 L' J6 ^" X7 e! E, u/ J
%******************
3 ~" N( e+ Z- T& t( y ^% |# Dfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
* B( W- y; i c+ Opl=ul;
5 K J) j& c. J& e6 B2 Yql=0;% H& S5 @" |* ]- r2 V, B
pr=pi*exp(-t);3 ]; [2 Z9 E7 o% r
qr=1;
/ _! }4 @6 l& @- v$ U( f
6 q' ^+ l1 X* d. O% k9 p% g" m% S* _1 s# P8 a% v
例 3 试解以下联立的偏微分方程系统
解 步骤 1:改写偏微分方程为标准式

9 ^4 x$ D6 D" i( A5 U

步骤 2:编写偏微分方程的系数向量函数
( w4 a% b- x2 n @! ~5 yfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)8 r$ q7 i) d4 |5 `8 o D& {
c=[1 1]';
( j/ I1 }+ R) P) {. k! M0 E: F. `% Mf=[0.024 0.170]'.*dudx;
" c, H$ J/ ^# F' z4 W1 Y5 Vy=u(1)-u(2);
4 R: y* i" ^/ ]# P& n4 r9 N ^F=exp(5.73*y)-exp(-11.47*y);. C+ r% J+ a, ]( K7 ?% L
s=[-F F]';
4 D4 X! \$ v% y! T2 `, X+ q
+ Z0 g% [: e% k9 d3 t( _3 t- o# K8 V4 q4 X
步骤 3:编写初始条件函数
9 I @9 T5 U- t6 ~4 o& T; i' }! `! s" v: x4 i1 V/ [8 I% V. X3 c# _
function u0=ex20_2ic(x)
/ H9 C" D. f: b+ t/ R* ^" k6 K. [( iu0=[1 0]';
# P$ f# u$ ?" K. }2 y) a$ m6 O' ^7 C; J. K' z, R7 U
步骤 4:编写边界条件函数
& K8 s" e5 W9 a5 u9 _. m, W/ t4 |1 n- T* ` o
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)2 d0 J! W- x5 d9 Q4 X6 G0 M
pl=[0 ul(2)]';
1 I7 {9 e) O2 w4 d' R: ?* \( z; nql=[1 0]';
2 e/ f; V( Y8 n+ c( O' W' g6 Rpr=[ur(1)-1 0]';
; s: V9 e6 @: L/ k7 w. L" X, _0 ]2 N0 hqr=[0 1]';
6 D0 i8 X( ]; i4 a6 |& j; x0 T" v( ]
6 q) d& ?2 L9 n步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,& B& F S8 c" f# w0 b5 `% p
/ I! C; b! E& K$ g# |8 ]- S, Kx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];$ o Y6 }& N6 q1 p& q$ C! S
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
6 x* Y$ f, h" a( p) K3 C `/ k k' ?
以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
+ l1 x2 Y/ H( ^ x' W3 P$ r0 `0 h/ T" X- Q3 p( g
function ex20_2
; `( D; f: J( U9 a. S%*************************************** / Q6 z: ?$ K* H) N& F0 w0 c$ T
%求解一维偏微分方程组的一个综合函数程序
5 D4 P d: _( X% q. q%***************************************9 w. s" R2 d- d+ v1 @9 `) w
m=0;; i& P5 r6 L) _
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];
, S3 V2 r" n4 q9 m3 x& zt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
# e9 i4 V3 J. n9 z: ?%*************************************
3 w# V O! B) Q6 r+ r%利用 pdepe 求解
# G4 u0 ^& A" `; ?- e1 ]%*************************************5 G( i/ E3 z& `0 y
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
0 s# x; a& |; ~u1=sol(:,:,1); %第一个状态之数值解输出2 W7 ]5 e1 ?. T9 N% |' x& |
u2=sol(:,:,2); %第二个状态之数值解输出: c, A+ R t5 \; M( m. A
%*************************************
7 p* q6 w' \8 Z" H1 b% }%绘图输出
6 A7 _& V2 |, O* a( H%*************************************1 H2 v- O4 ]. b: D( G8 a" [
figure(1)
4 O* T" V& i n/ vsurf(x,t,u1)
9 Y) S; i( a7 wtitle('u1 之数值解')% Z' S" ~$ U! \2 L
xlabel('x')* g0 a J* ~6 p! N
ylabel('t')
4 ~4 i! Q q2 d8 d$ ~! }, b1 N%2 \8 x# g& u9 ^- d. T" ^
figure(2)
1 \( Q9 N% ]$ O- K8 q6 dsurf(x,t,u2)$ I2 C& J7 G/ J# L3 {
title('u2 之数值解')
& F' q% F0 O* O6 Gxlabel('x')$ V. K& s7 N" O) P, r
ylabel('t')
$ i- ^) o+ y6 h& w) J% g( q%***************************************0 X* t& X7 R6 N, t- q$ i
%pde 函数
+ c3 L/ j5 K( @) @) v! \" z%***************************************
; q! K& k) g) l1 R9 Jfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)$ R- E: y" u. _( V0 ^) T/ i" z
c=[1 1]';
9 C1 B1 _3 N4 S5 I ^f=[0.024 0.170]'.*dudx;
4 K- n$ g9 }+ O4 k. s% jy=u(1)-u(2);
6 [# ?3 R& H7 M5 q8 {! b4 o% t6 eF=exp(5.73*y)-exp(-11.47*y);
0 v" T: G! c7 ^, u5 ~* Zs=[-F F]';3 J; @' p, G( ]1 b5 b+ Q
%****************************************! b2 I; N* ?" P# V. J) J3 m/ U* x5 ?& ]
%初始条件函数
5 g) X! L3 \4 l8 T* y$ u0 L%****************************************& i' O& ?4 u+ M* t
function u0=ex20_2ic(x)
" Z5 K: U7 ]0 v) b5 [5 A/ Ju0=[1 0]';0 S# Z8 W# j+ w( T- Q' J: t- X
%****************************************
# s. [) F8 M9 [- g: v%边界条件函数. a# O" G; R2 V
%****************************************
# o5 B) Z0 D& x$ x) xfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
z, \4 y& ~: c! B8 b7 {. j6 O7 zpl=[0 ul(2)]';
% {5 [1 e! \6 R& J$ @ql=[1 0]';
2 b, P! d$ `3 _; f! Z$ hpr=[ur(1)-1 0]';
% [3 W% |7 Q' b8 jqr=[0 1]';
A$ l5 U% {# u7 V; S
- i* @5 E/ \2 o( z————————————————6 g7 f& q$ a! P2 g: ?7 X. _8 A
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; k" W6 G. ^ O9 |# X0 e6 M7 i9 ^5 T; J/ z
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
! L; ]& q1 G0 R
1 a, \6 r9 _: M2 @
! o* v- |: C2 l2 m; o
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |