使用sympy展开索引表示法

rap*_*lts 4 python sympy

下面我有一个使用索引表示法编写的等式.该等式可以用图中的六个等式表示.

使用索引表示法的等式

使用索引符号(爱因斯坦符号:https://en.wikipedia.org/wiki/Einstein_notation)扩展第一个等式.在U_k中,k逗号是导数的约定.由于我们有重复索引(k,k),我们应用求和约定并得到(du_1/dx_1 + du_2/dx_2 + du_3/dx_3).在图中,术语u_1,u_2和u_3被写为u,v和w,它们由x_1,x_2和x_3(x,y和z)区分.

我是python和Sympy的新手,我看到有一个张量模块,但我看不出Sympy中是否已经实现了我可以编写第一个等式(带索引)的内容,并从中获得其他六个关系.

Fra*_*zzi 5

目前,没有直接的方法来做你所要求的.

我将通过使用IndexedBase(即,由其他符号索引的符号),然后替换,建议应该有效的技巧.

声明你的符号:

U = IndexedBase("U")
l = symbols("lambda")
var("mu u v w x y z i j k")
Run Code Online (Sandbox Code Playgroud)

声明你的表达式(没有爱因斯坦求和,所以明确地加上一个):

sij = l*Sum(U[k, k], (k, 0, 2)) * KroneckerDelta(i, j) + mu*(U[i, j] + U[j, i])
Run Code Online (Sandbox Code Playgroud)

定义替换函数:将U [0,0]Derivative(u,x)匹配,依此类推:

def replace_U(uij):
    i1, i2 = uij.indices
    return Derivative([u, v, w][i1], [x, y, z][i2])
Run Code Online (Sandbox Code Playgroud)

现在,运行所有i,j索引首先用整数值替换U [i,j],然后替换U [0,0]等表达式......

for ii in range(3):
    for ji in range(3):
        if ii < ji:
            continue
        pprint(sij.doit().xreplace({i: ii, j: ji}).replace(lambda v: v.base == U, replace_U))
Run Code Online (Sandbox Code Playgroud)

记住:Sum.doit()扩展求和.条件ii> = ji用于避免两次打印相同的表达式(您的等式在i,j中是对称的).

注意,上面代码中的U [i,j]只是一个符号,除了作为U的索引之外,ij没有特殊含义.替换函数为它们分配衍生物.

我得到的输出是:

  ?d       d       d    ?       d    
?????(u) + ??(v) + ??(w)? + 2?????(u)
  ?dx      dy      dz   ?       dx   
  ?d       d    ?
?????(u) + ??(v)?
  ?dy      dx   ?
  ?d       d       d    ?       d    
?????(u) + ??(v) + ??(w)? + 2?????(v)
  ?dx      dy      dz   ?       dy   
  ?d       d    ?
?????(u) + ??(w)?
  ?dz      dx   ?
  ?d       d    ?
?????(v) + ??(w)?
  ?dz      dy   ?
  ?d       d       d    ?       d    
?????(u) + ??(v) + ??(w)? + 2?????(w)
  ?dx      dy      dz   ?       dz   
Run Code Online (Sandbox Code Playgroud)

我是python和Sympy的新手,我看到有一个张量模块,但我看不出Sympy中是否已经实现了我可以编写第一个等式(带索引)的内容,并从中获得其他六个关系.

sympy.tensor.tensor,它支持抽象索引表示法(一种受限制的爱因斯坦求和).不幸的是,它不支持衍生品.

如果你想处理组件,最近有一个补充:sympy.tensor.array.它提供多维数组,张量积和收缩,以及数组导数.