我正在为一个二维PDE问题实现一个有限差分格式。我希望避免使用循环来产生有限的差异。例如,要生成u(x,y)_xx的二阶中心差,我可以将u(x,y)乘以如下:

u_xy = (u_{i+1,j+1} + u_{i-1,j-1} - u_{i-1,j+1} - u_{i+1,j-1})/(4 4dxdy)是否有良好的矩阵表示?这是一个很难编码的问题,因为它是在2D -我想乘一些矩阵的u(x,y),以避免循环。非常感谢!
发布于 2016-03-15 15:21:20
如果你的点存储在一个N-by-N矩阵中,那么,就像你说的,左乘有限差分矩阵给出了关于u_{xx}的二阶导数的近似。右乘有限差分矩阵的转置等价于近似u_{yy}.通过左乘的u_{xy}和的右乘,可以得到混合导数的逼近,例如中心差分矩阵。
delta_2x =
0 1 0 0 0
-1 0 1 0 0
0 -1 0 1 0
0 0 -1 0 1
0 0 0 -1 0(然后除以因子4*Dx*Dy),所以类似于
U_xy = 1/(4*Dx*Dy) * delta_2x * U_matrix * delta_2x';如果将矩阵转换为N^2向量
U_vec = U_matrix(:);然后,这些操作符可以用Kronecker积表示,在MATLAB中实现为kron:
A*X*B = kron(B',A)*X(:);所以对于有限差分矩阵
U_xy_vec = 1/(4*Dx*Dy)*(kron(delta_2x,delta_2x)*U_vec);如果您有一个N-by-M矩阵U_mat,则左矩阵乘法等价于kron(eye(M),delta_2x_N),右乘法等价于kron(delta_2y_M,eye(N)),其中delta_2y_M (delta_2x_N)是M-by-M (N-by-N)中心差分矩阵,因此操作是
U_xy_vec = 1/(4*Dx*Dy) * kron(delta_2y_M,delta_2y_N)*U_vec;下面是一个MATLAB代码示例:
N = 20;
M = 30;
Dx = 1/N;
Dy = 1/M;
[Y,X] = meshgrid((1:(M))./(M+1),(1:(N))/(N+1));
% Example solution and mixed derivative (chosen for 0 BCs)
U_mat = sin(2*pi*X).*(sin(2*pi*Y.^2));
U_xy = 8*pi^2*Y.*cos(2*pi*X).*cos(2*pi*Y.^2);
% Centred finite difference matrices
delta_x_N = 1/(2*Dx)*(diag(ones(N-1,1),1) - diag(ones(N-1,1),-1));
delta_y_M = 1/(2*Dy)*(diag(ones(M-1,1),1) - diag(ones(M-1,1),-1));
% Cast U as a vector
U_vec = U_mat(:);
% Mixed derivative operator
A = kron(delta_y_M,delta_x_N);
U_xy_num = A*U_vec;
U_xy_matrix = reshape(U_xy_num,N,M);
subplot(1,2,1)
contourf(X,Y,U_xy_matrix)
colorbar
title 'Numeric U_{xy}'
subplot(1,2,2)
contourf(X,Y,U_xy)
colorbar
title 'Analytic U_{xy}'

发布于 2016-03-15 14:21:57
很明显,您可以自己创建矩阵,但是在Matlab中有tridiag用于此目的。
例如
>> full(gallery('tridiag',5,-1,2,-1))安=
2 -1 0 0 0
-1 2 -1 0 0
0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2发布于 2017-07-21 06:23:38
利用MATLAB中的稀疏函数生成有限差分逼近矩阵是一个很好的选择。它节省了很多(实际上非常多)的记忆.
https://stackoverflow.com/questions/36013726
复制相似问题