我试图让maxima
执行一些"抽象"泰勒系列扩展,我遇到了简化问题。问题的原型可能是梯度的有限差分模拟,
g(x1,dx1) := (f(x1+dx1) - f(x1))/dx1; /* dx1 is small */
taylor(g(x1,dx1), [dx1], [0], 0);
maxima
返回
到目前为止一切顺利。但现在尝试二阶导数的有限差分模拟(Hessian),
h(x1,dx1) := (f(x1+dx1) - 2*f(x1) + f(x1-dx1))/dx1^2;
taylor(h(x1,dx1), dx1, 0, 0);
我得到了
这几乎没有帮助。
"真实"的原型我想解决的问题是计算有限差近似的低阶误差∂^2 f/(∂x1 ∂x2)
,
(f(x1+dx1, x2+dx2) - f(x1+dx1, x2) - f(x1, x2+dx2) + f(x1, x2))/(dx1*dx2)
并收集最多二阶的条款(最多涉及f
的四个衍生物)。如果没有合理有效的简化,我怀疑手工操作比计算机代数更容易,所以我想知道如何哄骗maxima
为我做简化。
答案 0 :(得分:1)
请考虑以下示例。它使用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