一维中的高效任意阶有限差分

计算科学 matlab 有限差分
2021-12-07 22:40:47

我在 Matlab 上实现了一个高阶有限差分方案来近似的一阶导数f(xi)给定x=[x(1),x(2),...,x(i),...,x(n)]f=[f(x(1)),..,f(x(n))]x来自的非均匀网格x(1)x(n)(实际上它们是 Legendre-Gauss-Lobatto 节点[1,1])。现在我使用https://en.wikibooks.org/wiki/Using_High_Order_Finite_Differences/Definitions_and_Basics#approximation_of_a_first_derivative的第 2.1 章中详述的方法,它使用 Vandermonde 矩阵。

我决定先设置h=x(i+1)x(i)要么x(i)x(i1)根据i,然后我计算范德蒙德矩阵M使用α(j)=(x(j)x(i))/h我得到了aj的系数与M[0,1,0,..,0]'。最后f(xi) (1/h)(a1f(x1)+...+anf(xn)). 看起来这个方法返回了正确的结果,不幸的是它使计算非常慢......

你知道另一种计算任意阶有限差分方案的方法吗?或者更快的方法来计算aj的系数?

我希望我的解释足够清楚,并且已经感谢您的回答。

1个回答

多项式逼近的关键要点之一是避免涉及 Vandermonde 矩阵的方法。这也应该适用于您引用的方法,该方法基本上是在单项式基础上对给定函数的一阶导数进行多项式插值。

绕过 Vandermonde 矩阵的一种方法是使用多项式基组而不是单项式基,而拉格朗日多项式的基通常是首选方法。Fornberg 推导出了这方面的一种流行方法,请参见此处此处我建议您改用这种方法。

此外,对于 Gauss-Lobatto 节点,导数矩阵是准确已知的。然而,如上面第二个链接所示,这并不意味着结果必须比使用 Fornberg 的方法更准确(连同链接帖子中也提到的对角线校正)。