矩阵生成有限差分

时间:2016-03-15 14:11:39

标签: matlab numerical-methods pde numerical-analysis

我正在为2D PDE问题实现有限差分方案。我希望避免使用循环来生成有限差分。例如,为了生成u(x,y)_xx的二阶中心差,我可以将u(x,y)乘以以下:

enter image description here

是否存在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)以避免循环。非常感谢!

3 个答案:

答案 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_NM-by-M)中央差异矩阵,因此操作

N-by-N

这是一个MATLAB代码示例:

U_xy_vec = 1/(4*Dx*Dy) * kron(delta_2y_M,delta_2y_N)*U_vec;

Numerical and Analytic Comparison for Mixed Finite Difference Operator

答案 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中提供的稀疏功能来生成有限差分近似矩阵是一个不错的选择..它可以节省很多(实际上非​​常多)内存......