sympy - 元素符号数量的符号和

sympy - symbolic sum over symbolic number of elements

在 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)' 提供最小距离。我怎样才能找到 用 sympy 解决?

鉴于你后面的问题,我假设你已经想出了大部分,但为了清楚起见,样本被认为是函数(有道理,给定的集合实际上是覆盖集合域的函数[主要是超过部分整数]), 所以符号类似于 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

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

>>> 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))