了解Matlab中的DEL2函数,以便用C+编写+; 为了在C++中编写DEL2 MATLAB函数,需要了解算法。我已经设法为矩阵中不在边界或边上的元素编写了函数。 我已经看过几个关于它的主题,并通过键入“editdel2”或“typedel2”阅读了MATLAB代码,但我不理解为获得边界和边而进行的计算

了解Matlab中的DEL2函数,以便用C+编写+; 为了在C++中编写DEL2 MATLAB函数,需要了解算法。我已经设法为矩阵中不在边界或边上的元素编写了函数。 我已经看过几个关于它的主题,并通过键入“editdel2”或“typedel2”阅读了MATLAB代码,但我不理解为获得边界和边而进行的计算,c++,function,matlab,C++,Function,Matlab,非常感谢您的帮助。DEL2在MatLab中表示离散拉普拉斯算子,您可以找到一些关于它的信息 关于边的主要问题是矩阵内部的元素有四个邻居,而边和角上的元素分别有三个或两个邻居。因此,计算角点和边的方法相同,但使用的元素较少 只知道点右侧(或左侧)的u值,就可以近似计算u''。 为了获得二阶近似值,需要3个方程(基本泰勒展开): u(i+1)=u(i)+hu'+(1/2)hu^2u'+(1/6)hu^3u'+O(h^4) u(i+2)=u(i)+2hu'+(4/2)hu^2u'+(8/6)hu^3u

非常感谢您的帮助。

DEL2在MatLab中表示离散拉普拉斯算子,您可以找到一些关于它的信息

关于边的主要问题是矩阵内部的元素有四个邻居,而边和角上的元素分别有三个或两个邻居。因此,计算角点和边的方法相同,但使用的元素较少

只知道点右侧(或左侧)的u值,就可以近似计算u''。 为了获得二阶近似值,需要3个方程(基本泰勒展开):

u(i+1)=u(i)+hu'+(1/2)hu^2u'+(1/6)hu^3u'+O(h^4)

u(i+2)=u(i)+2hu'+(4/2)hu^2u'+(8/6)hu^3u'+O(h^4)

u(i+3)=u(i)+3hu'+(9/2)hu^2u'+(27/6)hu^3u'+O(h^4)

求解u''给出(1)

h^2U'=-5U(i+1)+4U(i+2)-u(i+3)+2U(i)+O(h^4)

为了得到拉普拉斯公式,你需要用这个边界上的公式来代替传统的公式

例如,如果“i=0”,您将有:

del2(i=0,j)=[-5u(i+1,j)+4u(i+2,j)-u(i+3,j)+2u(i,j)+u(i,j+1)+u(i,j-1)-2u(i,j)]/h^2

编辑澄清:

拉普拉斯函数是x方向和y方向上的二阶导数之和。您可以使用公式(2)

u'=(u(i+1)+u(i-1)-2u(i))/h^2

如果你有u(i+1)和u(i-1)。如果i=0或i=imax,你可以使用我写的第一个公式来计算导数(注意,由于二阶导数的相似性,如果i=imax,你可以用“i-k”替换“i+k”)。这同样适用于y(j)方向:

在边缘上,您可以混合公式(1)(2)

del2(u)(i=imax,j)=[-5u(i-1,j)+4u(i-2,j)-u(i-3,j)+2u(i,j)+u(i,j+1)+u(i,j-1)-2u(i,j)]/h^2

del2(u)(i,j=0)=[-5u(i,j+1)+4u(i,j+2)-u(i,j+3)+2u(i,j)+u(i+1,j)+u(i-1,j)-2u(i,j)]/h^2

del2(u)(i,j=jmax)=[-5u(i,j-1)+4u(i,j-2)-u(i,j-3)+2u(i,j)+u(i+1,j)+u(i-1,j)-2u(i,j)]/h^2

在拐角处,两个方向只需使用(1)两次

del2(u)(i=0,j=0)=[-5u(i,j+1)+4u(i,j+2)-u(i,j+3)+2u(i,j)+-5u(i,j+1)+4u(i+2,j)-u(i+3,j)+2u(i,j)]/h^2

Del2是二阶离散拉普拉斯函数,即,它允许在直角坐标网格NxN上近似给定实连续函数的拉普拉斯函数,其中两个相邻节点之间的距离为h

h^2只是一个常数维因子,通过设置h^2=4,可以从这些公式中获得matlab实现

例如,如果你想计算(0,L)x(0,L)平方上u(x,y)的实拉普拉斯函数,你要做的是在NxN笛卡尔网格上写下这个函数的值,即你计算u(0,0),u(L/(N-1),0),u(2L/(N-1),0)。。。u((N-1)L/(N-1)=L,0)。。。u(0,L/(N-1)),u(L/(N-1),L/(N-1))等等,然后把这些N^2值放到矩阵a中

那你就有 ans=4*del2(A)/h^2,其中h=L/(N-1)

如果起始函数是线性或二次函数(x^2+y^2精细,x^3+y^3不精细),则del2将返回连续拉普拉斯函数的精确值。如果函数不是线性或二次函数,则使用的点越多(即在极限h->0内),结果越精确


我希望这更清楚,请注意,我使用基于0的索引访问矩阵(C/C++数组样式),而matlab使用基于1的索引。

下面是我用Fortran 90编写的一个模块,它复制了matlab中的“del2()”操作符,实现了上述思想。它仅适用于至少为4x4或更大的阵列。当我运行它时,它会成功运行,所以我想我会发布它,这样其他人就不必浪费时间制作自己的

