数学建模社区-数学中国

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

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

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


& @" b" U8 d/ d

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

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

6 V5 G- T$ h( H7 @7 \# H
sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)+ r3 c  Z( J2 U1 n. ]& W* R
" S# m. X0 ]  H  Z
3 K* y& d2 S/ O( b$ y
0 W. O' J# l+ p* n
8 |; q" A( r3 H9 C5 j
注:! E$ I  h& G/ s! z) u

( M0 W4 {9 E8 {; f2 \5 g% o0 X1.  MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
) O4 z) m9 q1 F, b
) c& [9 Q7 Q9 j2.  x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
' f$ W9 J4 _  u8 q( G. I; }1 {$ s  i& g4 z! U
3.  tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。9 ~: Z) Q/ K; r8 a

" O9 s2 n* z% m9 n4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:% I/ H  A9 |0 J
3 _1 o4 ]& @( h. w8 ?& F/ c
[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)
( Q: T) B1 w4 C/ c: L
/ I( n! K9 E8 r6 k( N% Y! d( }  Z2 p其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。, w& w9 c' c/ o5 ]/ U
0 f# \2 ?5 R: N

3 m$ ~& U5 q) T4 l
8 Z. i+ }/ r+ Mref. 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.
' k. F4 m; ~! F* i/ Y
/ t' N) H3 R( i+ O; }8 v$ }以下将以数个例子,详细说明 pdepe 的用法。
- A+ c( D9 s& r, |. D* E. A/ f) L4 ?' ^/ ]/ V6 ~
3.2 求解一维偏微分方程$ I$ C' J5 c# s7 T8 q1 k, l1 h
例 2 试解以下之偏微分方程式. d+ F- E6 p$ o" D+ ?

8 Q! D3 U2 E, J+ p+ |9 c! j( r5 q4 v& X' K) M) v# e; m: R6 y/ \$ Z

& v0 Q( Z$ [: c4 d: P! q; Y解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
6 m, u$ m* w( N2 a( |/ N
9 B& @' `/ ]; r, J5 `步骤 1 将欲求解的偏微分方程改写成如式的标准式。
+ {2 J: H* S. U" @6 H1 B% d
+ ~& P) f% @: p# S& F+ [1 E, b3 i- C0 y9 o4 k

2 h( j% u/ A+ E' i  S+ @8 T3 C步骤 2 编写偏微分方程的系数向量函数。  V7 @2 A8 E) Z7 f+ ]" R
/ i6 S9 x7 l& p! h! r# ]$ _5 ^4 M, t) j
function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
3 Z1 |, `; I' ^c=pi^2;, E; e, {  ]1 M5 m
f=dudx;8 C: Z" o$ C! v0 g
s=0;7 N. _# j% T: W, m2 H
- m  n: ]8 B2 O7 h
/ z. m8 N2 S4 o( i" }. |' }2 c. J
' r6 g5 x1 _7 G' Q& D: `9 n9 M
步骤 3 编写起始值条件。) h1 D+ r+ J5 m+ P+ V" ]3 c

( a4 q+ _7 K& J9 ?function u0=ex20_1ic(x)
  z" y  Y2 Y$ |% B% ou0=sin(pi*x);5 R, z$ ~4 X$ n0 w

步骤 4 编写边界条件。

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

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

( Y  d: ~9 g' z& Z' W; d5 p
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
7 ^& p8 `+ i7 k: W% ~: R* Vpl=ul;; q" @6 s) t0 X0 K! D) o5 z
ql=0;
( e7 X- l. @- h* vpr=pi*exp(-t);
) c- ]. R0 B) n5 o( p) Jqr=1;
" E# v; g2 R) G" [
, l& e7 U5 K9 t7 E: p. B! D1 e. [
' N5 g/ P9 C1 I1 ~步骤 5 取点。例如
9 C9 s8 \- ^4 ^$ I8 p: p$ g3 W7 C2 P' u: n
( X# r4 I2 @- U1 }/ F4 @6 ?
x=linspace(0,1,20); %x 取 20 点
5 \0 M; B  g5 F% {8 pt=linspace(0,2,5); %时间取 5 点输出
: W& Z) L7 ^% H. ~; _+ `! L( i" U$ u. j* e" ~$ ^
4 @  O3 ?! ]7 F5 |  ^, {
步骤 6 利用 pdepe 求解。
) j7 Y6 A, v( j6 w
) {3 C( T) K( n8 p' Bm=0; %依步骤 1 之结果" c9 i7 r6 h% j! q
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
& V. G: Z( V, O% q! f3 p6 H4 c" |
" B  r+ k7 ]1 A  y8 r1 [1 W1 l  \/ l1 K6 d. d6 G, g8 `( q5 L# l# y
步骤 7 显示结果。4 L4 `6 g% G5 `2 E0 [

  J0 z3 z+ d; t6 Mu=sol(:,:,1);
! I# k# g- f2 M2 Ysurf(x,t,u)$ b% n' E! g7 z1 N- z& o( d
title('pde 数值解')
. d+ Z' N" Y' q' l/ Xxlabel('位置')
' x9 Z9 R% a3 _( z8 q0 r8 }+ Lylabel('时间' )
$ {" y# U7 O, x" \: Szlabel('u')
& p5 @: J5 c& p0 y1 Y. O( j1 K  {% ?0 L2 a
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
9 ]! w. a" g$ K8 u' S7 x% R. y+ k7 M: q, s
figure(2); %绘成图 2+ j+ ]3 B' e+ g( I  c7 }" j6 W. r
M=length(t); %取终点时间的下标
$ g. k; S" ~" o& _xout=linspace(0,1,100); %输出点位置$ E4 Q, O2 Y% p3 l
[uout,dudx]=pdeval(m,x,u(M,,xout);
! a  |8 o! q1 V- k* p. V( j- U5 Jplot(xout,uout); %绘图
3 v' k1 x0 F9 i5 ^& wtitle('时间为 2 时,各位置下的解')
5 z( k$ P# d4 n5 h7 s4 `3 _" C# N2 Nxlabel('x')1 s4 U# B" G3 x5 ]) s& o  ]; U
ylabel('u')
( _- u' f% I5 B  V$ a
$ g, f* Z' J: [1 n综合以上各步骤,可写成一个程序求解例 2。其参考程序如下- m1 D6 F8 C+ \0 {

, a, |6 U, V  ^1 I2 n* B; Mfunction ex20_1& _/ a6 I  m6 S5 {  r9 K1 X1 p1 ~
%************************************$ T. {# @( ^3 Z( V7 v
%求解一维热传导偏微分方程的一个综合函数程序
: Z$ w$ [. d) z. J%************************************
) Q  W7 G9 @; C) w3 a4 b5 T: cm=0;' {& j; J7 a& O) i! D- t% D' }: t) ^
x=linspace(0,1,20); %xmesh
( H- K4 }. e2 B9 wt=linspace(0,2,20); %tspan4 Y5 E7 ~3 E" w9 W$ [) P! P2 k% @. o
%************
; O. O' z( E' X; X; g. t- b/ D1 A: v%以 pde 求解2 \! z& ?" h1 T( }# C
%************! e, a, u% F  p# b% Y0 e6 J+ d
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
: F8 c) w: h# M. Y' c7 Bu=sol(:,:,1); %取出答案" `% H! ^, X  j4 o1 F
%************
1 ^5 G% M! b3 y# w%绘图输出/ c8 ]% p7 H7 ]
%************9 Q/ c8 h* N; {  q: p/ q
figure(1)
( R1 G; N  F2 _* q3 V: {surf(x,t,u)
/ Q. f/ u) F1 ttitle('pde 数值解')( T- ^# c. M' T/ K7 q3 o* c
xlabel('位置 x')
9 p  C+ _# x* p7 Q  a, cylabel('时间 t' )
' N8 d5 C% m; W! yzlabel('数值解 u')
" g. z# ~4 k6 H. f' T%*************' a! _; f8 E; r5 Q2 w0 L; K+ v
%与解析解做比较
' Y0 W( ~* q# ?/ f$ B( D9 ?%*************6 h/ f( V+ M: P  j+ o( |% M# z- U
figure(2): d/ j( z5 E5 E
surf(x,t,exp(-t)'*sin(pi*x));
0 r5 R; r+ t2 q/ D9 Ttitle('解析解')
; J2 `' Z# ^. n, j& c% H/ cxlabel('位置 x')
4 n, H& c9 Z: Iylabel('时间 t' )
1 O' N6 z- C9 ]) vzlabel('数值解 u')3 H6 c9 H& I& H3 k5 ^8 Z
%*****************
* _- S. w1 z0 n6 d# l3 M%t=tf=2 时各位置之解' m0 T% N0 P* L& w0 U
%*****************
/ P* m! H+ V8 k% Ofigure(3)
4 S) V: U7 {! a' S% L" UM=length(t); %取终点时间的下表0 s  |  Q4 ~, u& ?3 ^% {' H* U
xout=linspace(0,1,100); %输出点位置! W$ a; ^3 S' [' z* q
[uout,dudx]=pdeval(m,x,u(M,,xout);
* P; A" T8 ?: a# c& `' V6 Zplot(xout,uout); %绘图
' _% ^' ~  i+ @title('时间为 2 时,各位置下的解')
  w2 ]1 I# b. d2 P- n$ A& @xlabel('x')$ W" X/ p9 H* d5 g, O9 R' [. W9 D
ylabel('u')$ E5 Z' o% U9 O; u% u
%******************
  ?4 Q' M7 U* p7 o%pde 函数4 R( ?6 w3 h/ o) m
%******************
* A& c! L2 E: U4 p$ S1 z; X& T3 Efunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)1 a4 s% o; J% C
c=pi^2;1 ]$ ~5 v  K: H; w: _
f=dudx;: S3 J, f8 w9 ]: ^/ O0 T3 h  J; \6 f' S
s=0;
: r1 _. A( ?# t- L! t* P%****************** 5 _8 L' k# l  ?8 V$ z
%初始条件函数& [# U* Z: ^4 W3 \, C* C  W
%******************
5 a7 G( `8 L6 F7 o3 z2 D0 sfunction u0=ex20_1ic(x)
+ M& \5 Q% _+ I2 ku0=sin(pi*x);
( y7 D- q/ H& [5 w%******************' i) p. h! @: z5 i, Z' b3 r
%边界条件函数6 ^( n+ ^2 C& J* N* C
%******************4 A6 E( g# V5 i1 O
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)8 Y  T4 d) t) C( z# W
pl=ul;
! ]- B% c% g8 Q, b- C5 Lql=0;
) [3 Y8 y! r" N9 L/ Spr=pi*exp(-t);+ |/ ?$ |0 a# J% r
qr=1;8 w7 x& e+ b9 D$ q; j/ r

7 P  ?- O# s5 G& F
. ~2 R8 B. [! W) D+ n例 3 试解以下联立的偏微分方程系统

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


8 a) U! Z7 g6 Y) N

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

: M8 I: [$ J( |$ F6 f
function [c,f,s]=ex20_2pdefun(x,t,u,dudx); }' X1 ~, Z8 j& d9 K1 N
c=[1 1]';. P5 Z7 D) \# v2 D" i! ^
f=[0.024 0.170]'.*dudx;
+ e$ R- C% ]7 G1 H; My=u(1)-u(2);
5 q9 s+ Q6 f* G1 t( CF=exp(5.73*y)-exp(-11.47*y);7 z. ]: w3 a$ Y
s=[-F F]';* y. \0 i# S0 {
4 H% v( V- s2 _( j0 [

* ]& U# W5 H' C# Y7 Q6 E2 W3 y步骤 3:编写初始条件函数
. w* F, }8 E) e3 S* n; ~
# Y! b! ~. s, F$ }( q. r$ sfunction u0=ex20_2ic(x)( T3 R8 ], i. V
u0=[1 0]';
6 T7 X  U5 H# g; i
, Y. `/ H' f% F. R. ^; P6 J; o/ [7 a步骤 4:编写边界条件函数
, _- a8 `* I! G4 {2 g. l5 Z
" F8 B' B; D" O' K2 M' \; ufunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)
: v+ x  Y: F2 R( Jpl=[0 ul(2)]';6 P% v0 }8 ?2 z0 r0 i& M
ql=[1 0]';0 O' N" }# s; Z4 J7 z3 q
pr=[ur(1)-1 0]';& a! J$ D% L7 ~3 r: t& h8 X( c: R' T
qr=[0 1]'; - c; R9 o  a$ t/ W- Y& S7 V, Z: o9 ~

" T% T3 L1 S7 q3 r步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,
6 S3 _; d8 K" J: U2 z  |# t8 n7 w+ T. U$ W( s
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];% w' g+ B; ^& L* C+ s' ^8 y/ {0 P* g! A' Q
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
. B' z+ }8 p. E5 R9 {4 o
! x+ ^+ `: @" @* n" a& {以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:% O& {: |% P4 F8 R5 g1 W" o7 P1 p! E

# D& Y2 B3 X" {1 {+ \5 @: h7 w6 q; tfunction ex20_2( x- a, R! b  y
%*************************************** 5 {( U# H9 l# I. _* E
%求解一维偏微分方程组的一个综合函数程序
8 v) R+ m1 m! Z7 C! m%***************************************# m, R& t$ Q- r* o
m=0;4 d2 n, {4 J/ R* o  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];9 B, W+ e# }5 G5 _" Q9 A+ u
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];, Q0 v7 Z( P8 J) D
%*************************************9 Z. e* z+ C; v4 `" f
%利用 pdepe 求解
' A+ u) U* B* \" R9 x9 f6 I%*************************************' P$ l. q( h2 D
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);; W0 e+ g2 u, t0 W8 `( `* L
u1=sol(:,:,1); %第一个状态之数值解输出
1 Y# B& b) @2 ~u2=sol(:,:,2); %第二个状态之数值解输出4 M. N& A& O2 ~" M' i
%*************************************
/ M/ `2 u8 y% h+ m, R( G  Q, Z%绘图输出! z. ^2 o$ M" U& m1 l" o! R, p% |0 t
%*************************************; q' q; w+ T1 u: A. w  A
figure(1)7 T" _3 u: ]3 n
surf(x,t,u1)
* p' S$ x4 F# Y1 ititle('u1 之数值解'); Y! _$ o- }' J1 c2 t/ y
xlabel('x')
* m. e; H- ^% j4 n% zylabel('t'). r: h' h0 x; r# s2 a+ e
%2 K8 u# W& S2 s2 x( L
figure(2)" Q" y/ \: E/ u$ k+ X; P
surf(x,t,u2)% K# J, Z  h# `/ A
title('u2 之数值解')
5 B; r/ }! o! I& Pxlabel('x')6 M' `, E  o" M$ J) w5 o$ X3 g
ylabel('t')+ J1 |* ~. w2 Q4 q7 U( H
%***************************************
/ ^! l7 ?1 t: a9 O' w%pde 函数& O# I( r9 c: s! h; S
%***************************************
+ Z' q6 U; w5 ?' H. y$ _0 Qfunction [c,f,s]=ex20_2pdefun(x,t,u,dudx)
! o4 x9 |" }5 K; W2 G6 Ec=[1 1]';; ]+ w& J) S* L5 i
f=[0.024 0.170]'.*dudx;* v4 [0 {# X% x7 ^+ R- ]/ Y
y=u(1)-u(2);
: A% K+ u% n/ ^4 g' |& jF=exp(5.73*y)-exp(-11.47*y);0 N2 }- L3 a" S; M- `: M
s=[-F F]';- f. h: G3 ?! g- ^7 C+ }
%****************************************
( Z2 n5 F( ^8 ^; F/ f, I%初始条件函数$ {8 L0 F3 u7 o7 v2 z! @3 @
%****************************************
( A8 V0 k- ?4 S6 qfunction u0=ex20_2ic(x)% {# ]+ Y( i* ~7 u, p
u0=[1 0]';/ `; v. {3 m: C8 V/ k
%****************************************$ C7 o  q$ f: m8 l1 X
%边界条件函数2 z% Z7 h  I, W1 T. W  P7 B7 s. m
%****************************************
  r* e' [" n' V: Y* z2 ^) u+ H' ffunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)) l4 f; j' j* R0 U9 D, d
pl=[0 ul(2)]';- B. T' M/ ~) @' a0 `7 x0 J- f
ql=[1 0]';
9 F; {) s0 L* j3 Q4 B' v) Cpr=[ur(1)-1 0]';1 `9 m8 a2 A; h7 N) h. \
qr=[0 1]';
7 j. ~" K# m: R+ d' T( J5 ~" f$ `" P
————————————————8 }$ ^0 }, c2 c+ k1 n
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ t4 y3 G( ~* {. }, k原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
. r1 Q9 _3 v. O9 S* c- Z
! L5 s6 I2 y! N  I' F: c8 J2 j: s. T4 s* J$ p  J/ B( V





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