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

谱方法学习笔记📒

谱方法学习笔记-上(超详细)
声明:鉴于CSDN使用 K a T e X KaTeX KaTeX 渲染公式, KaTeX \KaTeX KATEX L a T e X LaTeX LaTeX 不同,不支持直接的交叉引用命令,如\label\eqref KaTeX \KaTeX KATEX专注于数学公式的呈现,而不提供完整的文档生成功能。因此,为了保证显示正常,本文中所有公式均已删除编号和交叉引用。由此可能导致一些可读性上的不便,请读者谅解。

傅里叶谱方法求解基本偏微分方程—二维 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: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

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

求解 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: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 动画。

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 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 ,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: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 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

  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MIT(麻省理工学院)的线性代数公开课非常详细和全面,这门课程是由麻省理工学院的教授Gilbert Strang主讲的。课程内容涵盖了线性代数的基本概念和应用,将线性代数的理论与实践相结合。 这门课程的笔记非常详细,内容包括了课堂讲义、示例问题的详细解析、证明过程和习题答案等等。课程的整个结构非常清晰,从基础的向量、矩阵和行列式开始讲解,逐渐深入到线性方程组、特征值和特征向量、相似矩阵等内容。 在笔记中,每个概念和理论都会进行详细的解释和证明,帮助学生更好地理解和掌握相关知识。同时,笔记还提供了丰富的示例和习题,让学生通过实际的问题来巩固和应用所学知识。 另外,笔记中还有大量的图表、图示和实例来帮助学生直观地理解和记忆各种概念和算法。特别是对于抽象的概念,通过图形化的解释可以更好地帮助学生理解。 总之,MIT的线性代数公开课的笔记内容非常详细和全面,适合对线性代数感兴趣的学生参考。无论是作为学习线性代数的资料,还是作为复习和巩固知识的辅助材料,这些笔记都是非常有价值的资源。无论是在理论还是应用层面,学生都能够通过这些笔记全面地掌握线性代数的知识。 ### 回答2: MIT线性代数公开课是由麻省理工学院开设的一门线性代数课程,涵盖了从基础概念到高阶技巧的全方位学习内容。下面是对该课程的笔记总结: 该课程由吉尔伯特•斯特朗(Gilbert Strang)教授主讲,他是一位著名的数学家和教育家,为学生提供了一种简单而深入的学习方法。 该课程共分为26节课,每节课都有对应的讲义和视频,以及一些习题和作业,使学生能够更好地掌握课程内容。 课程首先介绍了向量和矩阵的基础知识,讲解了向量的加法、减法和数乘运算,以及矩阵的加法、减法和乘法运算,并且讲解了这些运算的几何意义。然后,课程进一步探讨了线性方程组的求解方法,包括高斯消元法和矩阵的逆运算。这些内容为后续课程奠定了基础。 接下来,课程介绍了行列式和特征值的概念,并讲解了如何计算行列式和求解特征值和特征向量。特征值和特征向量在矩阵的变换中起着重要的作用,因此对于理解线性代数的应用非常重要。 随后,课程进一步深入探讨了线性变换、正交性和投影等概念,以及特殊矩阵的性质,如对称矩阵和正定矩阵。这些内容使学生能够更好地理解线性代数在实际应用中的重要性。 最后,课程介绍了一些高级线性代数的内容,如奇异值分解和特殊矩阵的标准形式。这些内容对于研究生和专业领域的学生尤为重要。 总的来说,MIT线性代数公开课提供了一套完整、系统的线性代数学习资源,不仅适用于初学者,还可以帮助已经具备一定线性代数基础的学生深入学习。课程中的讲义和视频内容清晰明了,配有大量实例和习题,以及讲解中的实时演算,确保学生能够深入理解和掌握线性代数的核心概念和技巧。无论是在学术研究还是职业发展中,这门课程都具有重要的参考价值。 ### 回答3: 麻省理工学院(MIT)的线性代数公开课是一门非常出色的公开课,内容十分详细并且完整。以下是对该公开课的详细笔记。 该公开课以线性代数为主题,通过教授线性代数的基本概念、理论和应用,帮助学生建立起对线性代数的深入理解和应用能力。 课程从基本概念讲起,首先介绍了向量和矩阵的定义、性质和操作。然后深入讲解了线性方程组的解法,包括高斯消元法和矩阵的行列式。接下来,课程探讨了向量空间和矩阵空间的性质及其应用,如子空间、基、维数等概念。进一步,课程讲解了线性变换和特征值、特征向量的概念及其重要性。 在讲解了线性代数的基本理论后,课程引入了矩阵分解和特殊矩阵的概念,如LU分解、QR分解和特征值分解等。随后,课程介绍了正交向量、正交矩阵和正交变换的概念及其在几何变换、信号处理等领域的应用。 此外,课程还涉及了线性代数在图论、最小二乘问题、数据压缩等领域的应用。通过实例和案例分析,课程帮助学生将线性代数的理论知识与实际问题相结合,提高解决实际问题的能力。 值得一提的是,该公开课还通过演示和实验的方式,让学生亲自动手进行线性代数的计算和应用,培养了学生的实践能力和创造力。 总的来说,麻省理工学院的线性代数公开课以其详细的内容和完整的知识体系,在教授线性代数知识和培养学生的应用能力方面取得了优异的成绩。无论是对于想要深入学习线性代数的学生,还是对于希望提高问题解决能力的人群,这门公开课都是非常推荐的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图灵猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值