以前的评论给了你很好的建议,我试着补充一些。
首先,您的示例 2x2 确实不对应于零纽曼边界条件。事实上,可以证明您的选择导致了零狄利克雷边界条件。
如果您的域是一个矩形,则可以轻松实现零诺伊曼条件。您必须将边界处的值包含在未知数中(您可能已经这样做了)。对于矩形角落的四个节点,您必须在矩阵的相应行中将两个-1更改为-2,对于边界节点对应的所有其他行仅更改一个-1到-2,它必须完全是单位于矩形内部的条目,因此不在边界上。正如其他人之前所指出的,矩阵中每一行的所有条目的总和必须等于零,如果你做得正确,这是对你的另一次检查。
零纽曼边界条件的有限差分离散化背后的想法是,您想象在矩形的每一侧旁边有一行或一列节点,并带有额外的(人工)未知数。这意味着您可以使用标准模板,对角线为 4,非对角线为四倍 -1。可以通过添加对应于零诺依曼边界条件的离散方程来消除额外的未知数,例如∂xφ=0,采用离散形式(希望符号清晰),例如(φ1j−φ−1j)/dx=0, 所以人工未知数相等φ−1j=φ1j. 将其代入未知数的离散方程φ0j你得到了我的建议。顺便说一句,这对应于您应该更喜欢的二阶精确近似值。
另一点是,对泊松方程应用零诺依曼边界条件会给你提供形式上无限多个解的欠定系统,但它们的区别仅在于常数(这意味着如果你减去两个解函数,你会得到常数函数)。一旦您将一个值固定为 0(如其他人所建议的那样),您就可以选择那些无限多的解决方案之一,这样您的问题就有了唯一的解决方案。就像您定义狄利克雷边界条件(例如φ=0) 在边界的一个点上。当然,这样的节点必须从你的未知数中排除,所以你的矩阵中没有这个节点的行。
有时你的线性求解器可以解决这个问题,但这是另一回事,上面的建议可能要简单得多。