sympy - 对抽象组件的区分

sympy - differentiation over an abstract component

我正在 sympy 中进行区分,多亏了 我快完成了,但还不完全。

我有以下变体代码:

  1. 来自回答
x = IndexedBase('x')
alpha, beta, gamma = symbols('alpha beta gamma', integer=True)
r = sqrt(x[alpha]**2 + x[beta]**2 + x[gamma]**2)
T0 = 1/r
i,j,k,l = symbols('i j k l')
T1 = diff(T0, x[i])
T1.subs(sqrt(x[alpha]**2 + x[beta]**2 + x[gamma]**2), 'r')
  1. 使用矢量 class
V = CoordSys3D('V')
v = x[alpha]*R.i + x[beta]*R.j + x[gamma]*R.k
r = v.magnitude()
T0 = 1/r
T1 = diff(T0, x[i])
T1.subs(sqrt(x[alpha]**2 + x[beta]**2 + x[gamma]**2), 'r')

两人都给出了以下答案:

然而,这有很多不需要的delta函数,它们在微分到高阶后只会增加数量。

这里,alpha beta gamma 只是向量的笛卡尔分量,r 是它的长度。 当然,知道那些 delta 函数永远不可能同时为 1,我想实现这个结果:,其中 i 是 some 个笛卡尔分量。

这可能吗?

谢谢!

成功做到了!

这是代码示例:

x = IndexedBase('x')
alpha, beta, gamma, delta = symbols('alpha beta gamma delta', cls=Idx, range=3)
i = Idx('i', 3)
x_i = x[i]
r = sqrt(Sum(x_i**2, i))
T0 = 1/r
T1 = diff(T0, x[alpha])
T1.simplify().subs(sqrt(Sum(x_i**2, i).doit()), 'r')

输出: -x[alpha]/r**3