【发布时间】:2014-08-11 17:42:06
【问题描述】:
我正在实现wave equation 的模拟,它使用一个数组来离散地模拟波可以在其中传播的空间区域。目前,波从空间区域的边界反射。但是,我想消除这种反射,使波看起来永远传播出去。
我知道有许多学术论文讨论了非反射/吸收边界条件(例如完美匹配的层?),但大多数似乎都集中在解析解决方案上。我无法弄清楚如何在我的模拟中以数字方式实现非反射边界。这是我正在编写的代码:
for (var i = 1; i < width - 1; ++i) {
for (var j = 1; j < height - 1; ++j) {
var d2f_dx2 = f[i + 1][j] - f[i][j] * 2 + f[i - 1][j];
var d2f_dy2 = f[i][j + 1] - f[i][j] * 2 + f[i][j - 1];
var d2f_dt2 = c2[i][j] * (d2f_dx2 + d2f_dy2);
df_dt[i][j] += d2f_dt2;
}
}
for (var i = 1; i < width - 1; ++i) {
for (var j = 1; j < height - 1; ++j) {
f[i][j] += df_dt[i][j];
}
}
其中f 是字段,df_dt 是字段相对于时间的偏导数,d2f_dt2 是字段相对于时间的二阶偏导数,d2f_dx2 是二阶偏导数场在 x 方向上的二阶偏导数,d2f_dy2 是场在 y 方向上的二阶偏导数。
有谁知道我可以如何调整此代码以使其具有非反射边界?
【问题讨论】:
-
我不相信上面的代码显示了您正在寻求消除的 (x,y) 边界约束,除非 df/dt、dx/dt 或 dy/dt 的系数矩阵变得渐近或阻尼。看,我在上面的代码中看不到任何会导致波速或加速度方向反转的硬边界。您能否发布您正在使用的波动方程的相关部分(是的,我查看了 wiki,但大量可能的边界条件使您的代码不具体)。另外,你能在 f(x) 和 f(y) 的拐点周围发布几行输出吗?
-
让我澄清一下。你有
f[i + 1][j] - f[i][j] * 2 + f[i - 1][j];x 加速度和f[i][j + 1] - f[i][j] * 2 + f[i][j - 1];y。看你的条件。对于 x,任何时候((f[i][j] * 2 ) > (f[i + 1][j] + f[i - 1][j]))你都会得到加速度幅度的反转。对于 y,任何时候((f[i][j] * 2) > (f[i][j + 1] + f[i][j - 1]))你都会得到 y 的反转。您将必须检查条件f[i][j] * 2在哪里合并到您的等式中。如果所有系数都是正数,这是唯一会引起反射的项。
标签: physics numeric numerical-methods physics-engine numerical-integration