module del2_mod
implicit none
real, private                       :: pi
integer, private                    :: nr, nc, i, j, k
contains
! nr is number of rows in array, while nc is the number of columns in the array.
!!---------------------------------------------------------- 

subroutine del2(in, out)
real, dimension(:,:)            :: in, out
real, dimension(nr,nc)          :: interior, left, right, top, bottom, ul_corner, br_corner, disp
integer                         :: i, j
real                            :: h, ul, ur, bl, br
! Zero out internal arrays
out = 0.0; interior=0.0; left = 0.0;  right = 0.0;  top = 0.0;  bottom = 0.0;  ul_corner = 0.0; br_corner = 0.0;
h=2.0

! Interior Points
do j=1,nc
    do i=1,nr
    ! Interior Point Calculations
    if( j>1 .and. j<nc .and. i>1 .and. i<nr )then
        interior(i,j) = ((in(i-1,j) + in(i+1,j) + in(i,j-1) + in(i,j+1)) - 4*in(i,j) )/(h**2)
    end if
    ! Boundary Conditions for Left and Right edges
    left(i,1) = (-5.0*in(i,2) + 4.0*in(i,3) - in(i,4) + 2.0*in(i,1) + in(i+1,1) + in(i-1,1) - 2.0*in(i,1) )/(h**2)
    right(i,nc) = (-5.0*in(i,nc-1) + 4.0*in(i,nc-2) - in(i,nc-3) + 2.0*in(i,nc) + in(i+1,nc) + in(i-1,nc) - 2.0*in(i,nc) )/(h**2)
    end do
! Boundary Conditions for Top and Bottom edges
top(1,j) = (-5.0*in(2,j) + 4.0*in(3,j) - in(4,j) + 2.0*in(1,j) + in(1,j+1) + in(1,j-1) - 2.0*in(1,j) )/(h**2)
bottom(nr,j) = (-5.0*in(nr-1,j) + 4.0*in(nr-2,j) - in(nr-3,j) + 2.0*in(nr,j) + in(nr,j+1) + in(nr,j-1) - 2.0*in(nr,j) )/(h**2)
end do
out = interior + left + right + top + bottom 
! Calculate BC for the corners
ul = (-5.0*in(1,2) + 4.0*in(1,3) - in(1,4) + 2.0*in(1,1) - 5.0*in(2,1) + 4.0*in(3,1) - in(4,1) + 2.0*in(1,1))/(h**2)
br = (-5.0*in(nr,nc-1) + 4.0*in(nr,nc-2) - in(nr,nc-3) + 2.0*in(nr,nc) - 5.0*in(nr-1,nc) + 4.0*in(nr-2,nc) - in(nr-3,nc) + 2.0*in(nr,nc))/(h**2)
bl = (-5.0*in(nr,2) + 4.0*in(nr,3) - in(nr,4) + 2.0*in(nr,1) - 5.0*in(nr-1,1) + 4.0*in(nr-2,1) - in(nr-3,1) + 2.0*in(nr,1))/(h**2)
ur = (-5.0*in(1,nc-1) + 4.0*in(1,nc-2) - in(1,nc-3) + 2.0*in(1,nc) - 5.0*in(2,nc) + 4.0*in(3,nc) - in(4,nc) + 2.0*in(1,nc))/(h**2)
! Apply BC for the corners
out(1,1)=ul
out(1,nc)=ur
out(nr,1)=bl
out(nr,nc)=br
end subroutine

end module
模块del2\u mod
隐式无
真实的,私人的
整数,私有::nr,nc,i,j,k
包含
! nr是数组中的行数,nc是数组中的列数。
!!---------------------------------------------------------- 
子程序del2(输入、输出)
实数,维度(:,:)::输入,输出
真实,尺寸(nr,nc)::内部,左侧,右侧,顶部,底部,ul_角,br_角,显示
整数::i,j
雷亚尔:h、ul、ur、bl、br
! 调零内部阵列
out=0.0;内部=0.0;左=0.0;右=0.0;top=0.0;底部=0.0;ul_角=0.0;br_角=0.0;
h=2.0
! 内点
do j=1,常闭
i=1,nr吗
! 内点计算

如果(j>1.and.j1.and.i这太难了!我浪费了几个小时来理解并用Java实现它

这是:

测试并与原始函数DEL2(Matlab)进行比较

我在sbabbi回复中发现了一个拼写错误:

del2(u) (i=0,j=0) = [-5 u(i,j+1) + 4 u(i,j+2) - u(i,j+3) + 2 u(i,j) + -5 u(i,j+1) + 4 u(i+2,j) - u(i+3,j) + 2 u(i,j)]/h^2


事实上我已经试过了,但这不是del2函数计算这些值的方式。感谢这个解释,它更清楚了:)还有一些事情我不清楚:这些方程中的h^2是什么,我怎样才能只知道矩阵u?当我想计算第一列(j=0)上的值时,我应该如何处理“+u(I,j-1)”?同样,当j=max时,如何处理“+u(i,j+1)”?“+2u(i,j)[…]-2u(i,j)”看到这等于0,这是一个打字错误吗?谢谢:)非常非常感谢。为了正确地理解它,我不得不经历过几次,但我完全理解它
del2(u) (i=0,j=0) = [-5 u(i,j+1) + 4 u(i,j+2) - u(i,j+3) + 2 u(i,j) + -5 u(i+1,j) + 4 u(i+2,j) - u(i+3,j) + 2 u(i,j)]/h^2