谱方法学习笔记-下(超详细)

谱方法学习笔记📒

谱方法学习笔记-上(超详细)
声明:鉴于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. tu=(x22+y22)u+γ(au+u2v)tv=d(x22+y22)v+γ(bu2v)
其中, u u u v v v 可看做两种化学反应物质的浓度, x 、 y x 、 y xy 为空间坐标, t t t 为时间, a 、 b 、 d a 、 b 、 d abd γ \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. {tu^=(kx2+ky2)u^^+γF{aF1[u^]+F1[u^]2F1[v^]}tv^=d(kx2+ky2)v^+γF{bF1[u^]2F1[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 xy 平面原点处为 1 , 在其他位置为 0 , v 0, v 0,v 在整个 x − y x-y xy 平面上均为 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:4subplot(2,2,n)gca=pcolor(ifft2(reshape(uvtsol(n,1:N^2),N,N))); axis offset(gca,'LineStyle','none'), shading interptitle(['t=' num2str(t(n))]), axis('square'),
%     colormap('gray')
end

程序输出的结果如图所示,这与化学实验中观察到的靶型波一致。

求解 Schnakenberg 模型得到的靶型波

Matlab 将计算结果制作成 gif 动画

引言

求解包含时间的偏微分方程 (组) 将得到随着时间变化的数值结果, 把这样的数据制作成 gif 动画并结合到幻灯片中, 在毕业答辩、小组讨论、课堂教学等场合有着广泛的应用。生动的彩色 gif 动画具有很强的表现力, 令人刮目相看, 大大提高了报告人所讲述理论结果的直观性、生动性、观赏性。

函数介绍

生成 gif 动画主要用到 4 4 4 个函数: getframeframe2imrgb2indimwrite

  1. getframe 函数的一般调用形式为: F=getframe(h), 其作用是截取句柄为 h 的窗口内的一帧图像。

  2. frame2im 函数的作用是把一帧截图转为图像数据。

  3. rgb2ind 函数的作用是将 RGB 图像转换为索引图像, 一般调用形式为: [X, map]= rgb2ind(RGB,n) 。其中, Xmap 分别为转换后的图像数据和颜色表数据, RGB 为转换前的图像数据, n 指定 map 中的颜色数。

  4. imwrite 函数的作用是将图像数据写入图像文件, 一般调用形式为: imwrite(X,map,filename,fmt,Param1,Val1,Param2,Val2...)。其中, Xmap 意义同上, 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:10u=a*exp(-10*(X.^2+Y.^2));mesh(x,y,u),axis([-1 1 -1 1 0 10]),drawnowim=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 动画。

output

修改后的程序源代码:

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 offset(gca,'LineStyle','none'), shading interptitle(['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 ,u1,u0,u1,,uN1,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=1Neikxjuj,k=2N+1,,2Nuj=2π1k=N/2+1N/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/21)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/2N/2eikxju^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/2N/2eikxu^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} xnnp(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=1Neikxjδ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/2N/2eikx=2πh 21k=N/2N/21eikx+21k=N/2+1N/2eikx =2πh 21e2ixk=N/2+1/2N/21/2eikx+21e2ixk=N/2+1/2N/21/2eikx =2πhcos(x/2)k=N/2+1/2N/21/2eikx=2πhcos(x/2)1eixei(N/2+1/2)xei(N/2+1/2)x=2πhcos(x/2)eix/2eix/2ei(N/2)xei(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)x0=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=1Numδjm

那么, 将其中的周期 δ \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=1NumSN(xxm)

注意到 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=1NumSN(xjxm)

其中, x j − x m = ( j − m ) h x_{j}-x_{m}=(j-m) h xjxm=(jm)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((N1)h)SN(h)SN(0)SN(h)SN(2h)SN(h)SN(0)SN((1N)h) u1u2u3uN

因此, 只需在向量 ( 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/2cot(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= 02cot(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π261,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π26121csc2(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)= 0cot(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} xnnSN(x) x=xj=(1)nxnnSN(x) x=xNj

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} xnnSN(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} xnnSN(x) x=xj=x0limxnnSN(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)} DNDN(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 123 阶导数, 并与精确解

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:4subplot(2,2,n)if n==1plot(x,u,'k','LineWidth',1.5)xlabel x, ylabel u(x), title('u(x)=e^{sin(\pix)}')elseplot(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 123 阶导数(点)并与精确解(曲线)比较)所示, 曲线为精确的 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 123 阶导数与精确解的最大误差分别在 1 0 − 14 、 1 0 − 12 、 1 0 − 10 10^{-14} 、 10^{-12} 、 10^{-10} 101410121010数量级.
用谱求导矩阵计算  的  阶导数(点)并与精确解(曲线)比较

用谱求导矩阵求解偏微分方程的步骤

与之前一样, 待求解的偏微分方程的普遍形式为:

∂ n u ∂ t n = L u + N ( u ) \frac{\partial^{n} u}{\partial t^{n}}=L u+N(u)% \label{4-25} tnnu=Lu+N(u)

其中, u ( x , t ) u(x, t) u(x,t) x 、 t x 、 t xt 的函数, 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} tu=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/xnDN(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 u1u2u3uN = L11L21L31LN1L12L22L32LN2L13L23L33LN3L1NL2NL3NLNN u1u2u3uN +N u1u2u3uN

针对步骤 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=a2/x2+b/x+cN(u)=u3+u32u/x2+f(x)u/x 为例进行说明, a 、 b a 、 b ab 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} nxn 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 xy 平面上的计算区域内就得到了 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= u11u21uN1u12u22uN2u1Nu2NuNN

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=N2Nlog2E(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/205756.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习笔记09、Shell命令之历史命令和自动补全

上一篇:Linux学习笔记08、Shell命令之常用命令缩写及全称 目录 1、历史命令: 1.1、查看所有历史命令列表: 1.2、查看指定历史命令: 1.3、清除历史命令: 2、自动补全 2.1、当字符串唯一时: 2.2、当有多个…

Python自动化测试数据驱动解决数据错误

数据驱动将测试数据和测试行为完全分离,实施数据驱动测试步骤如下: A、编写测试脚本,脚本需要支持从程序对象、文件或者数据库读入测试数据; B、将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中;…

C++面向对象复习笔记暨备忘录

C指针 指针作为形参 交换两个实际参数的值 #include <iostream> #include<cassert> using namespace std;int swap(int *x, int* y) {int a;a *x;*x *y;*y a;return 0; } int main() {int a 1;int b 2;swap(&a, &b);cout << a << &quo…

GraphCast:基于机器学习的全球中期天气预测模型

文章信息 文章题为”GraphCast: Learning skillful medium-range global weather forecasting”&#xff0c;该文章于2023年发表至Science&#xff0c;文章内容主要关于利用机器学习模型&#xff0c;实现高效、准确的全球中期天气预测。由于文章内容较多&#xff0c;本文仅对研…

Retrofit+OkHttp打印Request 请求地址参数

在移动端开发时&#xff0c;我们常常需要像web端一样可以方便地查看我们向服务器发送请求的报文详细日志&#xff08;如请求地址&#xff0c;请求参数&#xff0c;请求类型&#xff0c;服务器响应的耗时时间&#xff0c;请求返回的结果等等&#xff09;。 使用Retrofit时&…

【傻瓜级JS-DLL-WINCC-PLC交互】6.​向PLC里面装载数据变量

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

Jmeter进阶使用:BeanShell实现接口前置和后置操作!

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…

fastReID论文总结

fastReID论文总结 fastReIDReID所面临的挑战提出的背景概念&#xff1a;所谓ReID就是从视频中找出感兴趣的物体&#xff08;人脸、人体、车辆等&#xff09;应用场景&#xff1a;存在的问题&#xff1a;当前的很多ReID任务可复用性差&#xff0c;无法快速落地使用解决方式&…

用Metasploit进行信息收集2

基于FTP协议收集信息 1.查看ftp服务的版本信息 打开metasploit 查看ftp版本的模块&#xff0c;并进入模块 msf6 > search ftp_version msf6 > use auxiliary/scanner/ftp/ftp_version msf6 auxiliary(scanner/ftp/ftp_version) > show options 查看靶机的端口开方情…

SpringCloud原理】OpenFeign之FeignClient动态代理生成原理

大家好&#xff0c;前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理&#xff0c;这篇文章来继续剖析SpringCloud组件原理&#xff0c;来看一看OpenFeign是如何基于Ribbon来实现负载均衡的&#xff0c;两组件是如何协同工作的。 一、Feign动态代理调用实现rpc流…

Python语言学习笔记之六(程序调试及异常处理)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、Python程序常见的错误 语法错误:不正确的缩进、未定义的变量、括号不匹配等.运行时错误: 尝试访问不存在的…

爬虫学习 异步爬虫(五)

多线程 多进程 协程 进程 运行中的程序 线程 被CPU调度的执行过程,操作系统 运算调度的min单位 在进程之中,进程中实际运作单位 from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(target …

Nuxt.js:下一代Web开发框架的革命性力量

文章目录 一、Nuxt.js简介二、Nuxt.js的特点1. 集成Vue.js和Node.js2. 自动代码分割和优化3. 服务端渲染&#xff08;SSR&#xff09;4. 强大的路由管理5. 丰富的插件系统 三、Nuxt.js的优势1. 提高开发效率2. 降低维护成本3. 提高用户体验 四、Nuxt.js在实际应用中的案例1. 电…

前端:实现二级菜单(二级菜单悬浮在一级菜单左侧)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

5V摄像机镜头驱动IC GC6208,可用于摄像机,机器人等产品中可替代AN41908

GC6208是一个镜头电机驱动IC摄像机和安全摄像机。该设备集成了一个直流电机驱动器的Iris的PID控制系统&#xff0c;也有两个通道的STM电机驱动器的变焦和对焦控制。 芯片的特点: 内置用于Iris控制器的直流电机驱动器 内置2个STM驱动程序&#xff0c;用于缩放和…

flink源码分析之功能组件(四)-slotpool组件I

简介 本系列是flink源码分析的第二个系列&#xff0c;上一个《flink源码分析之集群与资源》分析集群与资源&#xff0c;本系列分析功能组件&#xff0c;kubeclient&#xff0c;rpc&#xff0c;心跳&#xff0c;高可用&#xff0c;slotpool&#xff0c;rest&#xff0c;metrics&…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来&#xff0c;我国光伏发电行业规模日益壮大&#xff0c;全球领先地位愈发巩固。为解决光伏电站运维中的难题&#xff0c;浙江某光伏电站与复亚智能达成战略合作&#xff0c;共同推出全自动无人机光伏巡检系统&#xff0c;旨在提高发电效率、降低运维成本&#xff0c;最大…

react的开发中关于图片的知识

React是一个流行的JavaScript库&#xff0c;用于构建用户界面。在React开发中&#xff0c;图片是一个非常重要的元素&#xff0c;可以用于美化界面和展示内容。本篇博客将详细讲解React中关于图片的知识。 1. React中使用图片 在React中使用图片非常简单&#xff0c;只需要使…

智慧公厕为城市智慧管理提供强力有的数据支持

在当今科技飞速发展的时代&#xff0c;城市管理正面临着前所未有的挑战与机遇。而在这个城市发展的脚步日新月异的同时&#xff0c;一项看似不起眼的技术却正在默默地为城市的智慧管理提供着强有力的支持——那就是智慧公厕。这些不起眼的公共设施不仅仅是人们日常生活的一部分…

hive里如何高效生成唯一ID

常见的方式&#xff1a; hive里最常用的方式生成唯一id&#xff0c;就是直接使用 row_number() 来进行&#xff0c;这个对于小数据量是ok的&#xff0c;但是当数据量大的时候会导致&#xff0c;数据倾斜&#xff0c;因为最后生成全局唯一id的时候&#xff0c;这个任务是放在一个…