请教微分算子的问题
mathematica吧
全部回复
仅看楼主
level 2
慌衍 楼主
代码是为了定义微分算符
d /: d[x_]*w_ := D[w, x]<br>
(*可以实现手写运算时的微分算子∂x*w=D[w, x]*)
运算过程中采用Defer或者Inactive函数来推迟运算,直至矩阵计算后得到最终结果,例如:
Defer[d[z]/r]*y[r,z]此时希望重载运算符为Defer[x_]*y_=Defer[x*y],符合平常推导的思路:∂x*(1/r)*y=∂x*(y/r)
具体代码如下:
d /: d[x_]*(w_) := D[w, x];
A = {{d[r], 0}, {0,
Defer[(1/r)*d[\[Theta]]]}} . {{ur[r, \[Theta], z]}, {uz[
r, \[Theta], z]}} // InputForm
结果为:
{{Derivative[1, 0, 0][ur][r, \[Theta], z]}, {Defer[(1/r)*d[\[Theta]]]*uz[r, \[Theta], z]}}
我希望得到Defer[x_]*y_=Defer[x*y]即Defer[(1/r)*d[\[Theta]]]*uz[r, \[Theta], z]->Defer[(1/r)*d[\[Theta]]*uz[r, \[Theta], z]]
2020年10月31日 02点10分 1
吧务
level 10
可以在你的代码基础上增加一条定义来解决问题,但我不推荐这样做。
处理手写数学公式中惯用的算符“乘法”与数值乘法Times的含义差别是一个很经典的问题,你可以参考我写过的一段代码,待会上传好了就发到楼下。
简单地说,我建议:
1. 不通过修改Times表达式的计算方式去实现,否则你时时刻刻都要通过Defer这样的封装去遏制它的Orderless属性。
2. 对复合(算符*算符)、作用(算符*表达式)、乘积复合(表达式*算符)乃至更复杂的向量算符(如 向量点乘向量算符)的各种支持分别下定义去实现(具体可参考我的代码)
3. 如果要用 Defer ,不要修改Defer的定义,而是自己定义一个封装然后给一个HoldAll属性,然后定义Format[yourDefer[expr_], StandardForm]:=Format[expr_, StandardForm](不过我习惯使用MakeBoxes了,作用一样)
2020年10月31日 04点10分 2
感谢,我其实找到了一定的解决办法,图在下楼。对于张量运算中的微分算符我一直找不到比较好的处理方式,我其实想借用矩阵较为直观地表示,答主的方法我也去学习一下,感谢
2020年10月31日 04点10分
level 2
慌衍 楼主
改成这样勉强符合微分算子的逻辑了。。
2020年10月31日 04点10分 3
吧务
level 10
2020年10月31日 04点10分 4
吧主顶上来的18年的贴子里的链接里有外国人写过一个,不过你要想自己学习其中的原理的话,还是看我发这个比较好
2020年10月31日 04点10分
@asdasd1dsadsa 那帖子也不涉及向量算符的定义,不过我记得MSE上也有相关讨论。
2020年10月31日 05点10分
nabla算子的话还可以看这帖(这是笛卡尔系的,换成别的系大同小异):mathematica.stackexchange.com/q/73143/1871
2020年11月06日 16点11分
@xzcyr 对,我说的“相关讨论”就是这贴
2020年11月07日 03点11分
吧务
level 15
还是链一下,以免有人找不到:
tieba.baidu.com/p/3192937406
2020年11月06日 16点11分 5
1