sympy - 有没有办法区分抽象变量?
sympy - is there a way to differentiate over an abstract variable?
我现在正在学习 SymPy,我想知道是否有一种方法可以以一般形式区分一个函数与其变量之一。
考虑这个例子:
有一个向量,让我们将其组成部分写为x_1、x_2、x_3。
这种向量的长度 r 将是 r = sqrt(x_1^2 + x_2^2 + x_3^2).
我想在 x_i 上区分此向量,其中我没有指定 i,它应该给出类似 x_i/r^3.
的内容
是否可以在 SymPy 中执行此操作?
抱歉缺少方程式渲染..
您可以使用 IndexedBase
执行此操作。结果出现在 Kronecker delta 函数中,比替换后简化:
In [3]: x = IndexedBase('x')
In [4]: r = sqrt(x[1]**2 + x[2]**2 + x[3]**2)
In [5]: r
Out[5]:
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]
In [6]: i = Symbol('i')
In [7]: r.diff(x[i])
Out[7]:
δ ⋅x[1] + δ ⋅x[2] + δ ⋅x[3]
1,i 2,i 3,i
─────────────────────────────────
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]
In [8]: r.diff(x[i]).subs(i, 2)
Out[8]:
x[2]
──────────────────────────
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]
您也可以对符号维度的向量执行此操作:
In [9]: j = Symbol('j')
In [9]: N = Symbol('N')
In [10]: r = sqrt(Sum(x[i]**2, (i, 1, N)))
In [10]: r
Out[10]:
_____________
╱ N
╱ ___
╱ ╲
╱ ╲ 2
╱ ╱ x[i]
╱ ╱
╱ ‾‾‾
╲╱ i = 1
In [11]: r.diff(x[j])
Out[11]:
N
___
╲
╲ 2⋅δ ⋅x[i]
╱ i,j
╱
‾‾‾
i = 1
────────────────────────
_____________
╱ N
╱ ___
╱ ╲
╱ ╲ 2
2⋅ ╱ ╱ x[i]
╱ ╱
╱ ‾‾‾
╲╱ i = 1
In [12]: r.diff(x[j]).subs(N, 3).subs(j, 2)
Out[12]:
3
___
╲
╲ 2⋅δ ⋅x[i]
╱ 2,i
╱
‾‾‾
i = 1
────────────────────────
_____________
╱ 3
╱ ___
╱ ╲
╱ ╲ 2
2⋅ ╱ ╱ x[i]
╱ ╱
╱ ‾‾‾
╲╱ i = 1
In [13]: r.diff(x[j]).subs(N, 3).subs(j, 2).doit()
Out[13]:
x[2]
──────────────────────────
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]
我现在正在学习 SymPy,我想知道是否有一种方法可以以一般形式区分一个函数与其变量之一。
考虑这个例子:
有一个向量,让我们将其组成部分写为x_1、x_2、x_3。 这种向量的长度 r 将是 r = sqrt(x_1^2 + x_2^2 + x_3^2).
我想在 x_i 上区分此向量,其中我没有指定 i,它应该给出类似 x_i/r^3.
的内容是否可以在 SymPy 中执行此操作?
抱歉缺少方程式渲染..
您可以使用 IndexedBase
执行此操作。结果出现在 Kronecker delta 函数中,比替换后简化:
In [3]: x = IndexedBase('x')
In [4]: r = sqrt(x[1]**2 + x[2]**2 + x[3]**2)
In [5]: r
Out[5]:
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]
In [6]: i = Symbol('i')
In [7]: r.diff(x[i])
Out[7]:
δ ⋅x[1] + δ ⋅x[2] + δ ⋅x[3]
1,i 2,i 3,i
─────────────────────────────────
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]
In [8]: r.diff(x[i]).subs(i, 2)
Out[8]:
x[2]
──────────────────────────
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]
您也可以对符号维度的向量执行此操作:
In [9]: j = Symbol('j')
In [9]: N = Symbol('N')
In [10]: r = sqrt(Sum(x[i]**2, (i, 1, N)))
In [10]: r
Out[10]:
_____________
╱ N
╱ ___
╱ ╲
╱ ╲ 2
╱ ╱ x[i]
╱ ╱
╱ ‾‾‾
╲╱ i = 1
In [11]: r.diff(x[j])
Out[11]:
N
___
╲
╲ 2⋅δ ⋅x[i]
╱ i,j
╱
‾‾‾
i = 1
────────────────────────
_____________
╱ N
╱ ___
╱ ╲
╱ ╲ 2
2⋅ ╱ ╱ x[i]
╱ ╱
╱ ‾‾‾
╲╱ i = 1
In [12]: r.diff(x[j]).subs(N, 3).subs(j, 2)
Out[12]:
3
___
╲
╲ 2⋅δ ⋅x[i]
╱ 2,i
╱
‾‾‾
i = 1
────────────────────────
_____________
╱ 3
╱ ___
╱ ╲
╱ ╲ 2
2⋅ ╱ ╱ x[i]
╱ ╱
╱ ‾‾‾
╲╱ i = 1
In [13]: r.diff(x[j]).subs(N, 3).subs(j, 2).doit()
Out[13]:
x[2]
──────────────────────────
_______________________
╱ 2 2 2
╲╱ x[1] + x[2] + x[3]