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 ⎦
给定一个符号 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 ⎦