为了用C++编写DEL2 matlab函数的代码,我需要了解算法。我设法为不在边界或边缘上的矩阵元素编码函数。
我已经看过几个相关的主题,并通过键入“edit del2”或“type del2”来阅读MATLAB代码,但是我不理解为获得边界和边缘而进行的计算。

任何帮助,将不胜感激,谢谢。

最佳答案

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

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

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

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

解决u''得到(1):

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

要获得拉普拉斯算式,您需要在边界上用此公式代替传统公式。

例如,在“i = 0”的情况下,您将拥有:

del2(u)(i = 0,j)= [-5 u(i + 1,j)+ 4 u(i + 2,j)-u(i + 3,j)+ 2 u(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”替换为“ik”) 。 y(j)方向也是如此:

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

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

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

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

而且在拐角处,您将双向同时使用(1)两次。

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是二阶离散拉普拉斯算子,即在正方形直角坐标网格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 ^矩阵A中的2个值。

那你有
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的索引。

关于c++ - 理解Matlab中的DEL2函数以便用C++进行编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13342651/

10-09 23:50