我不明白同情的indexed objects
是什么。文档并没有帮助我理解这个概念。
例如:
>>> from sympy import symbols, IndexedBase, Idx
>>> M = IndexedBase('M')
>>> i, j = symbols('i j', cls=Idx)
>>> M[i, j]
M[i, j]
这段代码有什么作用?什么是M[i,j]
?
我理解的是,indexed object
为个人同情symbols
提供了索引。
我正在寻找indexed objects
的更好解释,以及它与IndexedBase
和idx
答案 0 :(得分:6)
单行解释:它们代表一个未确定的,可能是无限大小的符号数组。
假设你想使用n个符号,你会怎么做?如果n是给定数字,就像10一样容易。但它只是n,一个未指定的整数。类似的公式一直出现在数学中:"在索引i = 1,...,n"上添加或乘以(某物)。
例如,假设我在n维空间R n 中具有函数,例如f(x)= 1 /距离(x,0)。当然,距离是坐标平方和的平方根。也许我想找到f的一些偏导数。如何在SymPy中表达所有这些?像这样:
from sympy import *
x = IndexedBase('x')
j, k, n = symbols('j k n', cls=Idx)
f = 1/sqrt(Sum(x[k]**2, (k, 1, n)))
print(f.diff(x[j]))
这计算f相对于坐标x[j]
的导数。答案是
-Sum(2*KroneckerDelta(j, k)*x[k], (k, 1, n))/(2*Sum(x[k]**2, (k, 1, n))**(3/2))
这是正确的(尽管如果我们假设j在1..n范围内,也许可以简化分子。)
在上面的例子中,x[j]
是索引j的坐标。在您的示例中,M[i, j]
可以是位置i,j的某个矩阵的条目。
以上是您自己实例化的类。 M [i,j]的类是索引的,但是你不能通过使用类名来创建这些对象,M[i, j]
只是这样做。
最近的两个问题,包括使用索引对象的示例:
答案 1 :(得分:2)
索引主要用于两个用例:
带有符号下标的公式。例如,\sum_{i=1}^n a_i
。您可以使用Symbol('a_i')
,但i
不是符号,并且与Symbol('i')
有任何关联。例如,Sum(a_i, (i, 1, n))
只会给你n*a_i
。相反,IndexedBase('a')[i]
代表i
的每个值的不同符号,Sum(IndexedBase('a')[i], (i, 1, n))
有效地代表上述总和。
N-d阵列。这对于代码生成特别有用,因为用于C或Fortran等语言的SymPy代码打印机会自动将索引对象打印为数组查找,例如
>>> a = IndexedBase('a')
>>> i = Idx('i', (1, n))
>>> ccode(a[i])
'a[i]'
>>> fcode(a[i])
' a(i)'
这使得使用SymPy以符号方式编写基于数组的代码变得非常容易,并生成计算它的快速代码。