差分方程与exp(At)

这篇文章的主题是“解耦”

如下面这个不等式,其中u是t的函数,且有


上式中相互作用,这种关系就是耦合,我们的任务就是解除二者之间这种纠结的关系,至于解耦的好处不必多说了,大家能罗列许多。

为了解决这个问题,需要介绍以下知识:

(1)差分方程

其中是列向量,是矩阵

以一个简单的矩阵为例


很容易观察到,A的迹(trace)为-3,A是奇异矩阵(singular),所以,矩阵A有一个特征值0,还有一个特征值-3,微分方程的解具有如下的形式


其中lambda(1)=0,lambda(2)=-3,x1和x2分别是对应的特征向量。我们可以将u(t)带入原式就可以知道,这是满足方程的解,由此我们得到了两个没有耦合关系的项,这样我们就实现了“解耦”

继续往下走,

由于,所以由对应系数相等我们可以解得

c1=c2=1/3,所以有


当t趋近于无穷大时,exp(-3t)=0,所以

上述描述了由本文最开始给出的差分方程所构建的系统的稳态。

(2)应用对角化方法

再次回到差分方程



在上面的解答步骤中我们可以得到


写成矩阵的形式如下


简记为Sc=u(0),其中S是特征向量所构成的矩阵。在方程中,u1和u2二者是耦合的关系,我们使用对角化方法,设u=Sv,其中S是对角阵,将具有耦合关系的u1和u2转为解耦的v1和v2,其中S是特征向量构成的矩阵,这很容易让人联想到矩阵的对角化,没有错,这里用的就是这个知识点。我们将u(t)=Sv(t)代入式中,得到

所以,

(3)矩阵指数函数

我们知道下面这两个泰勒级数


我们可以把矩阵指数函数exp(At)看成上面的第一个泰勒级数展开式


同理,I-At的倒数也可以写成如下的形式


如果矩阵A可以对角化(这个是前提),那么其中,是对角阵,对角线元素是矩阵A的特征值,且有


这个证明很容易,这里就不再累述。

我们如何看待这个式子呢,当A的特征值lambda(i)小于0时,exp(labmda(i)*t)在t趋近于无穷大时会收敛于0,趋于稳定,因此,如果一个系统由差分方程的形式给出时,我们需要考虑的是系统矩阵的特征值的实部,而虚部由欧拉公式展开可知其模为1,就是一个单位圆,Strang教授把虚部看成是小噪音,它只是一个在单位圆的圆周上绕转而已,而真正决定系统稳态的是实部,当实部为负数时,其矩阵指数函数最终会收敛。

最后一个要提的问题是,我们前面说的是2阶的系统,如果是更高阶的,比如系统由这样一个高阶方程表示


那怎么办呢,这里使用的小技巧是

,那么有,这样问题就得到了解决。对于更高阶的,系统矩阵A具有下面这样的形式

(这里假定是五阶系统)

down!微笑


三维偏微分方程的紧差分格式可以参考以下代码: ```matlab % 偏微分方程的参数 L = 1; % 空间区域的长度 T = 1; % 时间区域的长度 % 空间和时间的离散化步长 dx = 0.1; % x方向的步长 dy = 0.1; % y方向的步长 dz = 0.1; % z方向的步长 dt = 0.01; % 时间步长 % 空间和时间的网格数 nx = L/dx + 1; % x方向的网格数 ny = L/dy + 1; % y方向的网格数 nz = L/dz + 1; % z方向的网格数 nt = T/dt + 1; % 时间网格数 % 初始化矩阵 u = zeros(nx, ny, nz, nt); % 四维数组,代表在空间和时间上的离散化 % 边界条件 % 在这里我们假设边界条件为 Dirichlet 条件,即在边界上的数值是已知的 % 为了简化,我们假设边界上的值都为0 u(1,:,:,:) = 0; % x=0边界 u(nx,:,:,:) = 0; % x=L边界 u(:,1,:,:)=0; % y=0边界 u(:,ny,:,:)=0; % y=L边界 u(:,:,1,:)=0; % z=0边界 u(:,:,nz,:)=0; % z=L边界 % 初始条件 % 在这里我们假设初始条件为一个高斯波包 % 为了简化,我们假设波包在空间中心处 u(:,:,:,1) = exp(-((dx*(0:nx-1)-L/2).^2+(dy*(0:ny-1)-L/2).^2+(dz*(0:nz-1)-L/2).^2)/0.1); % 紧差分格式的系数 ax = 1/(dx^2); ay = 1/(dy^2); az = 1/(dz^2); at = 1/(dt^2); bx = -2*ax; by = -2*ay; bz = -2*az; bt = -2*at; c = 2/(dx^2) + 2/(dy^2) + 2/(dz^2) + 1/(dt^2); % 时间迭代 for t = 2:nt % 在空间中使用三维卷积来计算下一个时间步的值 u(:,:,:,t) = c*u(:,:,:,t-1) + ax*convn(u([2:end,1],:,:,t-1), [1,-2,1], 'same') + ay*convn(u(:,[2:end,1],:,t-1), [1,-2,1], 'same') + az*convn(u(:,:,[2:end,1],t-1), [1,-2,1], 'same') + at*u(:,:,:,t-2); end % 绘制动画 for t = 1:nt slice(u(:,:,:,t),[],[],[]); colormap(jet); shading interp; axis equal; axis([1,nx,1,ny,1,nz]); drawnow; end ``` 这个代码使用了紧差分格式来离散化三维波动方程,其中使用了三维卷积来计算下一个时间步的值。最后,我们绘制了一个动画,展示了在空间中波包的传播情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值