下面我有一个使用索引表示法编写的等式.该等式可以用图中的六个等式表示.
使用索引符号(爱因斯坦符号: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中是否已经实现了我可以编写第一个等式(带索引)的内容,并从中获得其他六个关系.
目前,没有直接的方法来做你所要求的.
我将通过使用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的索引之外,i和j没有特殊含义.替换函数为它们分配衍生物.
我得到的输出是:
?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.它提供多维数组,张量积和收缩,以及数组导数.
| 归档时间: |
|
| 查看次数: |
845 次 |
| 最近记录: |