什么是同情的索引对象?

时间:2018-01-27 18:49:17

标签: python sympy

我不明白同情的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的更好解释,以及它与IndexedBaseidx

的关系

2 个答案:

答案 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是符号数组的名称,其类是IndexedBase
  • i和j是该数组的索引,它们的类是Idx

以上是您自己实例化的类。 M [i,j]的类是索引的,但是你不能通过使用类名来创建这些对象,M[i, j]只是这样做。

最近的两个问题,包括使用索引对象的示例:

答案 1 :(得分:2)

索引主要用于两个用例:

  1. 带有符号下标的公式。例如,\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))有效地代表上述总和。

  2. N-d阵列。这对于代码生成特别有用,因为用于C或Fortran等语言的SymPy代码打印机会自动将索引对象打印为数组查找,例如

    >>> a = IndexedBase('a')
    >>> i = Idx('i', (1, n))
    >>> ccode(a[i])
    'a[i]'
    >>> fcode(a[i])
    '      a(i)'
    

    这使得使用SymPy以符号方式编写基于数组的代码变得非常容易,并生成计算它的快速代码。