Немного устаревший, но см.
http://library.wolfram.com/infocenter/Conferences/325/
Раздел «Некоторые некоммутативные алгебраические манипуляции» дает несколько способов сделать это.Первый пример, определяющий функцию дифференцируемой операции, вероятно, лучше всего подходит для ваших целей.
--- edit, reedited ---
Вот код, который я использую.Вероятно, (все еще) не хватает нескольких уточнений.Это взято из пары примеров в упомянутой выше записной книжке.
Я определю и использую вспомогательный предикат, scalarQ.Это дает гибкость объявления объектов, отличных от явных числовых значений, скалярными.
Я определяю некоммутативное умножение, называемое ncTimes.В идеале я бы просто использовал NonCommulativeMultiply, но я не смог заставить сопоставление с образцом вести себя так, как я хотел, относительно нулевой формы или формы с одним аргументом, или извлекать скаляры.(Менее техническое объяснение: это моё было более мощным, чем у меня.)
scalarQ [a_? NumericQ]: = True scalarQ [_]: = False
ncTimes []: = 1 ncTimes [a_]: = a ncTimes [a_ , ncTimes [b_, c ], d_ ]: = ncTimes [a, b, c, d] ncTimes [a_ , x_ + y_,b_ ]: = ncTimes [a, x, b] + ncTimes [a, y, b] ncTimes [a_ , i_? scalarQ * c_, b_ ]: = i * ncTimes [a,c, b] ncTimes [a_ , i_? scalarQ, b___]: = i * ncTimes [a, b]
diffOperate [a_, expr_] /;FreeQ [a, D]: = a * expr дифференциалOperate [L1_ + L2_, expr_]: = дифференциалOperate [L1, expr] + дифференциалOperate [L2, expr] дифференциалOperate [a_ * L_, expr_] /;FreeQ [a, D]: = a * absoluteOperate [L, expr] дифференциалOperate [a: HoldPattern [D [] &], expr_]: = a [expr] дифференциалOperate [ncTimes [L1 , L2_], expr_]: = Expand [diffOperate [L1, diffOperate [L2, expr]]] diffOperate [L1_ ^ n_Integer, expr_] /;n> 1: = Nest [Expand [diffOperate [L1, #]] &, expr, n]
В [15]: = ddvar [x_, n_: 1]: = D [#, {x, n}] &
Вот несколько примеров из постов и комментариев.
В [17]: = diffop = ncTimes [(1 + ddvar [x] + ncTimes [x, ddvar [y, 2]]) ^ 2, (1 + ncTimes [y, ddvar [y]])) ^ 2]
Out [17] = ncTimes [(1 + (D [# 1], {x, 1}] &) + ncTimes [x, D [# 1, {y, 2}] &]) ^ 2, (1 + ncTimes [y, D [# 1, {y, 1}]] &]) ^ 2]
Примените этот оператор к f [x, y].
В [25]: = дифференциальныйOperate [diffop, f [x, y]]
Out [25] = f [x, y] + 3 * y * Производная [0, 1] [f] [x, y] + 9 * Производная [0, 2] [f] [x, y] + 18* x * Производное [0, 2] [f] [x, y] + y ^ 2 * Производное [0, 2] [f] [x, y] + 7 * y * Производное [0, 3] [f][x, y] + 14 * x * y * Производная [0, 3] [f] [x, y] + 25 * x ^ 2 * Производная [0, 4] [f] [x, y] + y ^2 * Производное [0, 4] [f] [x, y] + 2 * x * y ^ 2 * Производное [0, 4] [f] [x, y] + 11 * x ^ 2 * y * Производное [0, 5] [f] [x, y] + x ^ 2 * y ^ 2 * Производное [0, 6] [f] [x, y] + 2 * Производное [1, 0] [f] [x,y] + 6 * y * Производная [1, 1] [f] [x, y] + 18 * x * Derivative [1, 2] [f] [x, y] + 2 * y ^ 2 * Производное [1, 2] [f] [x, y] + 14 * x * y * Производное [1, 3] [f] [x, y] + 2 * x * y ^ 2 * Производное [1, 4] [f] [x, y] + Производное [2, 0] [f] [x, y] + 3 * y * Производное[2, 1] [f] [x, y] + y ^ 2 * Производная [2, 2] [f] [x, y]
Эти крайние случаи.
В [26]: = diffOperate [ncTimes [1, 1], f [t]]
Out [26] = f [t]
Мы можем объявить символ скалярным.
В [28]: = scalarQ [a] ^ = True;
Теперь он будет извлечен как простой множитель.
В [29]: = diffOrante [ncTimes[a, b], f [t]]
Out [29] = abf [t]
--- конец редактирования ---
Daniel Lichtblau Wolfram Research