【问题标题】:sympy - symbolic sum over symbolic number of elementssympy - 元素符号数的符号总和
【发布时间】:2017-09-29 15:54:08
【问题描述】:

在 SymPy 中表达以下内容最合适的方式是什么:

样本 'x[i]' 的总和,其中 'i' 来自混凝土 0 到符号“N”。 'x[i]' 本身应该是象征性的,即 始终显示为变量。

我们的目标是在线性方程组中使用这些表达式。

示例(近似最小二乘法):

给定一组样本 (x[i], y[i]),它们应该位于 'y = m*x + a' 给出的行。即,估计线由“m”和“a”确定。 样本与估计线之间的误差可由下式给出

 error(m, a) = sum((m * x[i] + a - y[i]) ** 2, start_i=0, end_i=N)

现在,在导数 'd/dm error(m,a)' 中搜索零跃迁 'd/da error(m,a)' 提供最小距离。我怎么能找到 同情的解决方案?

【问题讨论】:

  • 能否请edit 澄清您的问题:1)我理解您的情况,因此x[i]N 应该是抽象的。您的情况与求解完全抽象的线性方程组有何不同?为什么你需要 SymPy?你希望它为你做什么? 2)如果我以某种方式误解了这一点,为什么标准 Python sumsympy.Sum 不起作用? — 理想情况下,请举例说明输入,您想用它做什么,以及您希望得到什么样的结果。

标签: python sympy symbolic-math linear-equation


【解决方案1】:

鉴于您后面的问题,我假设您已经了解了大部分问题,但为了清楚起见,样本被视为函数(有道理,给定的集合实际上是覆盖集合域的函数 [主要是整数的一部分]),所以符号类似于x(i),并且可以使用summation 函数或Sum 构造函数来实现求和(第一个更好,因为它会自动扩展常量加数,如summation(x, (i, 0, n)))。

>>> from sympy import *
>>> m, a, x, y, i, n = symbols('m a x y i n')
>>> err = summation((m * x(i) + a - y(i)) ** 2, (i, 0, n))
>>> pprint(err)
  n
 ___
 ╲
  ╲                      2
  ╱   (a + m⋅x(i) - y(i))
 ╱
 ‾‾‾
i = 0

在提供 sum 函数、加数表达式和 (index, lower bound, upper bound) 后,您可以继续使用 sum:

>>> diff(err, m)
Sum(2*(a + m*x(i) - y(i))*x(i), (i, 0, n))
>>> diff(err, a)
Sum(2*a + 2*m*x(i) - 2*y(i), (i, 0, n))

【讨论】:

  • 这会抛出“TypeError: 'Symbol' object is not callable”
  • @Scott 我差不多 3 年前写了这个答案。也许较新版本的 sympy 已弃用默认符号订阅? (这是我的第一个猜测)
  • @Scott m, a, i, n = symbols('maxyi n') err, x, y = symbols('err x y', cls=Function) 应该修复错误。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多