如何扩展mathematica中微分算子的算法

时间:2011-02-11 21:27:33

标签: wolfram-mathematica

例如,我希望mma扩展以下差分运算符

(1+d/dx+x*d2/dy2)^2*(1+y*d/dy)^2

我发现Nest不够好做这类事情。

1 个答案:

答案 0 :(得分:2)

有点过时,但请参阅

http://library.wolfram.com/infocenter/Conferences/325/

“一些非交换代数操作”一节给出了一些方法。 第一个示例,定义一个名为differentialOperate的函数,可能最适合您的目的。

---编辑,reedited ---

这是我使用的代码。可能它(仍然)缺少一些改进。它取自上述笔记本中的几个例子。

我将定义并使用辅助谓词scalarQ。这使得将显式数值以外的实体声明为标量的灵活性。

我定义了一个非交换乘法,称为ncTimes。理想情况下,我只会使用NonCommutativeMultiply,但我无法使模式匹配以零或一个参数形式或拉出标量的方式表现。 (技术解释较少:它的魔力比我的强大。)

标量Q [a_?NumericQ]:=真 标量Q [_]:=假

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]

differentialOperate [a_,expr_] /; FreeQ [a,D]:= a * expr differentialOperate [L1_ + L2_,expr_]:=  differentialOperate [L1,expr] + differentialOperate [L2,expr] differentialOperate [a_ * L_,expr_] /; FreeQ [a,D]:=  a * differentialOperate [L,expr] differentialOperate [a:HoldPattern [D []&],expr_]:= a [expr] differentialOperate [ncTimes [L1 ,L2_],expr_]:=  展开[differentialOperate [L1,differentialOperate [L2,expr]]] differentialOperate [L1_ ^ n_Integer,expr_] /; n> 1:=  嵌套[展开[differentialOperate [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]

输出[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]中:= differentialOperate [diffop,f [x,y]]

输出[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 *导数[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]中:= differentialOperate [ncTimes [1,1],f [t]]

Out [26] = f [t]

我们可以声明符号为标量。

在[28]中:= scalarQ [a] ^ = True;

现在它将被拉出作为一个简单的乘数。

在[29]中:= differentialOperate [ncTimes [a,b],f [t]]

输出[29] = a b f [t]

---结束编辑---

Daniel Lichtblau Wolfram Research