我想實現一個運算符f
,這個運算符可以區分D
。如何定義在Mathematica中通過D的函數
Unprotect[D];
D[f[y___], x] := f[D[y, x]];
Protect[D];
D[f[Sin[x]], x]
D[f[Sin[x]] + 1, x]
不幸的是這個代碼產生兩個不同的結果
f[Cos[x]] (* as expected *)
Cos[x] f´[Sin[x]] (* cannot explain *)
我想知道,這是怎麼回事,以及如何解決的替換規則,使得第二表達式求f[Cos[x]]
爲好。
更新。解決方案1 以下解決方案似乎可以完成重新定義D
運算符的工作(儘管我無法完全理解我自己的代碼)。
PartialDerivative[x_, x_] := 1;
PartialDerivative[c_, x_] := 0 /; FreeQ[c, x];
PartialDerivative[f_ConditionalExpectation, x_] :=
ConditionalExpectation[PartialDerivative[f, x]];
PartialDerivative[(f_)[g__], x_] := Module[{i, n, p},
n = Length[SequenceHold[g]];
Sum[
p = ConstantArray[0, n]; p[[i]] = 1;
((Derivative[##1][f] &) @@ p)[g]*
PartialDerivative[SequenceHold[g][[i]], x], {i, 1, n}]];
如果有更有經驗的人可以看看代碼並告訴我這種方法是否正確,我將不勝感激。