我正在为2D 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})/(4dxdy)?在2D中进行编码是一个更难的问题 - 我想将一些矩阵乘以u(x,y)以避免循环。非常感谢!
答案 0 :(得分:2)
如果您的点存储在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 product表示这些运算符,在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
({ {1}})是delta_2x_N
(M-by-M
)中央差异矩阵,因此操作
N-by-N
这是一个MATLAB代码示例:
U_xy_vec = 1/(4*Dx*Dy) * kron(delta_2y_M,delta_2y_N)*U_vec;
答案 1 :(得分:0)
你可以自己创建矩阵,但在Matlab中有tridiag
用于此目的。
例如
>> full(gallery('tridiag',5,-1,2,-1))
ans =
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
答案 2 :(得分:0)
使用MATLAB中提供的稀疏功能来生成有限差分近似矩阵是一个不错的选择..它可以节省很多(实际上非常多)内存......