IndexedBase的替代品

时间:2014-11-21 01:28:54

标签: python sympy

请考虑以下事项:

import sympy
from sympy import *

x = IndexedBase('x')
i = Symbol('i', integer=True)

z = x[i] + x[i+1] + x[i+2]
print z

x[i+1] = 2 # <-- problem

print z

在“x [i + 1] = 2”时,我遇到“TypeError:'IndexedBase'对象不支持项目分配” 我希望允许更新x [i + 1]的符号值,并且让“print z”给我更新的符号值。我不足以替换z中的x [i + 1]项,因为可能有其他表达式使用相同的x [i + 1]项,我希望它们也可以更新。

而不是IndexedBase,建议使用哪些替代方法,因为IndexedBase不支持项目分配?

我使用了IndexedBase,因为我想用符号引用来表示内存。

请让我知道如何重新解释我的问题和/或需要更好地帮助您。

2 个答案:

答案 0 :(得分:3)

SymPy表达式不可变。如果要更改它们,则需要使用subs之类的函数来创建新表达式(如z2 = z.subs(x[i + 1], 2))。

答案 1 :(得分:1)

也许你需要使用的是像lambda。我们假设您要将值存储在x中。我们将从10个值开始

x = range(10)

现在定义一个表达式,用于添加x

的第一个和第二个值
z = lambda: x[0] + x[1]

这个lambda会在你每次调用时执行你所说的(你在z之后使用括号来做:

>>> z()
1

如果更改x [1],则z将给出新的答案:

>>> z[1] = 42
>>> e1()
42

现在,如果你想要一个依赖于i的泛型范围,你必须创建一个变量的函数,i:

>>> e2 = lambda i: x[i] + x[i+1]

如果你为i赋予这个函数值0,你会得到x [0] + x [1];如果你为它发送值为3,你将获得x [3] + x [4]:

>>> e2(0) # x[0] + x[1] = 0 + 42
42
>>> e2(3) # x[3] + x[4] = 3 + 4
7

这是否为您提供了如何继续您想要做的事情的想法?