如何使用显式值使用索引变量评估SymPy表达式?

时间:2018-10-13 18:30:15

标签: python sympy

说我用sympy求和

from sympy import *
import numpy as np
m = 10
n = IndexedBase('n')
i = symbols("i",cls=Idx)
sum_ = summation(n[i],[i,1,m])
sum_
>>> n[10] + n[1] + n[2] + n[3] + n[4] + n[5] + n[6] + n[7] + n[8] + n[9]

和一个数值的numpy数组

a = np.random.random((m,))

我想使用sum_的每个对应值来评估a-例如,n[1]将是a[0]n[2]将是{{1} } 等等。如何将a[1]的值传递给a

我尝试使用n方法,但不确定如何工作,并不断出错。

另外,假设我有一个复杂的函数,其中包含求和,并且我想对求导,然后求出系数和变量的特定值,如下所示:

doit()

如何传递theta0 = Symbol('theta0') theta1 = Symbol('theta1') theta2 = Symbol('theta2') sigma = Symbol('sigma') sigma0 = Symbol('sigma0') sigma1 = Symbol('sigma1') sigma2 = Symbol('sigma2') x = IndexedBase('x') t = IndexedBase('t') i = symbols("i", cls=Idx) nges = -(1/(2*sigma**2))*summation( (x[i] - theta0 - theta1*t[i] - theta2*t[i]**2)**2, [i, 1, 2]) func = (-1/2)*((theta0/sigma0)**2 + (theta1/sigma1)**2 + (theta2/sigma2)**2) + nges diff(func, theta0, 1) >>> -1.0*theta0/sigma0**2 - (4*theta0 + 2*theta1*t[1] + 2*theta1*t[2] + 2*theta2*t[1]**2 + 2*theta2*t[2]**2 - 2*x[1] - 2*x[2])/(2*sigma**2) 的标量值和thetax的向量(numpy数组)? (我尝试使用t,但这很麻烦,因为我必须在一个表达式上多次调用它)

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用.subs,并传入一个替换字典。

sum_.subs({n[i+1]: a[i] for i in range(m)})

在某些情况下,您还需要调用evalf来获取诸如pi之类的任何符号常量。在这种情况下,建议像这样在evalf中包含替换:

sum_.evalf(subs={n[i+1]: a[i] for i in range(m)})

与您的第二个示例类似。首先准备具有值的字典会更方便。

values = {theta0: 0.2, theta1: 0.3, theta2: 1.3, sigma0: 2, sigma: 2.2}
values.update({t[i]: 3*i for i in range(1, 3)})
values.update({x[i]: 5*i for i in range(1, 3)})
diff(func, theta0, 1).subs(values)   # 9.67809917355372