Sympy - 对符号数量的符号求和

9
以下是SymPy中表达以下内容的最合适方法:
对于从具体的0到符号N的'i',对样本'x[i]'求和。 '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找到解决方案?


请问您能否编辑一下您的问题以作进一步澄清:1)我理解您的情况是x[i]N应该是抽象的。那么您的情况与解决一个完全抽象的线性方程组有什么不同呢?为什么需要使用SymPy,您期望它能为您做什么?2)如果我理解错了,请问为什么标准Python中的sum或者sympy.Sum并不能满足您的需求?希望您能给出一些输入的示例,你想要用它来实现什么,以及您期望得到什么样的结果。 - Wrzlprmft
1个回答

8
鉴于您之前的问题,我认为您已经基本弄清楚了,但为了更加清晰明了,样本被视为函数(在某种程度上是有道理的,因为集合实际上是覆盖集合域的函数[大多数情况下是整数的一部分]),因此符号表示为 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

当你提供了求和函数的加数表达式以及(索引、下界、上界),你可以继续使用这个求和函数:

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

8
这会抛出一个“TypeError: 'Symbol' object is not callable”的错误。 - Him
@Scott 我写下这个答案已经将近3年了。也许新版本的sympy已经弃用了默认符号订阅?(这是我的第一个猜测) - Uriel
3
@Scott 应该修复错误的代码如下: m、a、i、n = symbols('m a x y i n') err、x、y = symbols('err x y', cls=Function) - rlib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接