首页 理论教育 Matlab谱求导矩阵:高效计算微分&误差分析

Matlab谱求导矩阵:高效计算微分&误差分析

时间:2023-10-31 理论教育 版权反馈
【摘要】:下文用DN来表示1阶N×N谱求导矩阵,DN表示n阶N×N谱求导矩阵。周期sinc函数SN在xj=jh处的1阶导数为:将其代入到式中的N阶方阵,得到1阶谱求导矩阵:类似地,还可以得到高阶谱求导矩阵。在N的取值仅为32的情况下,用谱求导矩阵计算u=esin(πx)的1、2、3阶导数与精确解的最大误差分别在10-14、10-12、10-10数量级。图4-2 用谱求导矩阵计算u=esin(πx)的1、2、3阶导数(点)并与精确解(曲线)比较

Matlab谱求导矩阵:高效计算微分&误差分析

周期δ函数定义为:

978-7-111-51623-1-Part02-106.jpg

其中,百分号“%”代表求余运算,周期δ函数在j=mN(m为任意整数)时取值为1,其他情况为0,它所对应的横坐标为xj=jh。利用式(4-3)求周期δ函数的离散傅里叶变换,结果为一常数h

978-7-111-51623-1-Part02-107.jpg

再利用式(4-6)求周期δ函数的插值函数:

978-7-111-51623-1-Part02-108.jpg

由式(4-2),最终得到的周期δ函数的插值函数为周期sinc函数SN

978-7-111-51623-1-Part02-109.jpg

可以证明,SN(x)|x→0=1。图4-1显示了周期δ函数以及它的插值函数——周期sinc函数SN(x),二者的周期均为2π,无论N取值为4还是16,后者都精确、巧妙地经过了前者的所有离散点。

978-7-111-51623-1-Part02-110.jpg

图4-1 曲线为周期sinc函数,黑点为周期δ函数,上下两图分别对应N=4和N=16

若将区间[0,2π]上的序列u1,u2,…,uN写为周期δ函数的线性叠加,即:

978-7-111-51623-1-Part02-111.jpg

那么,将其中的周期δ函数替换为周期sinc函数SN,就得到序列u1,u2,…,uN的插值函数p(x):

978-7-111-51623-1-Part02-112.jpg

注意到p(x)就是SN(x)的线性组合,如果用p(x)来估算序列u1,u2,…,uNxj=jh处的1阶导数,则有:

978-7-111-51623-1-Part02-113.jpg

其中,xj-xm=(j-m)h。将上式写为矩阵形式:

978-7-111-51623-1-Part02-114.jpg

因此,只需在向量(u1,u2,…,uN)T上乘以一个N阶方阵即可得到由它的谱方法插值函数p(x)的导数组成的向量(p'(x1),p'(x2),…,p'(xN))T,这个N阶方阵就是谱求导矩阵(spectral differentiation matrix)。下文用DN来表示1阶N×N谱求导矩阵,DN(n)表示n阶N×N谱求导矩阵。

周期sinc函数SN(x)在xj=jh处的1阶导数为:

978-7-111-51623-1-Part02-115.jpg

将其代入到式(4-15)中的N阶方阵,得到1阶谱求导矩阵:

978-7-111-51623-1-Part02-116.jpg

类似地,还可以得到高阶谱求导矩阵。周期sinc函数SN(x)在xj=jh处的2阶导数为:

978-7-111-51623-1-Part02-117.jpg(www.xing528.com)

那么,2阶谱求导矩阵为:

978-7-111-51623-1-Part02-118.jpg

周期sinc函数SN(x)在xj=jh处的3阶导数为:

978-7-111-51623-1-Part02-119.jpg

同样得到3阶谱求导矩阵:

978-7-111-51623-1-Part02-120.jpg

构造n阶谱求导矩阵DN(n)的一般方法为:

(1)求周期sinc函数SN(x)在xj=jh处的n阶导数SN(n)(xj)。

(2)DN(n)的第1列为(SN(n)(xN),SN(n)(x1),SN(n)(x2),…,SN(n)(xN-1))T,第2列为(SN(n)(xN-1),SN(n)(xN),SN(n)(x1),…,SN(n)(xN-2))T,第3列为(SN(n)(xN-2),SN(n)(xN-1),SN(n)(xN),…,SN(n)(xN-3))T……依此类推。

此外,周期函数SN(n)(x)的奇偶性是由n的奇偶决定的,这在构造DN(n)时可以产生一些便利:

978-7-111-51623-1-Part02-121.jpg

当n为奇数时,必有:

978-7-111-51623-1-Part02-122.jpg

n为偶数时,SN(n)(x)在x=xj处(j%N=0)的取值是无穷小/无穷小的形式,需要用洛必达法则求它的极限,即:

978-7-111-51623-1-Part02-123.jpg

人工计算SN(x)的n阶导数的工作量随着阶数n的增大而显著增加,比较省时省力的方法是利用Matlab的符号运算功能,调用diff函数和limit函数求导、求极限,并结合toeplitz函数,可实现程序自动生成DN(n),有兴趣的读者可以自行尝试。

由于谱求导矩阵DN(n)是在计算区间长度为2π的前提下构造的,所以若实际的计算区间长度为L,则必须在DN(n)上乘以缩放系数才可保证结果正确,即:(2π/L)nDN(n)

下面给出使用谱求导矩阵DNDN(2)DN(3)对u(x)=esin(πx)求1、2、3阶导数,并与精确解u'(x)=πcos(πx)esin(πx)u"(x)=π2esin(πx)[cos2x)-sin(πx)]、u'''(x)=π3esin(πx)cos(πx)[cos2x)-3sin(πx)-1]比较的实例。代码如下:

程序4-1

978-7-111-51623-1-Part02-124.jpg

978-7-111-51623-1-Part02-125.jpg

如图4-2所示,曲线为精确的u(x)、u′(x)、u″(x)和u′′′(x),点为利用谱求导矩阵计算得到的u′(xj)、u″(xj)和u′′′(xj)。在N的取值仅为32的情况下,用谱求导矩阵计算u(x)=esin(πx)的1、2、3阶导数与精确解的最大误差分别在10-14、10-12、10-10数量级。

978-7-111-51623-1-Part02-126.jpg

图4-2 用谱求导矩阵计算u(x)=esin(πx)的1、2、3阶导数(点)并与精确解(曲线)比较

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