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]
将是a[1]
等等。如何传递a
into的值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)
我将如何传递 's 的标量值和's和theta
's 的向量(numpy 数组)?(我尝试使用,但这变得很麻烦,因为我必须在一个表达式上多次调用它)x
t
.limit()
解决方案
最简单的方法是使用.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
推荐阅读
- amazon-web-services - 用于跨 vpc 连接和 ssl 证书的 aws 专用区域
- sql-server - “sqlpackage.exe”不被识别为内部或外部命令错误
- c# - 将“平均”浮动百分之一
- php - 是否可以创建一个元素具有可变宽度的两行光滑滑块?
- linux - Linux 内核无法从 USB 挂载 rootfs
- java - 以下泛型代码有什么问题?
- ansible - Ansible 替换模块不起作用
- xcode - XCode 7.2.1 OpenGL Profiler:查看帧缓冲区内容
- bash - 从 docker 主机在 docker 容器内创建符号链接
- php - Facebook API:获取持久用户身份验证访问令牌