首页 理论教育 Matlab谱方法高效解法:求解微分方程

Matlab谱方法高效解法:求解微分方程

时间:2023-10-31 理论教育 版权反馈
【摘要】:根据5.1.1小节,对有限区间内的非周期函数进行数值求导的最佳方法是这样的:首先在计算区间内确定N+1个切比雪夫点x0,x1,…由于上述过程是线性的,可以写成矩阵形式,所以本小节的目标就是总结其中的规律并构造切比雪夫求导矩阵,将求导运算转化为矩阵运算。根据式(5-5),3×3切比雪夫求导矩阵D2为:若继续如此计算更高阶的DN,将会找到其中的规律。

Matlab谱方法高效解法:求解微分方程

根据5.1.1小节,对有限区间内的非周期函数进行数值求导的最佳方法是这样的:首先在计算区间内确定N+1个切比雪夫点x0,x1,…,xN,在这些点上对函数进行代数多项式插值,得到最高次幂小于或等于N的插值函数p(x),然后求插值函数在切比雪夫点处的导数p′(x0),p′(x1),…,p′(xN)。由于上述过程是线性的,可以写成矩阵形式,所以本小节的目标就是总结其中的规律并构造切比雪夫求导矩阵,将求导运算转化为矩阵运算。

选取计算区间为[-1,1],以便讨论。坐标被离散化为xj=cos(jπ/N),其中j=0,1,…,N,用x表示N+1维向量(x0,x1,…,xN)T。与第4章不同,这里的N是任意正整数而不仅是正偶数,区间内的离散点数为N+1个而不是N个,坐标x0,x1,…,xN是由大到小而不是由小到大,请注意区分。用u代表这些位置上的函数值组成的N+1维向量(u0,u1,…,uN)Tp(x)代表它的插值函数。定义DN为(N+1)×(N+1)切比雪夫求导矩阵,并使得下式成立:

p′(x)=DNu (5-5)

先来看N=1和N=2的情况,然后推广到一般情况。N=1时,只有2个插值点x0=1和x1=-1,以及相应的2个函数值u0和u1,则插值函数为:

978-7-111-51623-1-Part03-9.jpg

对其求导,得:

978-7-111-51623-1-Part03-10.jpg

为了满足式(5-5),构造2×2切比雪夫求导矩阵D1为:

978-7-111-51623-1-Part03-11.jpg

N=2时,有3个插值点x0=1、x1=0和x2=-1,以及相应的3个函数值u0u1和u2,则插值函数为:

978-7-111-51623-1-Part03-12.jpg

对其求导,得:

978-7-111-51623-1-Part03-13.jpg

代入x0=1、x1=0和x2=-1就可以得到该位置的导数值。根据式(5-5),3×3切比雪夫求导矩阵D2为:

978-7-111-51623-1-Part03-14.jpg

若继续如此计算更高阶的DN,将会找到其中的规律。下面略过这个过程,直接给出对于任意N的切比雪夫求导矩阵DN中每个元素的表达式:

978-7-111-51623-1-Part03-15.jpg

其中(DN)ij代表切比雪夫求导矩阵DN中第i+1行第j+1列的元素。且:

978-7-111-51623-1-Part03-16.jpg

下式直观地给出了切比雪夫求导矩阵DN的结构:

978-7-111-51623-1-Part03-17.jpg

由于后面的程序将反复用到切比雪夫求导矩阵DN和相应的切比雪夫点,所以下面给出函数cheb的定义文件cheb.m,只需输入N的值就能返回DN和相应的切比雪夫点,以便其他程序调用。

程序5-3

cheb.m文件代码如下:

978-7-111-51623-1-Part03-18.jpg

实际上,cheb.m并不是严格按照式(5-12)来计算DN的,对角线上的元素是由对角线以外的元素来计算的,即:(www.xing528.com)

978-7-111-51623-1-Part03-19.jpg

这样就给出了存在舍入误差的情况下更具稳定性的DN。试想这个情形:对于离散函数值u=(1,1,…,1)T,它的插值函数为一常数p(x)=1,所以p′(x)=0。这就要求DN与(1,1,…,1)T的乘积必须是(0,0,…,0)T,于是就得到了式(5-15)。

下面是N=1,2,3,4,5时cheb输出的结果,注意到DN是“中心对称”的,即:(DN)ij=-(DN)N-i,N-j

978-7-111-51623-1-Part03-20.jpg

978-7-111-51623-1-Part03-21.jpg

DN是用于求1阶导数的切比雪夫求导矩阵,要得到用于求2阶导数的切比雪夫求导矩阵,一般有两种思路:(1)用精确的表达式计算。(2)直接对DN平方。为了简便,本书采用第2种思路,同样,还可以得到用于求高阶导数的切比雪夫求导矩阵:

978-7-111-51623-1-Part03-22.jpg

因为DN的表达式是在区间[-1,1]上得到的,所以,在对其他区间上的函数求导前,还需要对DN进行缩放,即:∂/∂x→(2/L)DNn/∂xn→[(2/L)DN]n

下面的代码用切比雪夫求导矩阵计算u(x)=sech(x)和u(x)=esin(2x)在[-1,1]上的1、2阶导数,并与精确解进行比较。

程序5-4

978-7-111-51623-1-Part03-23.jpg

978-7-111-51623-1-Part03-24.jpg

程序输出结果如图5-4所示,曲线为精确的u(x)、u′(x)和u(x),点分别为u(xj)及利用切比雪夫求导矩阵计算得到的u(xj)和u(xj)。可以看到,在N=32的条件下,误差在10-10至10-14数量级

978-7-111-51623-1-Part03-25.jpg

图5-4 用切比雪夫求导矩阵计算u(x)=sech(x)和u(x)=esin(2x)在[-1,1]上的 1、2阶导数的数值解(点)并与精确解(曲线)比较

对于二维问题,先用切比雪夫点分别在x、y方向上划分区间[-1,1],即x=(x0,x1,…,xN)T和y=(y0,y1,…,yN)T。于是在x-y平面的-1≤x,y≤1区域内得到了(N+1)2个点:(x0,y0),(x0,y1),…,(x0,yN),(x1,y0),…,(x1,yN),…,(xN,yN),如图5-5所示,左图中N=8,右图中N=16。

978-7-111-51623-1-Part03-26.jpg

图5-5 用切比雪夫点划分二维区域

N+1阶方阵或(N+1)2维向量u表示这些点上的函数值(可用Matlab的reshape函数在二者之间互相转换):

978-7-111-51623-1-Part03-27.jpg

其中,元素uij对应的坐标是(xj,yi)。可将nu/∂ynnu/∂xn写为矩阵形式:

978-7-111-51623-1-Part03-28.jpg

或者写为:

978-7-111-51623-1-Part03-29.jpg

其中,IN+1N+1阶单位矩阵

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

我要反馈