首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用显式值计算带索引变量的SymPy表达式?

如何使用显式值计算带索引变量的SymPy表达式?
EN

Stack Overflow用户
提问于 2018-10-13 18:30:14
回答 1查看 949关注 0票数 0

假设我有一个用同情求和

代码语言:javascript
复制
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]

和一个值的数字数组

代码语言:javascript
复制
a = np.random.random((m,))

我希望使用sum_的每个对应值来计算a --例如,n[1]a[0]n[2]a[1],等等。如何将a的值传递给n

我尝试过使用doit()方法,但是我不确定它是如何工作的,并且不断地得到错误。

此外,假设我有一个包含和的复杂函数,我想取系数和变量的导数,然后求出系数和变量的具体值,如下所示

代码语言:javascript
复制
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)

我如何传递theta的标量值和xt的向量(numpy数组)?(我尝试使用.limit(),但这变得很麻烦,因为我不得不在一个表达式上多次调用它)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-13 19:04:03

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

代码语言:javascript
复制
sum_.subs({n[i+1]: a[i] for i in range(m)})

在某些情况下,您还需要调用evalf来获取任何符号常量,如pi求值。在本例中,建议在evalf中包括以下替换:

代码语言:javascript
复制
sum_.evalf(subs={n[i+1]: a[i] for i in range(m)})

同样,第二个例子也是如此。更方便的是先准备一个带有值的数据集。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52796036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档