Шаблоны сопоставляются синтаксически, а не семантически.Для встроенных функций, если вы переопределяете их, и если ваши шаблоны не совпадают, используются встроенные правила (определения).Чтобы увидеть, будет ли шаблон соответствовать или почему он не соответствует, FullForm
часто бывает полезным.Таким образом, мы видим:
In[26]:= FullForm[HoldForm[D[f[Sin[x]]+1,x]]]
Out[26]//FullForm= HoldForm[D[Plus[f[Sin[x]],1],x]]
Ваше определение действует только тогда, когда у вас есть f [ _ ] внутри D
, тогда как здесь у вас есть 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
, таким способом является плохой практикой, и ее следует избегать.Во-первых, вышеприведенное решение, вероятно, также не является надежным, и вы можете добавить еще много правил, чтобы оно работало во всех случаях.Кроме того, как правило, лучше избегать переопределения встроенных функций, если вы можете (одна из причин заключается в том, что это может привести к некоторым очень тонким ошибкам, поскольку некоторые другие системные функции могут использовать ту, которую вы переопределили, и у вас нет контролянад ним).Вместо этого я бы реализовал свою собственную функцию дифференциации.Это не интеграция, это относительно просто сделать, и вы не подвергаете опасности функционирование любой другой системы.