方向导数求导替换
mathematica吧
全部回复
仅看楼主
level 3
woooooooodin 楼主
mathematica中我希望定义一个抽象的方向导数求导,这个方向设为v,我不在乎v的坐标。输入d[v, f]得到微分Dt[f]展开式中关于自变量的微分比如Dt[x]能自动替换为d[v, x],比如说d[v, Sin[x y]]=Cos[x y](x d[v, y]+y d[v, x]).然后有一些替换规则把里面得到的d[p, P]替换为其他的不含d[]的表达式。怎么弄?
2025年08月14日 05点08分 1
level 7
可以把x y都写成t的函数,这样D[Sin[x[t] y[t]], t]就能得到Cos[x[t] y[t]] (y[t] x'[t]+x[t] y'[t]),和你最终想要的效果是类似的
2025年08月14日 06点08分 2
我知道Dt求微分就是类似的结果,但是我还是希望有个打包的程序。这个求导还依赖于一个量v。
2025年08月14日 06点08分
吧务
level 15
……在我看来你这个问题最简单的做法就是直接用Dt,反正运算规则都一样,你只要记住“在这个表达式里,Dt代表方向导数”就行了。如果确实有相关需求(比如改进可读性,或是需要在不同式子里区分不同的方向导数v之类的),那就换一换:
(* 需要用一点非初级的模式匹配 *)
Clear[dd];
dd[v_, expr : Except[_?AtomQ]] :=
Dt@expr /. HoldPattern[Dt@a_] :> dd[v, a]
dd[v, Sin[x y]]
(* Cos[x y] (y dd[v, x] + x dd[v, y]) *)
或者也可以用
ResourceFunction["DirectionalD"][Sin[x y], {d[v, x], d[v, y]}, {x, y}]
(* y Cos[x y] d[v, x] + x Cos[x y] d[v, y] *)
2025年08月18日 06点08分 3
大佬没看懂为什么你这里要用这个HoldPattern。dd[v_, expr : Except[_?AtomQ]] := Dt@expr /. HoldPattern[Dt@a_] :> dd[v, a] 我就这个没有加,弄不出来
2025年11月04日 00点11分
@woooooooodin RuleDelayed的第一个参数(也就是 :> 的左端)是会自动计算的,你单独执行下 1 + 1 :> aaa 观察一下输出。
2025年11月04日 00点11分
@xzcyr Dt[a]这个形式会自动计算吗?
2025年11月04日 02点11分
@woooooooodin ……你观察一下 FullForm[ a_ ] 的输出。
2025年11月04日 02点11分
1