首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成有限差分的矩阵

生成有限差分的矩阵
EN

Stack Overflow用户
提问于 2016-03-15 14:11:39
回答 3查看 4.7K关注 0票数 1

我正在为一个二维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),以避免循环。非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-15 15:21:20

如果你的点存储在一个N-by-N矩阵中,那么,就像你说的,左乘有限差分矩阵给出了关于u_{xx}的二阶导数的近似。右乘有限差分矩阵的转置等价于近似u_{yy}.通过左乘的u_{xy}和的右乘,可以得到混合导数的逼近,例如中心差分矩阵。

代码语言:javascript
复制
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),所以类似于

代码语言:javascript
复制
U_xy = 1/(4*Dx*Dy) * delta_2x * U_matrix * delta_2x';

如果将矩阵转换为N^2向量

代码语言:javascript
复制
U_vec = U_matrix(:);

然后,这些操作符可以用Kronecker积表示,在MATLAB中实现为kron

代码语言:javascript
复制
A*X*B = kron(B',A)*X(:);

所以对于有限差分矩阵

代码语言:javascript
复制
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)中心差分矩阵,因此操作是

代码语言:javascript
复制
U_xy_vec = 1/(4*Dx*Dy) * kron(delta_2y_M,delta_2y_N)*U_vec;

下面是一个MATLAB代码示例:

代码语言:javascript
复制
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}'

票数 3
EN

Stack Overflow用户

发布于 2016-03-15 14:21:57

很明显,您可以自己创建矩阵,但是在Matlab中有tridiag用于此目的。

例如

代码语言:javascript
复制
>> full(gallery('tridiag',5,-1,2,-1))

安=

代码语言:javascript
复制
 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
票数 0
EN

Stack Overflow用户

发布于 2017-07-21 06:23:38

利用MATLAB中的稀疏函数生成有限差分逼近矩阵是一个很好的选择。它节省了很多(实际上非常多)的记忆.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36013726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档