|
3.1 工具箱命令介绍 MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式 ![]()
![]()
7 x2 Z, R1 p. q8 x+ S9 w其中 x 为两端点位置,即a 或b 用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如 下:
, X7 Z; n U Z/ Q sol = pdepe(m, pdepe,icfun,bcfun, xmesh,tspan,options)
! A* ` u1 w+ z- r
( b/ ?4 K8 A3 |![]()
' t1 B( C4 s7 W# {& i
; o! [0 b; \0 e) F" c
% @( R, R$ D" a8 R4 e注:
* v& h8 r& C7 e& C
7 o W4 }8 z6 O1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分 方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空 间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令 求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被 转化为一组代数方程,而拋物线型的偏微分方程则被转化为一组联立的微分方程。因而, 原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组, 故以 ode15s 便可顺利求解。
/ R+ O2 C, C; F+ I% i: X: l6 ?: X) \8 G1 g P8 E$ J
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”的讯息时,使用者可进一步将 mesh 点取密 一点,即增加 mesh 点数。另外,若状态u 在某些特定点上有较快速的变动时,亦需将 此处的点取密集些,以增加精确度。值得注意的是 pdepe 并不会自动做 xmesh 的自动取 点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于 3 以上。
! ]. \2 s9 \3 Q/ Q0 [0 o: G5 t1 N k6 g% F4 Q
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距(step size)的控制由程序自动完成。
, _8 g0 k3 Y/ Z, {7 j% P0 w5 D" Y$ ^* }! C9 R
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:
! X% F! t" l/ V2 p) Y# J' }
1 n0 |& T9 k4 h6 s" p8 h6 F% F[ uout, duoutdx ] = pdeval(m, xmesh,ui, xout)8 j# N! g: r" E3 `: H3 _/ \, Q
1 n& u# S. M, T6 [* w( d, Y
其中 m 代表问题的对称性。m =0 表示平板;m =1 表示圆柱体;m =2 表示球体。其意 义同 pdepe 中的自变量m 。
- l' M% |2 s- J ]9 \; ~4 r
% q0 H* W. r- b$ i G& v6 @" ~3 H1 V, S' G
9 x; n0 w3 Y2 A1 L
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.
1 F6 M1 M' D% [
5 V! K+ b% |! ?3 I; g/ d以下将以数个例子,详细说明 pdepe 的用法。
, M2 [, C4 r3 I& ?% U2 g- L+ d: G, k; S- w- k# p+ j
3.2 求解一维偏微分方程! W/ l9 J5 u R% d4 A9 ~5 A$ K
例 2 试解以下之偏微分方程式4 E9 i0 c* t' k( m% }! B
$ L5 ?' j! ^& y: d2 w7 N `
![]()
2 s. g$ G" @3 Q6 y3 H5 `
% `' e" j- l% Z! U解 下面将叙述求解的步骤与过程。当完成以下各步骤后,可进一步将其汇总为一 主程序 ex20_1.m,然后求解。
: F6 v- |: U/ W
% ^ o' _0 ]- V- g3 s步骤 1 将欲求解的偏微分方程改写成如式的标准式。3 n$ I4 M& X7 X" [' J! b% `. w
( U5 {( } \% x5 v![]()
* w* R/ i4 \+ Q; A( @2 t* \
: P+ \# U1 K$ A& x( C步骤 2 编写偏微分方程的系数向量函数。/ p5 I. _1 g3 S7 ?( g) M: a
8 B A! g9 h1 Y3 l) K4 p
function [c,f,s]=ex20_1pdefun(x,t,u,dudx) 6 T8 A6 `1 i' L" y6 o
c=pi^2;
8 G/ o; Z& Y. J: L, V) `# of=dudx;% @2 f( r1 E+ s; o+ ]
s=0;: J5 b3 n0 ]; X3 Y2 R4 C
+ V2 [9 j2 x/ r4 F( V0 P8 R# k% ^+ ^
' _, t: Y, b6 P5 p2 C5 v: V步骤 3 编写起始值条件。$ W' P2 K* e. w: d3 ^# b
1 f2 a( u9 _& E% S) _: N
function u0=ex20_1ic(x)
3 [( E5 _( V& ]* Nu0=sin(pi*x);
6 y* p; ?: s5 b$ t步骤 4 编写边界条件。 在编写之前,先将边界条件改写成标准形式,如式(37), 找出相对应的 p(⋅) 和 q(⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条 件可写成 ![]()
因而,边界条件函数可编写成 / x3 B" t" K m4 d9 t1 P
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
# L: h0 k. x" S8 s( J; ?pl=ul;% g6 k4 w# H6 Z& `
ql=0;
, N7 t9 Q o/ Qpr=pi*exp(-t);
. L, x: |9 I J5 h- K8 M9 Dqr=1;
) g" K+ F3 O- B$ W, F: K! s/ x7 l4 _! V4 K
: ^( c% s- A6 b步骤 5 取点。例如7 v( [/ g+ B& Z( i: b8 ^# d$ `5 e0 c
, M0 |' ~# B8 J2 w5 a" |8 }- o4 G- V5 U4 }3 ]6 l; @
x=linspace(0,1,20); %x 取 20 点$ [' D3 O0 F3 m i& A. L8 s3 Z; _
t=linspace(0,2,5); %时间取 5 点输出
) d. O8 D- `+ C8 W6 i1 q
6 i+ g6 c3 p7 j/ j+ }* ~* ]5 Q& k
步骤 6 利用 pdepe 求解。
) p: z% Y" B8 K: f- O
8 l, k& |& f* Z- ` s) Mm=0; %依步骤 1 之结果0 c8 c8 Q# r) K
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);
6 Y6 v7 T3 B( _1 ]# V4 N/ k, N. m2 K. l3 x1 F5 Y9 R
0 x0 j. y v4 S6 {. e8 M: U
步骤 7 显示结果。
) P' _, O: K' j" X- b- Z1 h6 P& G$ O2 N& [5 _- G' b
u=sol(:,:,1);
5 A! [* N9 A" |' J* {* D1 O0 }surf(x,t,u)
; A9 R, q9 R% ~& [- atitle('pde 数值解')
, ~! I3 t4 v" M, H2 Sxlabel('位置')
- f! T- m* ^$ a4 ?ylabel('时间' ). t. k3 R1 g; s; p6 U0 v* B1 b" X
zlabel('u')- q ~: r% M+ r- w( t: H
4 J A$ K/ P5 q
若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时 间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令):
) I' i( C. n$ T$ o
+ L8 @( y+ o; `+ t2 J' B8 k) Kfigure(2); %绘成图 2; ^( `! U+ U2 E8 {) h
M=length(t); %取终点时间的下标
: I2 J) q1 |9 ~# P) d+ p* P1 [xout=linspace(0,1,100); %输出点位置+ _2 T2 m4 u& q. l" ~* S' [
[uout,dudx]=pdeval(m,x,u(M, ,xout);
; W. O. z; `5 W5 H& O! f" Bplot(xout,uout); %绘图
* ^6 i! V$ D% e/ @2 K9 P& u) c- Htitle('时间为 2 时,各位置下的解')
! ]+ C" p; j% rxlabel('x') D: {2 [6 ]# o5 m/ D
ylabel('u') . g$ V5 j8 s( h4 w2 t- h8 p
1 r" l6 g* ~7 B) A
综合以上各步骤,可写成一个程序求解例 2。其参考程序如下% [! b- {& s1 W* V3 k. S8 ]- D
! s* x s; O r) f
function ex20_1
2 f& V" B9 e4 t. x: F9 Q%************************************
: F. O+ ?( }, u# F, u%求解一维热传导偏微分方程的一个综合函数程序9 @0 ~, l/ }) S& s, D# }
%************************************, ^8 q. ]9 n6 I2 L
m=0;* V$ a3 S; f. |
x=linspace(0,1,20); %xmesh
9 P( e0 ~9 W6 H( Yt=linspace(0,2,20); %tspan! s+ w; w1 P2 K+ d/ W. j
%************: `8 S! _/ f0 c$ i9 K8 k
%以 pde 求解* ?! W! Q0 |! [# c6 U0 M+ _
%************
" t6 o$ R' s( q% w- r, p& Msol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t);7 t" j+ u$ B1 z/ v6 h: z9 V
u=sol(:,:,1); %取出答案
& p0 q6 S. g2 X%************3 f l% A8 M Y! R: G4 i! I% o4 X
%绘图输出
9 ?* P! L+ y0 P7 w%************
2 ^* ]8 d( k1 W* l w# M4 N$ |$ c" mfigure(1)
0 f* b* J9 T9 i8 ]7 U$ u3 u4 esurf(x,t,u)) {3 |+ W6 V" `7 h _5 U! H
title('pde 数值解')
$ _2 r& g# M7 `# Oxlabel('位置 x')
+ }( S* |/ ^" v' vylabel('时间 t' )
5 u7 l2 h9 J: ]2 L. I# fzlabel('数值解 u')
. g: Z4 `" L; }%*************1 F5 e$ d- D; M9 r3 G
%与解析解做比较
7 E v( v' @: j: l) j) k%*************8 n, K. y- g2 J
figure(2); M" X( n' b& P: M+ S
surf(x,t,exp(-t)'*sin(pi*x));7 m* J# ?' j, D" X( d- t
title('解析解')
7 L+ `4 P/ G: |0 r5 o4 jxlabel('位置 x')9 u0 i4 c/ B- Z& b2 N% H
ylabel('时间 t' )
m: C9 B. M, mzlabel('数值解 u')
% x' j: y# L# F) b& q- i/ `' ?%*****************' {; a3 ^2 C6 P5 M* P. p
%t=tf=2 时各位置之解7 b) A1 k$ O! ~, m
%*****************
9 w6 D" [5 E- @figure(3)/ m \" ]1 Q" n2 L, O2 v
M=length(t); %取终点时间的下表/ r# s( H2 ^5 D7 f
xout=linspace(0,1,100); %输出点位置0 {1 \1 |2 f, L2 s% @
[uout,dudx]=pdeval(m,x,u(M, ,xout);
& d! s$ Q! \4 Oplot(xout,uout); %绘图2 O( O" I) n" b/ u/ q7 k0 v- K
title('时间为 2 时,各位置下的解')
0 O' `' \2 `8 Q* X& W* T3 Exlabel('x')
( \9 f* Y: c9 q+ ]1 Jylabel('u')2 U7 g4 ]2 g3 @ T. h
%******************
+ C( h1 Y. H/ x7 B) q$ u' V( Y%pde 函数
( q. L3 N, q) I* Z%******************
1 l- J$ P$ A. jfunction [c,f,s]=ex20_1pdefun(x,t,u,dudx)$ g! g" R3 s3 N% w
c=pi^2;$ v' F. H+ y& Z/ W$ ?3 d$ ]5 W
f=dudx;
" f' Q5 P: N# V& z. bs=0;' j6 @% r/ n' L! i) d' ]
%****************** 8 ?7 O( p! Z- l, K2 _! n
%初始条件函数/ r1 h8 ?' v! R. V! J8 b# ^
%******************
* K9 Q+ s0 Q dfunction u0=ex20_1ic(x)
. `3 ?" Y8 i- c: u' G0 Nu0=sin(pi*x);5 U8 W4 d4 K: J5 ^- c( s& Z9 {
%******************
" o1 C5 U- U3 U* y. ]%边界条件函数/ V M& @/ Z4 t; F0 W
%******************
2 E" u' A3 \* b% y1 Xfunction [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t)
* T9 S0 x2 t7 W! rpl=ul;1 R3 M6 K: A6 e# \3 P* t3 O1 G
ql=0;
0 x q$ N" _6 ?( k0 t& \pr=pi*exp(-t);
8 |6 v7 E! |2 o0 g) s: v9 Eqr=1;
' ?) I0 h. @. j5 c. O- ^ k" c0 v2 x- e$ X
# S4 r3 d5 `: c$ E9 G例 3 试解以下联立的偏微分方程系统![]()
解 步骤 1:改写偏微分方程为标准式 ![]()
0 E6 H# E3 j9 `1 m* }& @" }! f![]()
步骤 2:编写偏微分方程的系数向量函数 * E0 ?9 ^8 d( K: \8 \
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)
+ T3 c* e, M: K6 X. E2 ^c=[1 1]';
3 }, ?3 A: U# af=[0.024 0.170]'.*dudx;
- t3 I3 w) m$ |* W5 P( D7 |% Z. Ry=u(1)-u(2);% A6 B# P! _* S. T' x
F=exp(5.73*y)-exp(-11.47*y);& ~# m6 m) M" r% a
s=[-F F]';
. q8 |$ A; ?3 l( v5 K
, C) g) b0 k2 [5 Q$ J- s! L* V; A b% i
步骤 3:编写初始条件函数
) N+ p6 ]. @, R- c
- A3 T( i2 i0 U7 B$ V hfunction u0=ex20_2ic(x). g3 Q8 u9 p3 r' z4 _. K# y
u0=[1 0]';
7 D9 F9 z+ T/ p3 g0 F3 u
4 d$ S; X+ G7 U3 C8 O步骤 4:编写边界条件函数
' u5 H; V& m3 [1 w+ {
' _5 g7 Y; c: rfunction [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t)5 W# a# U( [, p: ]. M9 K
pl=[0 ul(2)]';; H9 B. U/ t6 p
ql=[1 0]';$ Q& \ q5 }. @
pr=[ur(1)-1 0]';
/ F! E; W% R; K! Kqr=[0 1]';
& n& ?( q$ S4 ?* S2 o
9 U2 V2 V; ~+ I步骤 5: 取点。 由于此问题的端点均受边界条件的限制,且时间t 很小时状态的变动很大(由多次求 解后的经验得知),故在两端点处的点可稍微密集些。同时对于t 小处亦可取密一些。例 如,* V. ]) [- l* q" S# x
: r( x; T9 C1 h
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];1 m4 q$ O+ |0 f# ]4 N
t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
! w7 o* e X! Y# P
. S( V+ f9 G6 Z6 P6 { ~" o以上几个主要步骤编写完成后,事实上就可直接完成主程序来求解。此问题的参考 程序如下:
1 @, ~4 U+ a2 c, v" l( l' [
, i1 h/ Z* y2 d3 c: b' ^4 `function ex20_2% m, p. j7 X" p4 P
%*************************************** 7 Q) g# F: \, q$ M1 G+ a
%求解一维偏微分方程组的一个综合函数程序
" h, p+ Y, b( _; B/ _& ~%***************************************8 l! R: O6 R# `, x7 Y& a
m=0;
$ \ p9 x5 X& o. E9 j# D# |$ K4 Qx=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
. P4 S* B, l3 P% O1 lt=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];4 x+ L: ?! B( B: b. O" Z" K
%*************************************0 ^( V; c) S S$ J
%利用 pdepe 求解; z& n3 o4 m+ m8 Y' P
%*************************************# e8 k8 W9 t4 Z X2 d
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t);& J9 G$ Y& v2 }8 o @6 b! M+ G/ W
u1=sol(:,:,1); %第一个状态之数值解输出; `; a2 `/ |" z
u2=sol(:,:,2); %第二个状态之数值解输出; a! N) R0 ], a0 b
%*************************************
, D3 H3 {, W9 l- a y# B%绘图输出
4 I0 d/ @/ w; V6 c%*************************************, R! T) X) f9 ^) }$ y9 Z# k' \% s) D8 V
figure(1)
/ t; I7 {7 l2 @ jsurf(x,t,u1)) `% T2 e" \6 u
title('u1 之数值解')
- d4 E: o( F( K( L: U7 vxlabel('x')% u1 x6 c4 U: T) H* S3 C1 f; x& e! Q
ylabel('t')
7 y# @2 l4 B) W%$ Y" n3 k5 X# p% g: m |
figure(2); a8 @$ \5 N, [+ o2 P
surf(x,t,u2)- k) n9 A% C5 j; ~# M7 g
title('u2 之数值解')
. l# e# v1 e8 @) i* @+ ^xlabel('x')
( J/ n, _4 \. x+ {# v9 E" Hylabel('t')
2 h% [! G- }! Y%***************************************
4 b3 a1 P; j: `: ]9 u" T [7 ?0 A1 V%pde 函数8 F9 w# y( r. o) @# i
%***************************************. X# ]3 u* A2 G8 C: ~
function [c,f,s]=ex20_2pdefun(x,t,u,dudx)0 h4 v$ M+ }2 [7 }, |
c=[1 1]';
, p$ q/ t0 s* V$ x; Tf=[0.024 0.170]'.*dudx;. v$ g$ [4 @4 {6 n$ D' [' L% l+ C# b
y=u(1)-u(2);
, S$ m2 j- N1 @F=exp(5.73*y)-exp(-11.47*y);; A; ]& q$ {7 w$ Q
s=[-F F]';- `* s q' Q( o: d5 K+ j4 ?
%****************************************4 J5 Q, W7 o. }) l. i- t) h0 ?
%初始条件函数! W( D* g; K; \0 x5 v! H
%****************************************2 L/ v+ E" h% L; U7 u
function u0=ex20_2ic(x)
, _2 ^& E. I) `0 t0 Mu0=[1 0]';; z% E7 m8 Z# r$ E% A
%****************************************& R4 F1 x2 ~6 E, F1 j
%边界条件函数1 A2 Z0 m8 B- b: [$ ^& Z
%****************************************
( j. I' e, H0 {1 r: T( {function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t) ^% w, z+ D5 V0 x6 w. ^
pl=[0 ul(2)]';. Z" K F8 P- M4 D- W
ql=[1 0]';
/ Y/ b+ {' U- b+ Y9 ?pr=[ur(1)-1 0]';4 S8 A4 E. o$ ]4 R" F* U6 c+ N% t
qr=[0 1]';( Y# y# [( ], d( E5 H8 w
+ a, N- A2 v- }, }————————————————& [( b( ]" {. y3 n9 X1 ~" q5 ]
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( [3 y2 t& a5 r4 J" _4 V. X原文链接:https://blog.csdn.net/qq_29831163/article/details/89706692
5 s2 F0 y% D0 p4 @+ Y& v) p8 J* i ^5 Y/ H) r
! B8 s+ V8 W2 Y r9 O; f$ y5 G |