sympy - 有没有一种方法可以对抽象变量进行微分?

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 中是否可能实现这一点?
对于缺少方程呈现的问题,请见谅。
1个回答

4
你可以使用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]  

哇,谢谢!我现在已经读了一些关于它的内容,原来我也可以使用符号索引!有一个问题:是否有一种方法可以通过 delta 函数将这个表达式简化为只有一个 delta 函数?这样,就不是 \delta_{1,2}... + \delta{1,3}... + \delta{2,3} 这样的形式了。 - Bbllaaddee
我的意思是,我需要对它进行至少四次区分,才能获得高达4阶的张量矩阵元素。我希望所有非重复符号指数的delta都消失。 - Bbllaaddee
1
我不明白你的意思。我建议你提出一个新问题。 - Oscar Benjamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接