目前,没有直接的方法可以满足您的要求。
我将建议一个应该有效的技巧,通过使用索引库(即由其他符号索引的符号),然后进行替换。
声明你的符号:
U = IndexedBase("U")
l = symbols("lambda")
var("mu u v w x y z i j k")
声明你的表达式(没有爱因斯坦求和,所以明确地放置一个Sum):
sij = l*Sum(U[k, k], (k, 0, 2)) * KroneckerDelta(i, j) + mu*(U[i, j] + U[j, i])
定义替换函数:将匹配U[0, 0] to 导数(u, x)依此类推,根据索引:
def replace_U(uij):
i1, i2 = uij.indices
return Derivative([u, v, w][i1], [x, y, z][i2])
现在,跑遍所有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))
记住:Sum.doit()展开求和。健康)状况ii >= ji用于避免打印相同的表达式两次(你的方程是对称的i, j).
注意U[i, j]上面的代码中只是一个符号,i and j除了作为索引之外没有特殊含义U。替换函数为它们分配导数。
我得到的输出是:
⎛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
我是 python 和 Sympy 的新手,我看到有一个张量模块
但我看不到 Sympy 中是否已经实现了某些功能
我可以在其中写出第一个方程(带索引)并从中获得
其他六种关系。
有sympy.张量.张量,它支持抽象索引符号(一种受限的爱因斯坦求和)。不幸的是,它不支持衍生品。
如果您想使用组件,最近添加了以下内容:sympy.张量.array。它提供多维数组、张量积和收缩以及数组的导数。