涉及最大值抽象导数的表达式的化简

Simplification of expressions involving abstract derivatives in maxima

我正在尝试让 maxima 执行一些 "abstract" 泰勒级数展开,但我 运行 遇到了简化问题。问题的原型可能是梯度的有限差分模拟,

g(x1,dx1) := (f(x1+dx1) - f(x1))/dx1;  /* dx1 is small */
taylor(g(x1,dx1), [dx1], [0], 0);

其中 maxima returns

到目前为止一切顺利。但是现在试试二阶导数(Hessian)的有限差分模拟,

h(x1,dx1) := (f(x1+dx1) - 2*f(x1) + f(x1-dx1))/dx1^2;
taylor(h(x1,dx1), dx1, 0, 0);

我得到

这几乎没有帮助。

我要解决的 "real" 问题的原型是计算 ∂^2 f/(∂x1 ∂x2)

的有限差分近似的低阶误差
(f(x1+dx1, x2+dx2) - f(x1+dx1, x2) - f(x1, x2+dx2) + f(x1, x2))/(dx1*dx2)

并收集高达二阶的项(涉及 f 的四阶导数)。如果没有合理有效的简化,我怀疑手工完成比计算机代数更容易,所以我想知道可以做些什么来哄 maxima 为我做简化。

考虑这个例子。它使用 Barton Willis 的 pdiff 包。我 稍微简化了符号:将中心移至 [0, 0] 并引入 偏导数的符号。

(%i1) load("pdiff") $
(%i2) matchdeclare([n, m], integerp) $
(%i3) tellsimpafter(f(0, 0), 'f00) $
(%i4) tellsimpafter(pderivop(f,n,m)(0,0), concat('f, n, m)) $
(%i5) e: (f(dx, dy) - f(dx, -dy) - f(-dx, dy) + f(-dx, -dy))/(4*dx*dy)$
(%i6) taylor(e, [dx, dy], [0, 0], 3);
                                    2         2
                              f31 dx  + f13 dy
(%o6)/T/                f11 + ----------------- + . . .
                                      6