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

Fra*_*fer 7 linear-equation symbolic-math sympy

在“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)
Run Code Online (Sandbox Code Playgroud)

现在,在导数 'd/dm error(m,a)' 和 'd/da error(m,a)' 中搜索零转换提供了最小距离。我怎样才能找到 sympy 的解决方案?

Uri*_*iel 5

鉴于你后面的问题,我假设你已经想通了大部分,但为了清楚起见,样本被视为函数(有道理,给定的集合实际上是覆盖集合域的函数[主要是整数的一部分]),所以符号就像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
Run Code Online (Sandbox Code Playgroud)

在提供 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))
Run Code Online (Sandbox Code Playgroud)

  • 这会抛出“TypeError:'Symbol'对象不可调用” (4认同)
  • @Scott m,a,i,n =符号('maxyi n')err,x,y =符号('err x y',cls = Function)应该修复错误。 (3认同)