谱方法学习笔记-下(超详细)
谱方法学习笔记📒
谱方法学习笔记-上(超详细)
声明:鉴于CSDN
使用
K
a
T
e
X
KaTeX
KaTeX 渲染公式,
KaTeX
\KaTeX
KATEX 与
L
a
T
e
X
LaTeX
LaTeX 不同,不支持直接的交叉引用命令,如\label
和\eqref
。
KaTeX
\KaTeX
KATEX专注于数学公式的呈现,而不提供完整的文档生成功能。因此,为了保证显示正常,本文中所有公式均已删除编号和交叉引用。由此可能导致一些可读性上的不便,请读者谅解。
文章目录
- 谱方法学习笔记📒
- 傅里叶谱方法求解基本偏微分方程---二维 Schnakenberg 模型
- Matlab 将计算结果制作成 gif 动画
- 引言
- 函数介绍
- Matlab源代码
- 谱求导矩阵
- 谱求导矩阵的导出和应用
- 谱方法插值
- 谱求导矩阵
- 用谱求导矩阵求解偏微分方程的步骤
- 收敛阶说明
傅里叶谱方法求解基本偏微分方程—二维 Schnakenberg 模型
Schnakenberg模型是一种描述化学反应动力学的数学模型,旨在研究化学反应中自组织现象和空间模式的形成。
该模型最早由德国化学家Heinrich Otto Wieland提出,后由德国数学家Theodor Schnakenberg在其博士论文中进行了推导和解析,并得到了该模型的名字。
Schnakenberg模型的意义在于,它可以模拟一系列反应中出现的自组织现象,例如化学波、化学斑图、化学分叉等。这些现象是由于反应物浓度分布在空间上的不均匀性导致的,通过Schnakenberg模型可以更好地理解这些现象,并为实验提供一定的指导和验证。
此外,Schnakenberg模型还可以应用于其他领域,例如生物学、物理学、生态学等。在这些领域中,该模型可以用于研究许多自组织现象,例如细胞分裂、病毒传播、生态系统演化等。
这个模型描述的是两种化学物质之间的反应过程。具体来说,化学物质 u u u 会被消耗掉,同时生成化学物质 v v v。反应速率的大小取决于 u u u 和 v v v的浓度,而扩散系数则描述了物质在空间中的扩散速度。
Schnakenberg模型有许多有趣的特性和行为。例如,在某些参数范围内,这个模型的解可以显示出空间上的分布和时间上的演化,形成有序的斑图(patterns)。这些斑图包括静态和动态的形态,它们的形状和数量取决于模型参数的取值。这种有序结构的出现和演化,可以通过Schnakenberg模型来解释和理解实验室中观察到的许多化学反应和生物学现象。具体来说,当模型的参数取值适当时,Schnakenberg模型的解会形成一个包含不同浓度级别的周期性结构。这种周期性结构被称为Turing结构,是由Alan Turing在1952年提出的一种理论模型。Turing结构是许多自组织系统中的一种普遍现象,例如斑马条纹、蝴蝶翅膀上的斑点等。
在Schnakenberg模型中,Turing结构的出现是由反应和扩散之间的相互作用所导致的。具体来说,当扩散系数足够大时,化学物质可以在空间上扩散,使得浓度分布均匀。但当反应速率较慢时,这些化学物质在局部区域内聚集起来,并且在一定的空间尺度上发生反应。这个过程会导致局部区域内的浓度发生变化,从而形成周期性的结构。
需要注意的是,Turing结构的出现是非线性动力学的一个重要特征。这种结构的产生和演化需要考虑多个因素之间的相互作用,因此通常需要使用数值计算和数学分析的方法来研究其性质和行为。
需要注意的是,Schnakenberg模型是一种简化的模型,它假设了化学物质的浓度在空间和时间上均匀分布,没有考虑一些具体的生物或化学体系的细节和复杂性。因此,这个模型只能作为一种基本的参考模型,而不是具体体系的精确描述。
近年来,Schnakenberg模型被广泛应用于不同领域的研究中,包括流体力学、生物学、材料科学等。这个模型的理论和数值分析方法也在不断地发展和完善,为我们深入理解和探究复杂动态系统的性质和行为提供了有力的工具和平台。
斑图(pattern)是一类普遍存在于自然界、在时间或空间上具有某种规律的非均匀宏观结构。反应-扩散系统 (reaction-diffusion system) 是斑图理论中研究得最为广 泛的系统, 它起源于化学反应系统, 但又不局限于此, 还广泛应用于生物学、物理学、医学、金融学等。Schnakenberg 模型是反应-扩散系统中的一个有趣的模型, 数学形式如下:
{
∂
u
∂
t
=
(
∂
2
∂
x
2
+
∂
2
∂
y
2
)
u
+
γ
(
a
−
u
+
u
2
v
)
∂
v
∂
t
=
d
(
∂
2
∂
x
2
+
∂
2
∂
y
2
)
v
+
γ
(
b
−
u
2
v
)
\left\{\begin{array}{l} \frac{\partial u}{\partial t}=\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right) u+\gamma\left(a-u+u^2 v\right) \\ \frac{\partial v}{\partial t}=d\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right) v+\gamma\left(b-u^2 v\right) \end{array}\right.
⎩
⎨
⎧∂t∂u=(∂x2∂2+∂y2∂2)u+γ(a−u+u2v)∂t∂v=d(∂x2∂2+∂y2∂2)v+γ(b−u2v)
其中,
u
u
u 和
v
v
v 可看做两种化学反应物质的浓度,
x
、
y
x 、 y
x、y 为空间坐标,
t
t
t 为时间,
a
、
b
、
d
a 、 b 、 d
a、b、d 、
γ
\gamma
γ 为常数。对式 (3-38) 做二维傅里叶变换, 可将其转化为偏微分方程组:
{ ∂ u ^ ∂ t = − ( k x 2 + k y 2 ) u ^ ^ + γ ⋅ F { a − F − 1 [ u ^ ] + F − 1 [ u ^ ] 2 F − 1 [ v ^ ] } ∂ v ^ ∂ t = − d ( k x 2 + k y 2 ) v ^ + γ ⋅ F { b − F − 1 [ u ^ ] 2 F − 1 [ v ^ ] } \left\{\begin{array}{l} \frac{\partial \hat{u}}{\partial t}=-\left(k_x^2+k_y^2\right) \hat{\hat{u}}+\gamma \cdot F\left\{a-F^{-1}[\hat{u}]+F^{-1}[\hat{u}]^2 F^{-1}[\hat{v}]\right\} \\ \frac{\partial \hat{v}}{\partial t}=-d\left(k_x^2+k_y^2\right) \hat{v}+\gamma \cdot F\left\{b-F^{-1}[\hat{u}]^2 F^{-1}[\hat{v}]\right\} \end{array}\right. {∂t∂u^=−(kx2+ky2)u^^+γ⋅F{a−F−1[u^]+F−1[u^]2F−1[v^]}∂t∂v^=−d(kx2+ky2)v^+γ⋅F{b−F−1[u^]2F−1[v^]}
参数取值为: a = 0.1 , b = 0.8 , d = 26 , γ = 100 a=0.1, b=0.8, d=26, \gamma=100 a=0.1,b=0.8,d=26,γ=100 。为了得到靶型波, 将初始条件设置为: u u u 在 x − y x-y x−y 平面原点处为 1 , 在其他位置为 0 , v 0, v 0,v 在整个 x − y x-y x−y 平面上均为 1 。利用傅里叶谱方法 求解该模型的代码如下。
主程序代码
clear all; close all;
L=16; N=64;
kx=2*pi/L*[0:N/2-1 -N/2:-1]; ky=kx;
[kX,kY]=meshgrid(kx,ky);
K2=kX.^2+kY.^2;
%初始条件
u=zeros(N); u(N/2,N/2)=1; v=ones(N);
ut=fft2(u); vt=fft2(v);
uvt=[ut(:); vt(:)];
%求解
a=0.1; b=0.8; d=26; gamma=100; t=[0:0.1:0.3];
[t,uvtsol]=ode45('schnakenberg',t,uvt,[],K2,N,gamma,a,b,d);
%画图
for n=1:4
subplot(2,2,n)
gca=pcolor(ifft2(reshape(uvtsol(n,1:N^2),N,N))); axis off
set(gca,'LineStyle','none'), shading interp
title(['t=' num2str(t(n))]), axis('square'),
% colormap('gray')
end
程序输出的结果如图所示,这与化学实验中观察到的靶型波一致。
Matlab 将计算结果制作成 gif 动画
引言
求解包含时间的偏微分方程 (组) 将得到随着时间变化的数值结果, 把这样的数据制作成 gif
动画并结合到幻灯片中, 在毕业答辩、小组讨论、课堂教学等场合有着广泛的应用。生动的彩色 gif
动画具有很强的表现力, 令人刮目相看, 大大提高了报告人所讲述理论结果的直观性、生动性、观赏性。
函数介绍
生成 gif
动画主要用到
4
4
4 个函数: getframe
、frame2im
、rgb2ind
、imwrite
。
-
getframe
函数的一般调用形式为:F=getframe(h)
, 其作用是截取句柄为h
的窗口内的一帧图像。 -
frame2im
函数的作用是把一帧截图转为图像数据。 -
rgb2ind
函数的作用是将RGB
图像转换为索引图像, 一般调用形式为:[X, map]= rgb2ind(RGB,n)
。其中,X
、map
分别为转换后的图像数据和颜色表数据,RGB
为转换前的图像数据,n
指定map
中的颜色数。 -
imwrite
函数的作用是将图像数据写入图像文件, 一般调用形式为:imwrite(X,map,filename,fmt,Param1,Val1,Param2,Val2...)
。其中,X
、map
意义同上,filename
为文件名,fmt
为文件格式,Param1
,Val1
,Param2
,Val2...
为若干可选参数及其取值。如:参数LoopCount
为动画的循环播放次数, 这里设为inf
, 即无穷大。参数DelayTime
为每帧间隔时间, 单位秒。参数WriteMode
为写入文件的模式, 有覆盖overwrite
(默认) 和追加append
两种选择。
Matlab源代码
生成 gif
动画的示例代码如下:
clear
clc
close
x=-1:0.02:1;y=x;
[X,Y]=meshgrid(x,y);
filename='test.gif';
for a=1:10
u=a*exp(-10*(X.^2+Y.^2));
mesh(x,y,u),axis([-1 1 -1 1 0 10]),drawnow
im=frame2im(getframe(gcf));
[A,map]=rgb2ind(im,256);
if a==1
%先以覆盖模式写入指定的gif文件
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.1);
else
%再以追加模式将每一帧写入gif文件
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);
end
end
运行代码之后在当前目录下生成 gif
文件, 该动画显示了一个三维高斯函数的峰值逐渐增大的过程。
为了更加直观的感受求解 Schnakenberg 模型得到的靶型波,此处结合上述操作将计算结果制作成如下 gif 动画。
修改后的程序源代码:
clear all; close all;
L=16; N=64;
kx=2*pi/L*[0:N/2-1 -N/2:-1]; ky=kx;
[kX,kY]=meshgrid(kx,ky);
K2=kX.^2+kY.^2;
%初始条件
u=zeros(N); u(N/2,N/2)=1; v=ones(N);
ut=fft2(u); vt=fft2(v);
uvt=[ut(:); vt(:)];
%求解
a=0.1; b=0.8; d=26; gamma=100; t=[0:0.01:1];
[t,uvtsol]=ode45('schnakenberg',t,uvt,[],K2,N,gamma,a,b,d);
%画图
filename = 'output.gif'; % 设置保存的gif文件名
for n = 1:length(t)
gca=pcolor(ifft2(reshape(uvtsol(n,1:N^2),N,N))); axis off
set(gca,'LineStyle','none'), shading interp
title(['t=' num2str(t(n))]), axis('square'),
% colormap('gray')
% 捕捉当前子图并转换为gif图像帧
frame = getframe(gcf);
im=frame2im(getframe(gcf));
[A,map]=rgb2ind(im,256);
% 写入gif图像文件
if n == 1
%先以覆盖模式写入指定的gif文件
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.01);
else
%再以追加模式将每一帧写入gif文件
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.01);
end
end
谱求导矩阵
谱求导矩阵的导出和应用
在生产实践过程中, 某些函数关系的具体表达式是未知的, 只能通过实验测量得到该函数上的一些离散的数据点.所以, 人们希望通过这些离散的数据点构造一个已知函数来近似地描述并替代未知函数.此外, 尽管有些函数的表达式是已知的, 但由于太过复杂繁琐, 不便对其进行理论计算和数值分析, 所以也有必要构造一个简单函数来替代它.
上述问题用数学语言表达为: 已知在区间 [ a , b ] [a, b] [a,b] 上的 N N N 个位置 x 1 , x 2 , … , x N x_{1}, x_{2}, \ldots, x_{N} x1,x2,…,xN 的函数值 u 1 u_{1} u1, u 2 , … , u N u_{2}, \ldots, u_{N} u2,…,uN, 求一个函数 p ( x ) p(x) p(x) 通过所有已知点 ( x 1 , u 1 ) , ( x 2 , u 2 ) , … , ( x N , u N ) \left(x_{1}, u_{1}\right),\left(x_{2}, u_{2}\right), \ldots,\left(x_{N}, u_{N}\right) (x1,u1),(x2,u2),…,(xN,uN), 即:
u j = p ( x j ) , j = 1 , 2 , … , N u_{j}=p\left(x_{j}\right), \quad j=1,2, \ldots, N uj=p(xj),j=1,2,…,N
其中, 用 p ( x ) p(x) p(x) 近似未知函数的方法称为插值法 (interpolation), p ( x ) p(x) p(x) 称为插值函数.下面介绍用谱方法确定插值函数 p ( x ) p(x) p(x) 的过程, 并将其用于计算离散数据的各阶导数、偏微分方程 (组) 的数值求解.
谱方法插值
考虑在区间 [ 0 , 2 π ] [0,2 \pi] [0,2π] 上、具有周期性边界条件的插值问题.在此区间上间距为 h h h 的 N N N 个位置 x 1 , x 2 , … , x N x_{1}, x_{2}, \ldots, x_{N} x1,x2,…,xN 对应的函数值为 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN .其中, x j = j h , h = 2 π / N x_{j}=j h, h=2 \pi / N xj=jh,h=2π/N, 即:
π h = N 2 \frac{\pi}{h}=\frac{N}{2}% \label{4-2} hπ=2N
在推导前先做 3 点说明:
(1) 选择区间 [ 0 , 2 π ] [0,2 \pi] [0,2π] 是为了方便讨论, 在该区间上得出的结论同样适用于对其平移得到的其他区间 (如 [ − π , π ] [-\pi, \pi] [−π,π] ), 并可以通过乘以缩放因子方便地将结论转化到其他长度非 2 π 2 \pi 2π的任意区间上 (如 [ − L , L ] ) [-L, L]) [−L,L]) .
(2) 所谓周期性边界条件, 是指 N N N 个函数值 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 可等效地看做是无穷多个函数值 … , u − 1 , u 0 , u 1 , … , u N − 1 , u N , u N + 1 , … \ldots, u_{-1}, u_{0}, u_{1}, \ldots, u_{N-1}, u_{N}, u_{N+1}, \ldots …,u−1,u0,u1,…,uN−1,uN,uN+1,… 的一部分, 并存在 u j + m N = u j u_{j+m N}=u_{j} uj+mN=uj 的关系 ( m m m 为任意整数).这里把讨论的函数当做周期为 2 π 2 \pi 2π 的周期函数处理.
(3) N N N 的奇偶会导致接下来的推导细节有所差异, 但过程是相似的, 所以此处只分析 N N N 为偶数的情况.
若对序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 做离散傅里叶变换, 那么空域(时域)上的间隔 h h h 决定了频域上的区间为 [ − π / h , π / h ] [-\pi / h, \pi / h] [−π/h,π/h] .由式 % \eqref{4-2} , 该区间也可写为 [ − N / 2 , N / 2 ] [-N / 2, N / 2] [−N/2,N/2] .本部分中的离散傅里叶变换对定义为:
u ^ k = h ∑ j = 1 N e − i k x j u j , k = − N 2 + 1 , … , N 2 u j = 1 2 π ∑ k = − N / 2 + 1 N / 2 e i k x j u ^ k , j = 1 , … , N \begin{align} \hat{u}_{k}=h \sum_{j=1}^{N} \mathrm{e}^{-\mathrm{i} k x_{j}} u_{j}, \quad k=-\frac{N}{2}+1, \ldots, \frac{N}{2} % \label{4-3}\\ u_{j}=\frac{1}{2 \pi} \sum_{k=-N / 2+1}^{N / 2} \mathrm{e}^{\mathrm{i} k x_{j}} \hat{u}_{k}, \quad j=1, \ldots, N% \label{4-4} \end{align} u^k=hj=1∑Ne−ikxjuj,k=−2N+1,…,2Nuj=2π1k=−N/2+1∑N/2eikxju^k,j=1,…,N
这与前面给出的 Matlab
中离散傅里叶变换对的定义略有不同, 但实质是一样的.注意到式
% \eqref{4-4}
中的频率分量并不是完全对称的,
k
k
k 中有
0
、
±
1
、
±
2
、
⋯
⋯
、
±
(
N
/
2
−
1
)
、
N
/
2
0 、 \pm 1 、 \pm 2 、 \cdots \cdots 、 \pm(N / 2-1) 、 N / 2
0、±1、±2、⋯⋯、±(N/2−1)、N/2,却没有
−
N
/
2
-N / 2
−N/2, 这在求解插值函数时会引起一些小小的问题.所以, 令
u
^
−
N
/
2
=
u
^
N
/
2
\hat{u}_{-N / 2}=\hat{u}_{N / 2}
u^−N/2=u^N/2, 并重新定义离散傅里叶逆变换为:
u j = 1 2 π ∑ k = − N / 2 N / 2 ′ e i k x j u ^ k , j = 1 , … , N u_{j}=\frac{1}{2 \pi} \sum_{k=-N / 2}^{N / 2}{}^{\prime}\mathrm{e}^{\mathrm{i} k x_{j}} \hat{u}_{k}, \quad j=1, \ldots, N% \label{4-5} uj=2π1k=−N/2∑N/2′eikxju^k,j=1,…,N
其中, “ Σ ′ \Sigma^{\prime} Σ′ 代表求和时在 k = ± N / 2 k= \pm N / 2 k=±N/2 的项上乘以 1 / 2 1 / 2 1/2 .需要强调的是, 式 % \eqref{4-3} 和式 % \eqref{4-4} 仍然是离散傅里叶变换对的定义, 式 % \eqref{4-5} 仅是用于确定插值函数 p ( x ) p(x) p(x) 的.求 p ( x ) p(x) p(x) 时需要把式 % \eqref{4-5} 中的 x j = j h x_{j}=j h xj=jh 推广到 [ 0 , 2 π ] [0,2 \pi] [0,2π] 上的任意实数 x x x, 即:
p ( x ) = 1 2 π ∑ k = − N / 2 N / 2 ′ e i k x u ^ k , x ∈ [ 0 , 2 π ] p(x)=\frac{1}{2 \pi} \sum_{k=-N / 2}^{N / 2} {}^{\prime}\mathrm{e}^{\mathrm{i} k x} \hat{u}_{k}, \quad x \in[0,2 \pi]% \label{4-6} p(x)=2π1k=−N/2∑N/2′eikxu^k,x∈[0,2π]
确定插值函数的步骤是这样的:先用式 % \eqref{4-3} 将序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 变换为 u ^ − N / 2 + 1 \hat{u}_{-N / 2+1} u^−N/2+1, u ^ − N / 2 + 2 , … , u ^ N / 2 \hat{u}_{-N / 2+2}, \ldots, \hat{u}_{N / 2} u^−N/2+2,…,u^N/2, 令 u ^ − N / 2 = u ^ N / 2 \hat{u}_{-N / 2}=\hat{u}_{N / 2} u^−N/2=u^N/2, 再根据序列 u ^ − N / 2 , u ^ − N / 2 + 1 , … , u ^ N / 2 \hat{u}_{-N / 2}, \hat{u}_{-N / 2+1}, \ldots, \hat{u}_{N / 2} u^−N/2,u^−N/2+1,…,u^N/2 通过式 % \eqref{4-6} 得到 p ( x ) p(x) p(x) .这样得到的插值函数 p ( x ) p(x) p(x) 可用来求序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 在 x j x_{j} xj 处的各阶导数, 即:
∂ n p ( x ) ∂ x n ∣ x = x j \left.\frac{\partial^{n} p(x)}{\partial x^{n}}\right|_{x=x_{j}}% \label{4-7} ∂xn∂np(x) x=xj
上面介绍的是通过谱方法计算插值函数 p ( x ) p(x) p(x) 来估算序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 在 x j x_{j} xj 处的导数的基本原理.接下来, 为了把上述过程转化为方便的矩阵运算, 采用如下思路: 首先求出周期 δ \delta δ 函数的插值函数 S N ( x ) S_{N}(x) SN(x), 然后将任意序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 写为周期 δ \delta δ 函数的线性组合, 进而可把它的插值函数 p ( x ) p(x) p(x) 写为 S N ( x ) S_{N}(x) SN(x) 的线性组合, 最后找到 p ( x ) p(x) p(x) 和 S N ( x ) S_{N}(x) SN(x) 在 x 1 , x 2 , … , x N x_{1}, x_{2}, \ldots, x_{N} x1,x2,…,xN 处导数的关系并写为矩阵形式, 给出针对任意序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 的谱求导矩阵.
谱求导矩阵
周期 δ \delta δ 函数定义为:
δ j = { 1 , ( j % N = 0 ) 0 , ( j % N ≠ 0 ) \delta_{j}= \begin{cases}1, & (j \% N=0) \\ 0, & (j \% N \neq 0)\end{cases}% \label{4-8} δj={1,0,(j%N=0)(j%N=0)
其中, 百分号 “ % \% % ” 代表求余运算, 周期 δ \delta δ 函数在 j = m N j=m N j=mN ( m m m 为任意整数) 时取值为 1 ,其他情况为 0 , 它所对应的横坐标为 x j = j h x_{j}=j h xj=jh .利用式 % \eqref{4-3} 求周期 δ \delta δ 函数的离散傅里叶变换, 结果为一常数 h h h :
δ ^ k = h ∑ j = 1 N e − i k x j δ j = h , k = − N 2 + 1 , … , N 2 \hat{\delta}_{k}=h \sum_{j=1}^{N} \mathrm{e}^{-\mathrm{i} k x_{j}} \delta_{j}=h, \quad k=-\frac{N}{2}+1, \ldots, \frac{N}{2}% \label{4-9} δ^k=hj=1∑Ne−ikxjδj=h,k=−2N+1,…,2N
再利用式 % \eqref{4-6} 求周期 δ \delta δ 函数的插值函数:
p ( x ) = h 2 π ∑ k = − N / 2 N / 2 ′ e i k x = h 2 π ( 1 2 ∑ k = − N / 2 N / 2 − 1 e i k x + 1 2 ∑ k = − N / 2 + 1 N / 2 e i k x ) = h 2 π ( 1 2 e − i 2 x ∑ k = − N / 2 + 1 / 2 N / 2 − 1 / 2 e i k x + 1 2 e i 2 x ∑ k = − N / 2 + 1 / 2 N / 2 − 1 / 2 e i k x ) = h 2 π cos ( x / 2 ) ∑ k = − N / 2 + 1 / 2 N / 2 − 1 / 2 e i k x = h 2 π cos ( x / 2 ) e i ( − N / 2 + 1 / 2 ) x − e i ( N / 2 + 1 / 2 ) x 1 − e i x = h 2 π cos ( x / 2 ) e − i ( N / 2 ) x − e i ( N / 2 ) x e − i x / 2 − e i x / 2 = h 2 π cos ( x / 2 ) sin ( N x / 2 ) sin ( x / 2 ) \begin{aligned} p(x) & =\frac{h}{2 \pi} \sum_{k=-N / 2}^{N / 2}{}^{\prime} \mathrm{e}^{\mathrm{i} k x} \\ & =\frac{h}{2 \pi}\left(\frac{1}{2} \sum_{k=-N / 2}^{N / 2-1} \mathrm{e}^{\mathrm{i} k x}+\frac{1}{2} \sum_{k=-N / 2+1}^{N / 2} \mathrm{e}^{\mathrm{i} k x}\right) \\ & =\frac{h}{2 \pi}\left(\frac{1}{2} \mathrm{e}^{-\frac{\mathrm{i}}{2} x} \sum_{k=-N / 2+1 / 2}^{N / 2-1 / 2} \mathrm{e}^{\mathrm{i} k x}+\frac{1}{2} \mathrm{e}^{\frac{\mathrm{i}}{2} x} \sum_{k=-N / 2+1 / 2}^{N / 2-1 / 2} \mathrm{e}^{\mathrm{i} k x}\right) \\ & =\frac{h}{2 \pi} \cos (x / 2) \sum_{k=-N / 2+1 / 2}^{N / 2-1 / 2} \mathrm{e}^{\mathrm{i} k x} \\ & =\frac{h}{2 \pi} \cos (x / 2) \frac{\mathrm{e}^{\mathrm{i}(-N / 2+1 / 2) x}-\mathrm{e}^{\mathrm{i}(N / 2+1 / 2) x}}{1-\mathrm{e}^{\mathrm{i} x}} \\ & =\frac{h}{2 \pi} \cos (x / 2) \frac{\mathrm{e}^{-\mathrm{i}(N / 2) x}-\mathrm{e}^{\mathrm{i}(N / 2) x}}{\mathrm{e}^{-\mathrm{i} x / 2}-\mathrm{e}^{\mathrm{i} x / 2}} \\ & =\frac{h}{2 \pi} \cos (x / 2) \frac{\sin (N x / 2)}{\sin (x / 2)} \end{aligned}% \label{4-10} p(x)=2πhk=−N/2∑N/2′eikx=2πh 21k=−N/2∑N/2−1eikx+21k=−N/2+1∑N/2eikx =2πh 21e−2ixk=−N/2+1/2∑N/2−1/2eikx+21e2ixk=−N/2+1/2∑N/2−1/2eikx =2πhcos(x/2)k=−N/2+1/2∑N/2−1/2eikx=2πhcos(x/2)1−eixei(−N/2+1/2)x−ei(N/2+1/2)x=2πhcos(x/2)e−ix/2−eix/2e−i(N/2)x−ei(N/2)x=2πhcos(x/2)sin(x/2)sin(Nx/2)
由式 % \eqref{4-2} , 最终得到的周期 δ \delta δ 函数的插值函数为周期 sinc 函数 S N S_{N} SN :
S N ( x ) = sin ( π x / h ) ( 2 π / h ) tan ( x / 2 ) S_{N}(x)=\frac{\sin (\pi x / h)}{(2 \pi / h) \tan (x / 2)}% \label{4-11} SN(x)=(2π/h)tan(x/2)sin(πx/h)
可以证明,
S
N
(
x
)
∣
x
→
0
=
1
\left.S_{N}(x)\right|_{x \rightarrow 0}=1
SN(x)∣x→0=1 .下图(曲线为周期
sinc
\operatorname{sinc}
sinc 函数, 黑点为周期
δ
\delta
δ 函数, 上下两图分别对应
N
=
4
N=4
N=4 和
N
=
16
N=16
N=16) 显示了周期
δ
\delta
δ 函数以及它的插值函数一一周期 sinc 函数
S
N
(
x
)
S_{N}(x)
SN(x), 二者的周期均为
2
π
2 \pi
2π, 无论
N
N
N 取值为 4 还是 16 , 后者都精确、巧妙地经过了前者的所有离散点.
若将区间
[
0
,
2
π
]
[0,2 \pi]
[0,2π] 上的序列
u
1
,
u
2
,
…
,
u
N
u_{1}, u_{2}, \ldots, u_{N}
u1,u2,…,uN 写为周期
δ
\delta
δ 函数的线性叠加, 即:
u
j
=
∑
m
=
1
N
u
m
δ
j
−
m
u_{j}=\sum_{m=1}^{N} u_{m} \delta_{j-m}% \label{4-12}
uj=m=1∑Numδj−m
那么, 将其中的周期 δ \delta δ 函数替换为周期 sinc \operatorname{sinc} sinc 函数 S N S_{N} SN, 就得到序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 的插值函数 p ( x ) p(x) p(x) :
p ( x ) = ∑ m = 1 N u m S N ( x − x m ) p(x)=\sum_{m=1}^{N} u_{m} S_{N}\left(x-x_{m}\right)% \label{4-13} p(x)=m=1∑NumSN(x−xm)
注意到 p ( x ) p(x) p(x) 就是 S N ( x ) S_{N}(x) SN(x) 的线性组合,如果用 p ( x ) p(x) p(x) 来估算序列 u 1 , u 2 , … , u N u_{1}, u_{2}, \ldots, u_{N} u1,u2,…,uN 在 x j = j h x_{j}=j h xj=jh 处的 1 阶导数, 则有:
p ′ ( x j ) = ∑ m = 1 N u m S N ′ ( x j − x m ) p^{\prime}\left(x_{j}\right)=\sum_{m=1}^{N} u_{m} S_{N}^{\prime}\left(x_{j}-x_{m}\right)% \label{4-14} p′(xj)=m=1∑NumSN′(xj−xm)
其中, x j − x m = ( j − m ) h x_{j}-x_{m}=(j-m) h xj−xm=(j−m)h .将上式写为矩阵形式:
( p ′ ( x 1 ) p ′ ( x 2 ) p ′ ( x 3 ) ⋮ p ′ ( x N ) ) = ( S N ′ ( 0 ) S N ′ ( − h ) S N ′ ( − 2 h ) ⋯ S N ′ ( ( 1 − N ) h ) S N ′ ( h ) S N ′ ( 0 ) S N ′ ( − h ) S N ′ ( 2 h ) S N ′ ( h ) S N ′ ( 0 ) ⋮ ⋱ S N ′ ( ( N − 1 ) h ) ) ( u 1 u 2 u 3 ⋮ u N ) \left(\begin{array}{c} p^{\prime}\left(x_{1}\right) \\ p^{\prime}\left(x_{2}\right) \\ p^{\prime}\left(x_{3}\right) \\ \vdots \\ p^{\prime}\left(x_{N}\right) \end{array}\right)=\left(\begin{array}{ccccc} S_{N}^{\prime}(0) & S_{N}^{\prime}(-h) & S_{N}^{\prime}(-2 h) & \cdots & S_{N}^{\prime}((1-N) h) \\ S_{N}^{\prime}(h) & S_{N}^{\prime}(0) & S_{N}^{\prime}(-h) & & \\ S_{N}^{\prime}(2 h) & S_{N}^{\prime}(h) & S_{N}^{\prime}(0) & & \\ \vdots & & & \ddots &\\ S_{N}^{\prime}((N-1) h) \end{array}\right)\left(\begin{array}{c} u_{1} \\ u_{2} \\ u_{3} \\ \vdots \\ u_{N} \end{array}\right)% \label{4-15} p′(x1)p′(x2)p′(x3)⋮p′(xN) = SN′(0)SN′(h)SN′(2h)⋮SN′((N−1)h)SN′(−h)SN′(0)SN′(h)SN′(−2h)SN′(−h)SN′(0)⋯⋱SN′((1−N)h) u1u2u3⋮uN
因此, 只需在向量 ( u 1 , u 2 , … , u N ) T \left(u_{1}, u_{2}, \ldots, u_{N}\right)^{\mathrm{T}} (u1,u2,…,uN)T 上乘以一个 N N N 阶方阵即可得到由它的谱方法插值函数 p ( x ) p(x) p(x)的导数组成的向量 ( p ′ ( x 1 ) , p ′ ( x 2 ) , … , p ′ ( x N ) ) T \left(p^{\prime}\left(x_{1}\right), p^{\prime}\left(x_{2}\right), \ldots, p^{\prime}\left(x_{N}\right)\right)^{\mathrm{T}} (p′(x1),p′(x2),…,p′(xN))T, 这个 N N N 阶方阵就是谱求导矩阵 (spectral differentiation matrix).下文用 D N \boldsymbol{D}_{N} DN 来表示 1 阶 N × N N \times N N×N 谱求导矩阵, D N ( n ) \boldsymbol{D}_{N}^{(n)} DN(n) 表示 n n n 阶 N × N N \times N N×N 谱求导矩阵.周期 sinc \operatorname{sinc} sinc 函数 S N ( x ) S_{N}(x) SN(x) 在 x j = j h x_{j}=j h xj=jh 处的 1 阶导数为:
S N ′ ( x j ) = { 0 , ( j % N = 0 ) ( − 1 ) j / 2 ⋅ cot ( j h / 2 ) , ( j % N ≠ 0 ) S_{N}^{\prime}\left(x_{j}\right)=\left\{\begin{array}{cc} 0, & (j \% N=0) \\ (-1)^{j} / 2 \cdot \cot (j h / 2), & (j \% N \neq 0) \end{array}\right.% \label{4-16} SN′(xj)={0,(−1)j/2⋅cot(jh/2),(j%N=0)(j%N=0)
将其代入到式 % \eqref{4-15} 中的 N N N 阶方阵, 得到 1 阶谱求导矩阵:
D N = ( 0 − cot ( 1 h / 2 ) 2 − cot ( 1 h / 2 ) 2 ⋱ ⋱ cot ( 2 h / 2 ) 2 cot ( 2 h / 2 ) 2 ⋱ − cot ( 3 h / 2 ) 2 − cot ( 3 h / 2 ) 2 ⋱ ⋮ ⋮ ⋱ ⋱ cot ( 1 h / 2 ) 2 cot ( 1 h / 2 ) 2 0 ) \boldsymbol{D}_{N}=\left(\begin{array}{ccccc} 0 & & & & -\frac{\cot (1 h / 2)}{2} \\ -\frac{\cot (1 h / 2)}{2} & \ddots & & \ddots & \frac{\cot (2 h / 2)}{2} \\ \frac{\cot (2 h / 2)}{2} & \ddots & & -\frac{\cot (3 h / 2)}{2} \\ -\frac{\cot (3 h / 2)}{2} & & \ddots & & \vdots \\ \vdots & \ddots & \ddots & \frac{\cot (1 h / 2)}{2} \\ \frac{\cot (1 h / 2)}{2} & & & & 0 \end{array}\right)% \label{4-17} DN= 0−2cot(1h/2)2cot(2h/2)−2cot(3h/2)⋮2cot(1h/2)⋱⋱⋱⋱⋱⋱−2cot(3h/2)2cot(1h/2)−2cot(1h/2)2cot(2h/2)⋮0
类似地, 还可以得到高阶谱求导矩阵.周期 sinc \operatorname{sinc} sinc 函数 S N ( x ) S_{N}(x) SN(x) 在 x j = j h x_{j}=j h xj=jh 处的 2 阶导数为:
S N ′ ′ ( x j ) = { − π 2 3 h 2 − 1 6 , ( j % N = 0 ) − ( − 1 ) j csc 2 ( j h / 2 ) 2 , ( j % N ≠ 0 ) S_{N}^{\prime \prime}\left(x_{j}\right)=\left\{\begin{array}{cc} -\frac{\pi^{2}}{3 h^{2}}-\frac{1}{6}, & (j \% N=0) \\ -\frac{(-1)^{j} \csc ^{2}(j h / 2)}{2}, & (j \% N \neq 0) \end{array}\right.% \label{4-18} SN′′(xj)={−3h2π2−61,−2(−1)jcsc2(jh/2),(j%N=0)(j%N=0)
那么, 2 阶谱求导矩阵为:
D N ( 2 ) = ( ⋱ ⋮ ⋱ − 1 2 csc 2 ( 2 h 2 ) ⋱ 1 2 csc 2 ( 1 h 2 ) − π 2 3 h 2 − 1 6 1 2 csc 2 ( 1 h 2 ) ⋱ − 1 2 csc 2 ( 2 h 2 ) ⋱ ⋮ ⋱ ) D_{N}^{(2)}=\left(\begin{array}{ccc} \ddots & \vdots \\ \ddots & -\frac{1}{2} \csc ^{2}\left(\frac{2 h}{2}\right) & \\ \ddots & \frac{1}{2} \csc ^{2}\left(\frac{1 h}{2}\right) & \\ & -\frac{\pi^{2}}{3 h^{2}}-\frac{1}{6} & \\ & \frac{1}{2} \csc ^{2}\left(\frac{1 h}{2}\right) & \ddots \\ & -\frac{1}{2} \csc ^{2}\left(\frac{2 h}{2}\right) & \ddots \\ & \vdots & \ddots \end{array}\right)% \label{4-19} DN(2)= ⋱⋱⋱⋮−21csc2(22h)21csc2(21h)−3h2π2−6121csc2(21h)−21csc2(22h)⋮⋱⋱⋱
周期 sinc 函数 S N ( x ) S_{N}(x) SN(x) 在 x j = j h x_{j}=j h xj=jh 处的 3 阶导数为:
S N m ( x j ) = { 0 , ( j % N = 0 ) ( − 1 ) j cot ( j h 2 ) [ 3 4 csc 2 ( j h 2 ) − π 2 2 h 2 ] , ( j % N ≠ 0 ) S_{N}^{m}\left(x_{j}\right)=\left\{\begin{array}{cc} 0, & (j \% N=0) \\ (-1)^{j} \cot \left(\frac{j h}{2}\right)\left[\frac{3}{4} \csc ^{2}\left(\frac{j h}{2}\right)-\frac{\pi^{2}}{2 h^{2}}\right], & (j \% N \neq 0) \end{array}\right.% \label{4-20} SNm(xj)={0,(−1)jcot(2jh)[43csc2(2jh)−2h2π2],(j%N=0)(j%N=0)
同样得到 3 阶谱求导矩阵:
D
N
(
3
)
=
(
0
−
cot
(
1
h
2
)
[
3
4
cos
2
(
1
h
2
)
−
π
2
2
h
2
]
−
cot
(
1
h
2
)
[
3
4
csc
2
(
1
h
2
)
−
π
2
2
h
2
]
⋱
⋱
cot
(
2
h
2
)
[
3
4
csc
2
(
2
h
2
)
−
π
2
2
h
2
]
cot
(
2
h
2
)
[
3
4
csc
2
(
2
h
2
)
−
π
2
2
h
2
]
⋱
−
cot
(
3
h
2
)
[
3
4
csc
2
(
3
h
2
)
−
π
2
2
h
2
]
−
cot
(
3
h
2
)
[
3
4
csc
2
(
3
h
2
)
−
π
2
2
h
2
]
⋱
⋮
⋮
⋱
⋱
cot
(
1
h
2
)
[
3
4
csc
2
(
1
h
2
)
−
π
2
2
h
2
]
cot
(
1
h
2
)
[
3
4
csc
2
(
1
h
2
)
−
π
2
2
h
2
]
0
)
D_{N}^{(3)}=\left.\left(\begin{array}{cccc}0&&&-\cot\left(\frac{1h}2\right)\left[\frac34\cos^2\left(\frac{1h}2\right)-\frac{\pi^2}{2h^2}\right]\\-\cot\left(\frac{1h}2\right)\left[\frac34\csc^2\left(\frac{1h}2\right)-\frac{\pi^2}{2h^2}\right]&\ddots&\ddots&\cot\left(\frac{2h}2\right)\left[\frac34\csc^2\left(\frac{2h}2\right)-\frac{\pi^2}{2h^2}\right]\\\cot\left(\frac{2h}2\right)\left[\frac34\csc^2\left(\frac{2h}2\right)-\frac{\pi^2}{2h^2}\right]&&\ddots&-\cot\left(\frac{3h}2\right)\left[\frac34\csc^2\left(\frac{3h}2\right)-\frac{\pi^2}{2h^2}\right]\\-\cot\left(\frac{3h}2\right)\left[\frac34\csc^2\left(\frac{3h}2\right)-\frac{\pi^2}{2h^2}\right]&\ddots&&\vdots\\\vdots&\ddots&\ddots&\cot\left(\frac{1h}2\right)\left[\frac34\csc^2\left(\frac{1h}2\right)-\frac{\pi^2}{2h^2}\right]\\\cot\left(\frac{1h}2\right)\left[\frac34\csc^2\left(\frac{1h}2\right)-\frac{\pi^2}{2h^2}\right]&&&0\end{array}\right.\right)% \label{4-21}
DN(3)=
0−cot(21h)[43csc2(21h)−2h2π2]cot(22h)[43csc2(22h)−2h2π2]−cot(23h)[43csc2(23h)−2h2π2]⋮cot(21h)[43csc2(21h)−2h2π2]⋱⋱⋱⋱⋱⋱−cot(21h)[43cos2(21h)−2h2π2]cot(22h)[43csc2(22h)−2h2π2]−cot(23h)[43csc2(23h)−2h2π2]⋮cot(21h)[43csc2(21h)−2h2π2]0
构造 n n n 阶谱求导矩阵 D N ( n ) \boldsymbol{D}_{N}^{(n)} DN(n) 的一般方法为:
(1) 求周期 sinc 函数 $S_{N}(x)$ 在 $x_{j}=j h$ 处的 $n$ 阶导数 $S_{N}^{(n)}\left(x_{j}\right)$ .
(2) $\boldsymbol{D}_{N}^{(n)}$ 的第 1 列为 $\left(S_{N}^{(n)}\left(x_{N}\right), S_{N}^{(n)}\left(x_{1}\right), S_{N}^{(n)}\left(x_{2}\right), \ldots, S_{N}^{(n)}\left(x_{N-1}\right)\right)^{\mathrm{T}}$, 第 2 列为 $\left(S_{N}^{(n)}\left(x_{N-1}\right)\right.$, $\left.S_{N}^{(n)}\left(x_{N}\right), S_{N}^{(n)}\left(x_{1}\right), \ldots, S_{N}^{(n)}\left(x_{N-2}\right)\right)^{\mathrm{T}}$, 第 3 列为 $\left(S_{N}^{(n)}\left(x_{N-2}\right), S_{N}^{(n)}\left(x_{N-1}\right), S_{N}^{(n)}\left(x_{N}\right), \ldots, S_{N}^{(n)}\left(x_{N-3}\right)\right)^{\mathrm{T}} \cdots \cdots$依此类推.
此外, 周期函数 S N ( n ) ( x ) S_{N}^{(n)}(x) SN(n)(x) 的奇偶性是由 n n n 的奇偶决定的, 这在构造 D N ( n ) \boldsymbol{D}_{N}^{(n)} DN(n) 时可以产生一些便利:
∂ n S N ( x ) ∂ x n ∣ x = x j = ( − 1 ) n ∂ n S N ( x ) ∂ x n ∣ x = x N − j \left.\frac{\partial^{n} S_{N}(x)}{\partial x^{n}}\right|_{x=x_{j}}=\left.(-1)^{n} \frac{\partial^{n} S_{N}(x)}{\partial x^{n}}\right|_{x=x_{N-j}}% \label{4-22} ∂xn∂nSN(x) x=xj=(−1)n∂xn∂nSN(x) x=xN−j
当 n n n 为奇数时, 必有:
∂ n S N ( x ) ∂ x n ∣ x = x j = 0 , j % N = 0 \left.\frac{\partial^{n} S_{N}(x)}{\partial x^{n}}\right|_{x=x_{j}}=0, \quad j \% N=0% \label{4-23} ∂xn∂nSN(x) x=xj=0,j%N=0
当 n n n 为偶数时, S N ( n ) ( x ) S_{N}^{(n)}(x) SN(n)(x) 在 x = x j x=x_{j} x=xj 处 ( j % N = 0 ) (j \% N=0) (j%N=0) 的取值是无穷小/无穷小的形式, 需要用洛必达法则求它的极限, 即:
∂ n S N ( x ) ∂ x n ∣ x = x j = lim x → 0 ∂ n S N ( x ) ∂ x n , j % N = 0 \left.\frac{\partial^{n} S_{N}(x)}{\partial x^{n}}\right|_{x=x_{j}}=\lim _{x \rightarrow 0} \frac{\partial^{n} S_{N}(x)}{\partial x^{n}}, \quad j \% N=0% \label{4-24} ∂xn∂nSN(x) x=xj=x→0lim∂xn∂nSN(x),j%N=0
人工计算
S
N
(
x
)
S_{N}(x)
SN(x) 的
n
n
n 阶导数的工作量随着阶数
n
n
n 的增大而显著增加, 比较省时省力的方法是利用 Matlab
的符号运算功能, 调用 diff
函数和 limit
函数求导、求极限, 并结合 toeplitz 函数, 可实现程序自动生成
D
N
(
n
)
\boldsymbol{D}_{N}^{(n)}
DN(n), 有兴趣的读者可以自行尝试.
由于谱求导矩阵 D N ( n ) \boldsymbol{D}_{N}^{(n)} DN(n) 是在计算区间长度为 2 π 2 \pi 2π 的前提下构造的, 所以若实际的计算区间长度为 L L L, 则必须在 D N ( n ) \boldsymbol{D}_{N}^{(n)} DN(n) 上乘以缩放系数才可保证结果正确, 即: ( 2 π / L ) n D N ( n ) (2 \pi / L)^{n} \boldsymbol{D}_{N}^{(n)} (2π/L)nDN(n) .
下面给出使用谱求导矩阵 D N 、 D N ( 2 ) 、 D N ( 3 ) \boldsymbol{D}_{N} 、 \boldsymbol{D}_{N}^{(2)} 、 \boldsymbol{D}_{N}^{(3)} DN、DN(2)、DN(3) 对 u ( x ) = e sin ( π x ) u(x)=\mathrm{e}^{\sin (\pi x)} u(x)=esin(πx) 求 1 、 2 、 3 1 、 2 、 3 1、2、3 阶导数, 并与精确解
u ′ ( x ) = π cos ( π x ) e sin ( π x ) u^{\prime}(x)=\pi \cos (\pi x) \mathrm{e}^{\sin (\pi x)} u′(x)=πcos(πx)esin(πx)
$u^{\prime \prime}(x)=\pi^{2} \mathrm{e}^{\sin (\pi x)}\left[\cos ^{2}(\pi x)-\sin (\pi x)\right] $
$ u^{\prime \prime \prime}(x)=\pi^{3} \mathrm{e}^{\sin (\pi x)} \cos (\pi x)\left[\cos ^{2}(\pi x)-3 \sin (\pi x)-1\right]$
比较的实例.代码如下:
clear all; close all;
L=2; N=32;
x=L/N*[-N/2:N/2-1]';
%构造谱求导矩阵
h=2*pi/N; column=[0 0.5*(-1).^(1:N-1).*cot((1:N-1)*h/2)]';
D=(2*pi/L)*toeplitz(column,column([1 N:-1:2]));
column=[-pi^2/(3*h^2)-1/6 -0.5*(-1).^(1:N-1)./sin(h*(1:N-1)/2).^2];
D2=(2*pi/L)^2*toeplitz(column);
column=[0 (-1).^(1:N-1).*cot((1:N-1)*h/2).*( ...
-pi^2/(2*h^2)+3/4*csc((1:N-1)*h/2).^2)]';
D3=(2*pi/L)^3*toeplitz(column,column([1 N:-1:2]));
%导数的精确解
u=exp(sin(pi*x));
du_exact(:,1)=pi*cos(pi*x).*u;
du_exact(:,2)=pi^2*(cos(pi*x).^2-sin(pi*x)).*u;
du_exact(:,3)=pi^3*cos(pi*x).*(cos(pi*x).^2-3*sin(pi*x)-1).*u;
%谱方法求导
du_Fourier(:,1)=D*u;
du_Fourier(:,2)=D2*u;
du_Fourier(:,3)=D3*u;
error=max(abs(du_exact-du_Fourier));
%画图
labels={'u''(x)','u''''(x)','u''''''(x)'};
for n=1:4
subplot(2,2,n)
if n==1
plot(x,u,'k','LineWidth',1.5)
xlabel x, ylabel u(x), title('u(x)=e^{sin(\pix)}')
else
plot(x,du_exact(:,n-1),'k',x,du_Fourier(:,n-1),'.r' ...
,'MarkerSize',13,'LineWidth',1.5)
title(['Error_{max}=' num2str(error(n-1))])
xlabel x, ylabel(labels(n-1))
end
end
如下图(用谱求导矩阵计算
u
(
x
)
=
e
sin
(
π
x
)
u(x)=\mathrm{e}^{\sin (\pi x)}
u(x)=esin(πx) 的
1
、
2
、
3
1 、 2 、 3
1、2、3 阶导数(点)并与精确解(曲线)比较)所示, 曲线为精确的
u
(
x
)
、
u
′
(
x
)
、
u
′
′
(
x
)
u(x) 、 u^{\prime}(x) 、 u^{\prime \prime}(x)
u(x)、u′(x)、u′′(x) 和
u
′
′
′
(
x
)
u^{\prime \prime \prime}(x)
u′′′(x), 点为利用谱求导矩阵计算得到的
u
′
(
x
j
)
、
u
′
′
(
x
j
)
u^{\prime}\left(x_{j}\right) 、 u^{\prime \prime}\left(x_{j}\right)
u′(xj)、u′′(xj) 和
u
′
′
′
(
x
j
)
u^{\prime \prime \prime}\left(x_{j}\right)
u′′′(xj) .在
N
N
N 的取值仅为 32 的情况下, 用谱求导矩阵计算
u
(
x
)
=
e
sin
(
π
x
)
u(x)=\mathrm{e}^{\sin (\pi x)}
u(x)=esin(πx) 的
1
、
2
、
3
1 、 2 、 3
1、2、3 阶导数与精确解的最大误差分别在
1
0
−
14
、
1
0
−
12
、
1
0
−
10
10^{-14} 、 10^{-12} 、 10^{-10}
10−14、10−12、10−10数量级.
用谱求导矩阵求解偏微分方程的步骤
与之前一样, 待求解的偏微分方程的普遍形式为:
∂ n u ∂ t n = L u + N ( u ) \frac{\partial^{n} u}{\partial t^{n}}=L u+N(u)% \label{4-25} ∂tn∂nu=Lu+N(u)
其中, u ( x , t ) u(x, t) u(x,t) 为 x 、 t x 、 t x、t 的函数, L L L 代表线性算符, N ( u ) N(u) N(u) 为非线性项.通过函数代换可将等号左边的 n n n 阶导数 ∂ n / ∂ t n \partial^{n} / \partial t^{n} ∂n/∂tn 降到 1 阶, 所以下面分析式 % \eqref{4-26} 的求解过程, 这与式 % \eqref{4-25} 降阶后得到的方程组的解法是一样的.
∂ u ∂ t = L u + N ( u ) \frac{\partial u}{\partial t}=L u+N(u)% \label{4-26} ∂t∂u=Lu+N(u)
用谱求导矩阵数值求解式 % \eqref{4-26} 的步骤如下:
(1) 在 x x x 轴上的计算区间内, 将 x x x 离散化为 N N N 个等间距的位置 x = ( x 1 , x 2 , … , x N ) T \boldsymbol{x}=\left(x_{1}, x_{2}, \ldots, x_{N}\right)^{\mathrm{T}} x=(x1,x2,…,xN)T, 相应地, 将函数 u u u 离散化为 N N N 维向量 u = ( u 1 , u 2 , … , u N ) T \boldsymbol{u}=\left(u_{1}, u_{2}, \ldots, u_{N}\right)^{\mathrm{T}} u=(u1,u2,…,uN)T .
(2) 在等号右边,将线性算符 L L L 和非线性项 N ( u ) N(u) N(u) 里所有对函数 u u u 的求导运算替换为谱求导矩阵与向量 u \boldsymbol{u} u 的乘运算, 即: ∂ n u / ∂ x n → D N ( n ) u \partial^{n} u / \partial x^{n} \rightarrow \boldsymbol{D}_{N}^{(n)} \boldsymbol{u} ∂nu/∂xn→DN(n)u, 并将 L L L 和 N ( u ) N(u) N(u) 都写成矩阵形式, 得到形如式 % \eqref{4-27} 的微分方程组.注意, 若计算区间长度不是 2 π 2 \pi 2π, 则必须在 D N ( n ) \boldsymbol{D}_{N}^{(n)} DN(n) 上乘以缩放系数.
(3) 用时间步进法(欧拉法、龙格-库塔法等)数值计算式 % \eqref{4-27} 等号左边的 ∂ / ∂ t \partial / \partial t ∂/∂t,在周期性边界条件下,得到不同 t t t 处的向量 u \boldsymbol{u} u .
∂ ∂ t ( u 1 u 2 u 3 ⋮ u N ) = ( L 11 L 12 L 13 ⋯ L 1 N L 21 L 22 L 23 ⋯ L 2 N L 31 L 32 L 33 ⋯ L 3 N ⋮ ⋮ ⋮ ⋱ ⋮ L N 1 L N 2 L N 3 ⋯ L N N ) ( u 1 u 2 u 3 ⋮ u N ) + N [ ( u 1 u 2 u 3 ⋮ u N ) ] \frac{\partial}{\partial t}\left(\begin{array}{c} u_{1} \\ u_{2} \\ u_{3} \\ \vdots \\ u_{N} \end{array}\right)=\left(\begin{array}{ccccc} L_{11} & L_{12} & L_{13} & \cdots & L_{1 N} \\ L_{21} & L_{22} & L_{23} & \cdots & L_{2 N} \\ L_{31} & L_{32} & L_{33} & \cdots & L_{3 N} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ L_{N 1} & L_{N 2} & L_{N 3} & \cdots & L_{N N} \end{array}\right)\left(\begin{array}{c} u_{1} \\ u_{2} \\ u_{3} \\ \vdots \\ u_{N} \end{array}\right)+N\left[\left(\begin{array}{c} u_{1} \\ u_{2} \\ u_{3} \\ \vdots \\ u_{N} \end{array}\right)\right]% \label{4-27} ∂t∂ u1u2u3⋮uN = L11L21L31⋮LN1L12L22L32⋮LN2L13L23L33⋮LN3⋯⋯⋯⋱⋯L1NL2NL3N⋮LNN u1u2u3⋮uN +N u1u2u3⋮uN
针对步骤 2 , 这里以
L
=
a
⋅
∂
2
/
∂
x
2
+
b
⋅
∂
/
∂
x
+
c
、
N
(
u
)
=
u
3
+
u
3
⋅
∂
2
u
/
∂
x
2
+
f
(
x
)
⋅
∂
u
/
∂
x
L=a \cdot \partial^{2} / \partial x^{2}+b \cdot \partial / \partial x+c 、 N(u)=u^{3}+u^{3} \cdot \partial^{2} u / \partial x^{2}+f(x) \cdot \partial u / \partial x
L=a⋅∂2/∂x2+b⋅∂/∂x+c、N(u)=u3+u3⋅∂2u/∂x2+f(x)⋅∂u/∂x 为例进行说明,
a
、
b
a 、 b
a、b 和
c
c
c 分别为常数.对线性算符
L
L
L, 除了将
∂
n
/
∂
x
n
\partial^{n} / \partial x^{n}
∂n/∂xn 替换为
D
N
(
n
)
\boldsymbol{D}_{N}^{(n)}
DN(n) 之外,还必须在线性算符的常数
c
c
c 上乘以
N
N
N 阶单位矩阵
I
N
\boldsymbol{I}_{N}
IN, 得到
N
N
N 阶方阵
L
\boldsymbol{L}
L, 即:
L
=
a
D
N
(
2
)
+
b
D
N
+
c
I
N
\boldsymbol{L}=a \boldsymbol{D}_{N}^{(2)}+b \boldsymbol{D}_{N}+c \boldsymbol{I}_{N}
L=aDN(2)+bDN+cIN .注意: Matlab 对矩阵与常数之间的加法是有特殊定义的, 如果忘记在
c
c
c 上乘以
I
N
\boldsymbol{I}_{N}
IN 会导致错误, 因为线性算符矩阵
L
\boldsymbol{L}
L 与向量
u
\boldsymbol{u}
u 相乘
L
u
=
(
a
D
N
(
2
)
+
b
D
N
+
c
I
N
)
u
=
a
D
N
(
2
)
u
+
b
D
N
u
+
c
u
≠
(
a
D
N
(
2
)
+
b
D
N
+
c
)
u
\boldsymbol{L} \boldsymbol{u}=\left(a \boldsymbol{D}_{N}^{(2)}+b \boldsymbol{D}_{N}+c \boldsymbol{I}_{N}\right) \boldsymbol{u}=a \boldsymbol{D}_{N}^{(2)} \boldsymbol{u}+b \boldsymbol{D}_{N} \boldsymbol{u}+c \boldsymbol{u} \neq\left(a \boldsymbol{D}_{N}^{(2)}+b \boldsymbol{D}_{N}+c\right) \boldsymbol{u}
Lu=(aDN(2)+bDN+cIN)u=aDN(2)u+bDNu+cu=(aDN(2)+bDN+c)u .对非线性项
N
(
u
)
N(u)
N(u), 替换
∂
n
∂
x
n
\partial^{n} \partial x^{n}
∂n∂xn 为
D
N
(
n
)
\boldsymbol{D}_{N}^{(n)}
DN(n) 时,
D
N
(
n
)
\boldsymbol{D}_{N}^{(n)}
DN(n) 与向量
u
\boldsymbol{u}
u 之间的乘法是矩阵乘法, 在 Matlab
中用 *
表示.而
u
3
u^{3}
u3 应理解为向量
u
\boldsymbol{u}
u 中的每个元素的立方, 这在 Matlab 中用 . ^3
表示.类似地,
f
(
x
)
⋅
(
D
N
u
)
f(\boldsymbol{x}) \cdot\left(\boldsymbol{D}_{N} \boldsymbol{u}\right)
f(x)⋅(DNu) 也应处理为
f
(
x
)
f(\boldsymbol{x})
f(x) 和向量
D
N
u
\boldsymbol{D}_{N} \boldsymbol{u}
DNu 中的每个对应元素的相乘, 在 Matlab
中用 .*
表示.所以此时
L
u
+
N
(
u
)
L u+N(u)
Lu+N(u) 在 Matlab
中应写为:
(a*D2+b*D1+c*I)*u+u.^3+u.^3.*(D2*u)+f.*(D1*u)
换句话说, 只有谱求导矩阵 D N ( n ) \boldsymbol{D}_{N}^{(n)} DN(n) 与向量 u \boldsymbol{u} u 之间的乘法是矩阵运算, 其余的运算均是在矩阵或向量的元素之间进行的.但也有一个例外,由于线性算符 L L L 中的常数 c c c 在矩阵化时乘了单位矩阵 I N \boldsymbol{I}_{N} IN, 所以实际上 c I N c \boldsymbol{I}_{N} cIN 与向量 u \boldsymbol{u} u 之间也是矩阵乘法, 这样才能将其与线性算符 L L L 中的其他项相加: L = a D N ( 2 ) + b D N + c I N \boldsymbol{L}=a \boldsymbol{D}_{N}^{(2)}+b \boldsymbol{D}_{N}+c \boldsymbol{I}_{N} L=aDN(2)+bDN+cIN .
若方程式 % \eqref{4-26} 再增加一个维度, 等号右边包含了 u ( x , y , t ) u(x, y, t) u(x,y,t) 的 ∂ n / ∂ x n \partial^{n} / \partial x^{n} ∂n/∂xn 和 ∂ n / ∂ y n \partial^{n} / \partial y^{n} ∂n/∂yn, 那么求解步骤中的一些细节就需要推广到二维空间上.在 x x x 轴、 y y y 轴上的计算区间内分别取等间距的 N N N 个位置 x = ( x 1 , x 2 , … , x N ) T \boldsymbol{x}=\left(x_{1}, x_{2}, \ldots, x_{N}\right)^{\mathrm{T}} x=(x1,x2,…,xN)T 以及 y = ( y 1 , y 2 , … , y N ) T \boldsymbol{y}=\left(y_{1}, y_{2}, \ldots, y_{N}\right)^{\mathrm{T}} y=(y1,y2,…,yN)T, 于是在 x − y x-y x−y 平面上的计算区域内就得到了 N 2 N^{2} N2 个位置的坐标 ( x 1 , y 1 ) , ( x 1 , y 2 ) , … , ( x 1 , y N ) , ( x 2 , y 1 ) , … , ( x 2 , y N ) , … , ( x N , y N ) \left(x_{1}, y_{1}\right),\left(x_{1}, y_{2}\right), \ldots,\left(x_{1}, y_{N}\right),\left(x_{2}, y_{1}\right), \ldots,\left(x_{2}, y_{N}\right), \ldots,\left(x_{N}, y_{N}\right) (x1,y1),(x1,y2),…,(x1,yN),(x2,y1),…,(x2,yN),…,(xN,yN) .相应地, 函数 u u u 可以被离散化为 N N N 阶方阵(第一种形式)或 N 2 N^{2} N2 维列向量(第二种形式), 如式 % \eqref{4-28} 、式 % \eqref{4-29} 所示:
u N × N = ( u 11 u 12 ⋯ u 1 N u 21 u 22 ⋯ u 2 N ⋮ ⋮ ⋱ ⋮ u N 1 u N 2 ⋯ u N N ) \begin{aligned} & \boldsymbol{u}_{N \times N}=\left(\begin{array}{cccc} u_{11} & u_{12} & \cdots & u_{1 N} \\ u_{21} & u_{22} & \cdots & u_{2 N} \\ \vdots & \vdots & \ddots & \vdots \\ u_{N 1} & u_{N 2} & \cdots & u_{N N} \end{array}\right) \end{aligned}% \label{4-28} uN×N= u11u21⋮uN1u12u22⋮uN2⋯⋯⋱⋯u1Nu2N⋮uNN
u N 2 × l = ( u 11 , u 21 , … , u N 1 , u 12 , u 22 , … , u N 2 , … , u N N ) T \boldsymbol{u}_{N^2\times\mathbf{l}}=\begin{pmatrix}u_{11},&u_{21},&\ldots,&u_{N1},&u_{12},&u_{22},&\ldots,&u_{N2},&\ldots,&u_{NN}\end{pmatrix}^\mathrm{T}% \label{4-29} uN2×l=(u11,u21,…,uN1,u12,u22,…,uN2,…,uNN)T
式 % \eqref{4-28} 中, 第 i i i 行 j j j 列的元素 u i j u_{i j} uij 对应的坐标是 ( x j , y i ) \left(x_{j}, y_{i}\right) (xj,yi) .列向量 % \eqref{4-29} 的第 1 到第 N N N个元素对应于式 % \eqref{4-28} 的第 1 列, 第 N + 1 N+1 N+1 到第 2 N 2 N 2N 个元素对应于式 % \eqref{4-28} 的第 2 列……依此类推. 另外, 可以通过 Matlab 中的 reshape 函数在二者间进行转换.
收敛阶说明
收敛阶定义
o r d e r = { log 2 [ E ( τ ) / E ( τ / 2 ) ] , in time log 2 [ E ( N ) / E ( 2 N ) ] , in space. order =\left\{\begin{array}{c}\log _2[E(\tau) / E(\tau / 2)], \text { in time } \\ \log _2[E(N) / E(2 N)], \text { in space. }\end{array}\right. order={log2[E(τ)/E(τ/2)], in time log2[E(N)/E(2N)], in space.
时间方向 | 空间方向 |
---|---|
斜率含义 | 斜率含义 |
k = log 2 E ( τ ) − log 2 E ( τ 2 ) log 2 τ − log 2 τ 2 = log 2 E ( τ ) E ( τ 2 ) log 2 τ τ 2 = log 2 E ( τ ) E ( τ 2 ) = order \begin{aligned} k & =\frac{\log _2 E(\tau)-\log _2 E\left(\frac{\tau}{2}\right)}{\log _2 \tau-\log _2 \frac{\tau}{2}} \\ & =\frac{\log _2 \frac{E(\tau)}{E\left(\frac{\tau}{2}\right)}}{\log _2 \frac{\tau}{\frac{\tau}{2}}} \\ & =\log _2 \frac{E(\tau)}{E\left(\frac{\tau}{2}\right)} \\ & =\text { order }\end{aligned} k=log2τ−log22τlog2E(τ)−log2E(2τ)=log22ττlog2E(2τ)E(τ)=log2E(2τ)E(τ)= order | k = log 2 E ( N ) − log 2 E ( 2 N ) N − 2 N = − 1 N log 2 E ( N ) E ( 2 N ) = − 1 N order \begin{aligned} k & =\frac{\log _2 E(N)-\log _2 E\left(2N\right)}{N-2 N} \\ & =-\frac{1}{N} \log _2 \frac{E(N)}{E\left(2N\right)} \\ & =-\frac{1}{N} \text { order } \end{aligned} k=N−2Nlog2E(N)−log2E(2N)=−N1log2E(2N)E(N)=−N1 order |
时间步长 τ \tau τ与误差 E ( τ ) E(\tau) E(τ)的关系 | 空间剖分 N N N与误差 E ( N ) E(N) E(N)的关系 |
log 2 E ( τ ) = k log 2 τ + b log 2 E ( τ ) = log 2 τ k + log 2 2 b log 2 E ( τ ) = log 2 2 b τ k E ( τ ) = 2 b τ k \begin{aligned} \log _2 E(\tau) & = k\log _2\tau + b \\ \log _2 E(\tau) &=\log _2\tau^k + \log _22^b\\\log _2 E(\tau) &=\log _22^b\tau^k\\E(\tau)&=2^b\tau^k\end{aligned} log2E(τ)log2E(τ)log2E(τ)E(τ)=klog2τ+b=log2τk+log22b=log22bτk=2bτk | log 2 E ( N ) = k N + b log 2 E ( N ) = log 2 2 k N + b E ( N ) = 2 k N + b E ( N ) = 2 b 2 k N \begin{aligned} \log _2 E(N) & = kN + b \\ \log _2 E(N) &=\log _2 2^{kN + b}\\E(N)&=2^{kN + b}\\E(N)&=2^b2^{kN}\end{aligned} log2E(N)log2E(N)E(N)E(N)=kN+b=log22kN+b=2kN+b=2b2kN |