1

我想教数学,由 Subscript[w, j] 区分的 Subscript[w, i] 是 KroneckerDelta[i, j]。

我试过

Unprotect[D]; D[Subscript[x_, i_], Subscript[x_, j_]] := 
                                            KroneckerDelta[i, j]; Protect[D]

这适用于 D[Subscript[w, i], Subscript[w, j]],但不适用于更复杂的表达式,例如 D[Times[k, Subscript[w, i]], Subscript[w, j]]

我从这个问题的答案中了解到:如何在 Mathematica中定义与 D 通勤的函数,mathematica 不符合我的规则,但我不明白为什么。为什么 Mathematica 不使用乘积规则,然后调用我的规则?

4

3 回答 3

1

我想我现在明白发生了什么。

Mathematica 没有使用链式法则递归地定义 D 算子,大概是因为这太慢了。它对子表达式进行一些模式匹配,以查看它们是否包含微分变量,以及不被视为常量的子表达式;所以我的 D 模式永远不会被应用。

解决这个问题的方法是明确告诉 Mathematica

Subscript[w, i]

不是一个常数。

我的模式现在看起来像这样

Unprotect[D]; 
D[Subscript[x_, i_], Subscript[x_, j_], 
    NonConstants -> {___, Subscript[x_, i_], ___} ] := KroneckerDelta[i, j]; 
Protect[D]   

我必须以这种方式应用它:

D[k * Subscript[w, i], Subscript[w, j], NonConstants -> Subscript[w, i]]
于 2013-09-23T00:50:43.607 回答
0

Mathematica 没有“数学成熟度”,这意味着它不是一个称职的研究生,可以查看您的请求,弄清楚您的实际意思并给您应该得到的东西。特别是,模式匹配是“结构性的”,这意味着它只是字面上与规则所说的结构完全匹配。这意味着它没有意识到您可能意味着 k 是一个常数,因此了解常数乘以函数的导数应该是常数乘以导数。

您可以添加越来越多的规则来尝试模拟数学成熟度,但许多典型用户并不具备完全正确编写所有所需规则所需的全部技能。您可以包括:

Unprotect[D];
D[Times[k_, Subscript[w_, i_]], Subscript[x_, j_]] := k*KroneckerDelta[i, j];
Protect[D];
D[Times[k, Subscript[w, i]], Subscript[x_, j_]]

但这是假设 k 没有 Subscript[w, i]] 并且您可能希望通过确保这一点的条件来增强该规则。这仍然不能处理 k+KroneckerDelta[i, j] 或 k*KroneckerDelta[i, j]+m 等。

于 2013-09-22T17:27:09.837 回答
0

首先,在Mathematica中添加Unprotect符号通常是个坏主意。除了比尔给出的原因之外,这还强制检查您提供的参数是否与您的模式不匹配,然后才能正常工作。这可能会减慢系统速度。DownValuesD

您通常可以使用UpValues(via UpSetDelayed) 而不是DownValues. 这不需要 you Unprotect,它会导致您的规则仅在它们适用时触发。

但是,在这种情况下,我认为您只需要一个自定义差异化器D

myD[f_, Subscript[x_, i_]] := 
  With[{vars = DeleteDuplicates[Cases[f, Subscript[x, _], {0, Infinity}]]}, 
    Sum[D[f, v]*KroneckerDelta[i, v[[2]]], {v, vars}]
  ]

(如果我没有遗漏一些重要的东西。)

于 2013-09-22T22:04:14.423 回答