Sympy:防止评估下标符号

Sympy: prevent a subscripted symbol to be evaluated

给定一个符号 s,它最终将是一个数组,我想定义以下表达式

A = Array([-s[1]/2, s[0]/2])

但我希望 A 仅在我计算包含它的其他一些表达式时才被评估,因为 s 随时间而变化。我试过了

A = UnevaluatedExpr(Array([-s[1]/2,s[0]/2]))

但我收到错误 TypeError: 'Symbol' object is not subscriptable,这让我认为对 s.

执行了一些评估

感谢您的耐心等待,我刚刚开始学习 Sympy,我已经习惯了 Maxima 这种结构很简单的地方。更准确地说,对于 Maxima,我试图将 翻译 为 Sympy 的完整工作代码是(在 Maxima 中,一切都是符号,冒号是赋值运算符,ev 力使用自定义值进行评估,diff 之前的点是向量标量积):

A: [-s[2],s[1]]/2; /* define A in terms of subscripted symbols */
P1: [x1,y1];
P2: [x2,y2];
segment: P1+t*(P2-P1); /* --> [t*(x2-x1)+x1,t*(y2-y1)+y1] */
factor(integrate(ev(A,s=segment).diff(segment,t),t,0,1)); /* integrates the scalar product of A evaluated over segment and the derivative of segment */

跟进

感谢 Oscar 的回答,我能够对上述 Maxima 代码进行有效的 Sympy 翻译(欢迎改进!):

from sympy import *

def dotprod(*vectors): # scalar product, is there a built in better way?
    return sum(Mul(*x) for x in zip(*vectors))

s = IndexedBase('s')
A = Array([-s[1]/2,s[0]/2])

t,x1,y1,x2,y2 = symbols('t x1 y1 x2 y2')
P1 = Array([x1,y1])
P2 = Array([x2,y2])
segment = P1 + t * (P2-P1)

dotprod(A.subs(s,segment),segment.diff(t)).integrate((t,0,1)).factor()

除了 IndexedBase magic Maxima 和 Sympy 中的代码结构非常相似。

我不确定我明白你想要什么。有可能以不同的方式解决您的问题比使用 Array 更好。在任何情况下,您的问题的直接答案是您可以使用 IndexedBase 制作可下标的符号:

In [1]: s = IndexedBase('s')

In [2]: A = Array([-s[1]/2, s[0]/2])

In [3]: A
Out[3]: 
⎡-s[1]   s[0]⎤
⎢──────  ────⎥
⎣  2      2  ⎦