gpt4 book ai didi

wolfram-mathematica - 如何在 Mathematica 中定义与 D 交换的函数

转载 作者:行者123 更新时间:2023-12-04 08:16:54 25 4
gpt4 key购买 nike

我想实现一个运算符 f,它与微分 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}]];

如果更有经验的人可以看一下代码并告诉我这种方法是否合适,我将不胜感激。

最佳答案

模式在句法上匹配,而不是在语义上匹配。对于内置函数,如果您重新定义它们,并且您的模式不匹配,则使用内置规则(定义)。要查看模式是否匹配或不匹配的原因,FullForm 通常很有用。这样,我们看到:

In[26]:= FullForm[HoldForm[D[f[Sin[x]]+1,x]]]
Out[26]//FullForm= HoldForm[D[Plus[f[Sin[x]],1],x]]

只有当 D 中有 f[_] 时,你的定义才有效,而这里你有 D[Plus[f[..],1 ],x]。因此,您的定义不匹配,然后使用内置。这是扩展它以涵盖这种情况的一种方法:

Unprotect[D];
D[f[y___], x_] := f[D[y, x]];
D[HoldPattern[Plus[left___, a_f, right___]], x_] :=
D[Plus[left], x] + D[a, x] + D[Plus[right], x];
Protect[D];

现在它将按预期工作。但是请注意,IMO 以这种方式重新定义 D 等内置函数是一种糟糕的做法,应该避免。一方面,上述解决方案可能也不稳健,您可能会发现自己添加了更多规则以使其适用于所有情况。另外,一般来说,如果可以的话,最好避免重新定义内置函数(一个原因是这样做可能会导致一些非常微妙的错误,因为其他一些系统函数可能会使用您重新定义的函数,而您无法控制超过它)。相反,我会实现自己的微分功能。这不是集成,它相对简单,您不会将任何其他系统的功能置于危险之中。

关于wolfram-mathematica - 如何在 Mathematica 中定义与 D 交换的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5430229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com