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