数学建模社区-数学中国

标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法 [打印本页]

作者: 浅夏110    时间: 2020-6-10 10:25
标题: 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法
3.1 工具箱命令介绍

MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式

- J+ f; W! I$ R% o* Z& n

其中 x 为两端点位置,即a 或b

用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:

* X5 ^- j( n3 m6 m
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
" c0 G' B8 [) U/ d$ t
1 ~% {; z3 z8 B" t+ W! o; o3 o$ ]: s. A% |9 R. x0 a

" O. o1 s$ W  ]" y* M% T4 W7 K4 ~0 d
8 g& j( H6 H' }! t9 q) _( y" a注:
2 J9 l% |: E/ x: Z9 o9 F; D2 J8 o0 ^1 ^/ h" p3 f1 r- R
1.  MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
# ?3 b0 m, o1 Y. q$ ]4 h; u9 `& j5 N6 F' H
2.  x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。6 l+ k+ ]* U5 d+ G3 b6 \/ l

( q3 s0 r6 V. K  t, J  X* Z3.  tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
" d" c- l0 E  P  g+ X3 F# [
- G. t/ i1 }, V$ @3 R! V4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
5 N& a# @+ }9 ?+ E3 t8 ~, C% `0 e% J
( `/ v. E) b  R2 v6 H- [[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
; z# E+ }* }  x4 A; \. G, m# C7 V( p; z  `9 y, s
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
: a- S. D* h( e6 F) n
2 o* C  d; V: }4 T, @, v
: x/ D, k5 l8 N& [  t4 q
: P5 q0 I4 ]  p- g, A( b# pref. 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 y0 i) f  H# `7 }& A9 r5 y7 e0 O! p+ K) W* L% V
以下将以数个例子,详细说明 pdepe 的用法。# b/ Q3 W) e! D9 K
6 ?1 s2 F( c* Z& U2 o
3.2 求解一维偏微分方程
6 Q4 Y& Y# z3 f例 2 试解以下之偏微分方程式1 x" s. s( s' k, R
8 j% |1 z0 D4 S" }, ?, X3 G' C

( N3 b  ]" [' {3 W+ ^
2 t& w% z. j' @& U5 _! B& |解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
! X" ?& }. s# r" r$ s+ o
6 |: {2 q8 `9 o. P. H* E# k. Y1 n步骤 1 将欲求解的偏微分方程改写成如式的标准式。; v- l0 B6 r" S

% p9 R& b: Z. V* j
# R; ~5 W8 m) P  w  }& j* p. D" {6 S0 u/ `) [7 ]
步骤 2 编写偏微分方程的系数向量函数。8 C  t! e6 k; g5 }! V
+ n6 Z7 h' m+ G; j, L/ d& i
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
! ^# F  l  I* X, T" J! Mc=pi^2;4 d% S8 u, `' d9 ^6 z
f=dudx;
! X3 n7 W7 P& ]/ z2 J5 {4 us=0;
, F. M. B# v8 _' o* \2 M: d0 D! I' }( e( z" r# o" G
% \. J+ ~. X( [: @4 X. n: `

( W% i4 S; \- k2 X: e步骤 3 编写起始值条件。' W7 f8 q: Q7 X& A6 O. J$ w

9 A  c  b, r) J  ~function u0=ex20_1ic(x)
, ~1 H6 ~* _: v! Q9 ]u0=sin(pi*x);3 F( b  V5 W5 e3 m

步骤 4 编写边界条件。

在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成

因而,边界条件函数可编写成

8 Y6 h* n) T: Z/ V
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
. W* M5 y1 u0 M: m  p9 D) ypl=ul;) K" [% G9 p; J5 {0 [) \$ K0 u
ql=0;
0 D4 J0 ~  \; d# b. K- X8 Z( ~pr=pi*exp(-t);% k: @5 }7 H) k2 u; @$ r. g
qr=1;
0 c5 g% P1 q5 S3 A9 p- |  w9 k; W8 l+ N% t4 u9 m

1 a1 v6 U% p9 C9 L; S/ H0 S步骤 5 取点。例如
. ?" |! `8 z! W% F1 a; G4 W5 w
6 o4 f, N  C" r$ I0 y
' w( I, ?7 I6 Y' Y, v7 u" Xx=linspace(0,1,20); %x 取 20 点+ Q8 t! E( o- i4 j& ^- j. U0 i$ [
t=linspace(0,2,5); %时间取 5 点输出4 i" e% J! s' c1 V- ^0 t5 ^' z" {2 o
6 z( f+ _  ]* g: S8 l

+ L3 e+ I; X0 F" Z" e( z步骤 6 利用 pdepe 求解。+ n; _% x$ X2 w" }

9 T+ V! P( y- i( b) @m=0; %依步骤 1 之结果7 b, Z4 [( l* m$ ?
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
5 ]( y! ]3 m+ p  ?$ _% K
- p1 E3 C3 p% y
; K" R7 O: K0 R/ h2 U4 S步骤 7 显示结果。2 J- Z7 R. s$ G7 i" [' M
- F3 O4 ]  b4 \& j
u=sol(:,:,1);
+ J" \& P3 G2 t; xsurf(x,t,u)
) D5 x3 I8 O5 Z6 @' j3 ztitle('pde 数值解')+ C9 \  A8 ^( G) H( B9 G# F
xlabel('位置')* U( I7 Q# b) w, ]
ylabel('时间' )0 r  H+ }/ s7 n* H' c
zlabel('u'): e8 s& C$ Z; G) Q+ N4 r" D
- E' O" K' L3 y( a9 z7 H
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):  Z3 q7 n! _0 r3 X
2 |0 Y, k# `  H) E- h
figure(2); %绘成图 2$ n" b% d1 E! R6 ?5 z
M=length(t); %取终点时间的下标
  u  u! g. T; C  l- axout=linspace(0,1,100); %输出点位置
! ~" @4 A! X' J2 p$ t7 E+ D[uout,dudx]=pdeval(m,x,u(M,,xout);" ]  m( B4 k& O5 k
plot(xout,uout); %绘图
+ ?$ x0 b! A& l) V" f# E6 Jtitle('时间为 2 时,各位置下的解')' t5 `/ O! d) E' w& C( ~8 D7 G# a" {
xlabel('x')
- `, {) I( y2 f5 S! T4 U3 y- |ylabel('u') : \6 B7 j) f$ }( y

& R: B. [- t1 H( K) }0 Q) _/ l综合以上各步骤,可写成一个程序求解例 2。其参考程序如下1 R3 P7 ?0 O- C4 q( C1 X6 H
8 l- \6 f" T3 N
function ex20_1+ l: o" k- L% `6 o) ]
%************************************
8 A, u. Y$ M! ~8 p3 q6 L% S%求解一维热传导偏微分方程的一个综合函数程序
" s* c& j" S' u! ?) Q3 m# B& a/ u%************************************
5 T4 J, ~7 J5 Dm=0;
* v, s  Q$ T7 W  X  b9 Kx=linspace(0,1,20); %xmesh9 _5 M2 m% F. z) r7 h! C3 O" Z
t=linspace(0,2,20); %tspan# i+ _# ]. J5 a6 q8 F! a! ~
%************
7 N9 f6 S6 ]) a  B) b%以 pde 求解, @) N# e" y0 }# @; N
%************
' t3 _* a$ M, msol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
3 m5 b# z" h0 x7 U* t5 ]u=sol(:,:,1); %取出答案
; w' a* J! ]. ?%************
1 |1 M  {/ h4 z* {. G: m) S8 n%绘图输出
& j6 |3 o: _  P# E: L3 H%************; k/ U9 f0 z' u1 l) _3 i
figure(1)
# C  K) e3 B# z$ f- f: {surf(x,t,u)# g3 ]& L0 ~' Y" M, E- W/ P
title('pde 数值解')
+ V! T+ N" e6 C, bxlabel('位置 x')) m9 }- `% j& ^, `- t
ylabel('时间 t' )
* l+ J  b3 k- i/ Q+ Ozlabel('数值解 u')0 e" X# J  ^2 W& d5 D
%*************
7 J/ H& T2 I$ X8 `- U% |: ^%与解析解做比较
) |1 x0 D) u; x/ _4 i% I9 c' d%*************. I# B6 _4 t& q) U: n0 K
figure(2)
# M! y4 ^% J! Msurf(x,t,exp(-t)'*sin(pi*x));
2 {3 m* `$ R/ h2 otitle('解析解')
1 L# Z2 E8 a+ ^4 Kxlabel('位置 x')1 T- e2 B! |% l) k
ylabel('时间 t' )+ t/ f6 }; m) R8 N
zlabel('数值解 u')! X" w! V$ q* C. h5 H5 e
%*****************& `; S/ }% |: o6 u
%t=tf=2 时各位置之解
" r/ C: q2 I9 m$ R8 f# Y! [%*****************5 @7 T6 d) ~6 T) W
figure(3)% P. v! `. }$ b1 H9 e& L
M=length(t); %取终点时间的下表
( Y3 v1 K9 D/ |+ u) b$ r, z  ?2 Cxout=linspace(0,1,100); %输出点位置
) r' \# n0 E1 r3 B8 k- d0 O[uout,dudx]=pdeval(m,x,u(M,,xout);- P0 W; ^9 Y- r9 g- f# g
plot(xout,uout); %绘图# [  |6 f' X' |* |" E4 I
title('时间为 2 时,各位置下的解')
8 }- T- m& `0 w+ A7 Uxlabel('x')
9 W7 g" z3 B1 C4 H. h$ xylabel('u'), X+ ?$ b" h) w
%******************9 K3 h7 I+ d7 z5 f4 l9 l
%pde 函数- `$ j* Z3 H! s- `$ R3 N2 ?3 Y
%******************
& ?  p( J6 |3 w. N3 s4 e2 Gfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)" q1 ?( D) t% t7 g8 R
c=pi^2;
$ d9 K, J% ?+ r2 o) Bf=dudx;
& q- r. i) ], ~1 W) t2 g9 Ns=0;. `" t/ K6 G# K& O& Z
%******************
7 k* \* E- d0 q' z%初始条件函数
/ q" P4 O8 H; }3 t( v%******************# u/ g" _3 q$ y% s% Y6 o  [9 P
function u0=ex20_1ic(x). |& ~+ C; a4 G
u0=sin(pi*x);2 J0 ?( P# K/ l1 {8 |+ Q6 V. P. q
%******************2 g4 U9 s" Q1 H( B
%边界条件函数* j3 C5 c% u: |, Z
%******************
: y- \7 s+ j" _0 m6 E6 ufunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
! F6 F5 d9 K; N' ~pl=ul;/ e) u: a* e: @2 r& ]- ?
ql=0;" d+ p* c$ ]1 z$ J8 T" v
pr=pi*exp(-t);- C; v6 O) y# \: ?& ^
qr=1;4 a/ s0 \5 K, R# E% \
, \* i# M. z, B: u- L
5 k, b1 o; J' ~
例 3 试解以下联立的偏微分方程系统

解 步骤 1:改写偏微分方程为标准式


- k( U, o+ d5 J; w# U% n: v

步骤 2:编写偏微分方程的系数向量函数


& G6 g( m# i7 k0 [& d2 mfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)  f! j3 g6 D' |
c=[1 1]';
  U( F7 ^* {* m# {& v% bf=[0.024 0.170]'.*dudx;
$ f4 v; L0 X- iy=u(1)-u(2);0 _( k3 U4 l$ y
F=exp(5.73*y)-exp(-11.47*y);  E4 b2 i3 M, q2 f1 `
s=[-F F]';
7 T: ~# B9 a% Z! ~- d  t$ F, G2 N+ w& M4 p, j+ _; Q$ W5 c

2 U" c7 `" n( c3 F; P5 n; r" M步骤 3:编写初始条件函数4 k+ o3 G9 l7 X, G' K- ?4 `6 K

: U2 S/ a* _+ O3 w, t4 f" A4 d: ffunction u0=ex20_2ic(x)" S7 Z- f/ H0 d2 y; G3 S" ]
u0=[1 0]';0 L) `# V3 W  p; F

/ D+ H# N% o& m7 ~' k) s步骤 4:编写边界条件函数) ^) ^7 m- [& m7 S' s6 I- {6 x

; V4 U: U$ T* b$ Qfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
+ ^# ^7 a; _* rpl=[0 ul(2)]';& I% k1 {3 T, t6 \" R
ql=[1 0]';; |3 L* k  o2 N; }
pr=[ur(1)-1 0]';
: I* x4 _/ W; n" l5 g' q) cqr=[0 1]'; & v+ N0 N! Z' a5 V) a' {7 f8 Q
* G: [/ A+ ]3 q% o" }; D4 M# x
步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
6 T) C; ^* y0 Q% @2 T
4 n4 y7 Z  H! c: ]" 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];
/ D! v7 f+ Z5 i! Q6 x# g+ vt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2]; 0 i* i' A7 D# ]  t2 w7 i& ]

4 z& I. F9 N3 w6 Q以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
# I7 _% U8 p8 C) {! d# X5 W- O6 S$ ?
function ex20_2
& `4 k& D, z$ t; h$ k6 j- P( \. O%*************************************** 1 G; \: D3 O7 c" A" Y; J
%求解一维偏微分方程组的一个综合函数程序
- V) n9 R9 c& ^' b, f7 a%***************************************4 A% z5 V0 `( [* b) p4 y
m=0;' }! |$ M7 P) |7 F& ^
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];
) r, m+ K! Q  p4 l9 |t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
# t7 h+ C: D* G1 k%*************************************
! [9 Y3 @  B1 o' F%利用 pdepe 求解2 Q. e. ?7 m- _4 o9 m# T
%*************************************6 n% r3 m& y1 Q% \( E0 w) p" i/ j
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);
7 F/ W9 o4 E! v8 O- nu1=sol(:,:,1); %第一个状态之数值解输出
+ \& l: C$ |2 x- _u2=sol(:,:,2); %第二个状态之数值解输出7 G6 Q" |; u; }( I+ ]4 a
%*************************************
/ n' ]) X: w3 ]9 V0 E/ S2 _; g%绘图输出, d  w- [! I0 i5 D
%*************************************+ R& ~9 ]( Z0 f7 e( |3 ~+ z
figure(1)
( Y) M: C  `! r. i6 c: _surf(x,t,u1)& M, S. y$ O5 d. h1 U1 y. r8 @# J
title('u1 之数值解')
  l5 n- Y* [7 p( _0 g9 [' o4 Zxlabel('x')# o5 R, G8 {* S% v" f
ylabel('t')1 D% W) h+ `, R# E& U, o% i
%
) r  a! j- F8 ^2 G; r: J% Ifigure(2)
$ T' G# ~( S! O  @! _surf(x,t,u2)
/ A# p$ M) e$ A# Ntitle('u2 之数值解')( \5 i: d* ?  r1 s/ R- H
xlabel('x')
, O& V; j: D6 A. t/ F5 ~ylabel('t')
0 y4 b9 W7 Z& Z4 e: f2 B. ~%***************************************
) D$ C) L1 q' g& L/ Y+ x%pde 函数- v; U8 S. s' H& j. n7 F
%***************************************& u. N( A7 M& {8 X3 O; |  a
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
7 j- T1 T! n' p0 x* `7 ac=[1 1]';+ @( I; y- [3 S/ |5 O; P5 l0 z
f=[0.024 0.170]'.*dudx;
* `4 ]! f8 f- t2 K7 t0 Wy=u(1)-u(2);0 c% i8 t9 h( i  |9 l
F=exp(5.73*y)-exp(-11.47*y);
: U6 V- W2 Y5 d& {# e; As=[-F F]';4 Z& _8 }0 a4 q# C( A' a
%****************************************+ G; J: P. p; Z
%初始条件函数
* N1 ]6 z' [" n" W& @: i%****************************************. C1 {6 p$ D2 R" s. P
function u0=ex20_2ic(x)
3 V- Q6 K' u6 L% {* @u0=[1 0]';7 y  w% d" }1 k' I6 d
%***************************************** r! c2 J3 ]0 ~
%边界条件函数! _4 g9 _' H0 q4 ^# c0 B
%****************************************
6 K, d: `5 _6 ?' t7 Bfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
  ^; u" u- s+ ~: v5 _pl=[0 ul(2)]';* `+ p& M# B% `  i; n8 B
ql=[1 0]';
7 H: K* F- h% b% ?; f) l) Ipr=[ur(1)-1 0]';1 l6 C6 P% `/ P) R9 B$ t: u
qr=[0 1]';
6 V) W3 u1 p3 l- D& u
& Y4 `2 x( e7 w+ y8 P————————————————
% G7 k, b9 @: k版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& }4 [! F! N3 N% Q0 {" O% h4 B7 _
原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692* y* E/ j3 K5 }# W

: Z" B, o, p/ h
$ G; j; x. Q5 J




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5