Упрощение выражений с участием абстрактных производных в максимумах - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь заставить maxima выполнить некоторые "абстрактные" расширения серии Тейлора, и я столкнулся с проблемой упрощения.Прототипом проблемы может быть конечно-разностный аналог градиента

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

, для которого maxima возвращает

enter image description here

Пока все хорошо.Но теперь попробуйте конечно-разностный аналог второй производной (гессиана)

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

, для которого я получаю

enter image description here

что не так полезно.

Прототип "реальной" проблемы, которую я хочу решить, состоит в том, чтобы вычислить ошибки низкого порядка в приближении конечных разностей до ∂^2 f/(∂x1 ∂x2),

(f(x1+dx1, x2+dx2) - f(x1+dx1, x2) - f(x1, x2+dx2) + f(x1, x2))/(dx1*dx2)

и собрать условия до второго порядка (который включает до 4-х производных от f).Я подозреваю, что без достаточно эффективного упрощения это будет легче сделать вручную, чем компьютерной алгеброй, поэтому мне интересно, что можно сделать, чтобы убедить maxima сделать для меня упрощение.

1 Ответ

0 голосов
/ 20 июня 2018

Рассмотрим этот пример.Он использует пакет 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
...