我试图使用sympy来自动化多项式拟合问题的解决方案。例如,假设我定义了一个多项式函数:
#!/usr/bin/python
from sympy import *
x, xa, xb, a0, a1, a2, a3 , a4 = symbols(('x', 'xa', 'xb', 'a0', 'a1', 'a2', 'a3', 'a4'))
def p4(x):
return a0 + a1 * x + a2 * x**2 + a3 * x**3 + a4 * x**4;
使得p4(x):[xa,xb] - > R.然后,我可以像这样计算它的符号衍生物:
y = p4(x)
ydiff = diff(y, x)
然后对导数和函数施加一些条件,以符号方式计算多项式系数,如下所示:
c0 = y.subs(x, xa)
c1 = y.subs(x, xb)
c2 = ydiff.subs(x, xa)
c3 = ydiff.subs(x, xb)
c4 = ydiff.subs(x, (xa + xb) * 0.5)
这些实际上不是条件,它们是替换,完整条件是c0 = 0.5
,说xa处的函数p4的值为0.5。在任何情况下,4个方程的最终系统对于a0
,a1
,a2
,a3
和a4
都是线性的。
我的问题是,如何组装矩阵A:
A = Matrix([c0[1], c0[2], c0[3], c0[4], 0.5], [....
使用sympy.solve_linear_system
解决系统问题?
例如,计算出的c0
如下所示:
In [2]: c0
Out[2]: a0 + a1*xa + a2*xa**2 + a3*xa**3 + a4*xa**4
并且Matrix期望c0 = 0.5
等式,像这样的列表
[a0, a1*xa, a2*xa**2, a2*xa**3, a4*xa**4, 0.5]
在sympy中是否有一个函数可以将多项式转换为系数和参数的列表?
编辑 :我找到了如何将多项式表示为列表
c0ArgList = list(c0.args)
c3ArgList = list(c3.args)
但是它们在xa ^ n:
方面没有排序c0ArgList
Out[92]: [a1*xa, a2*xa**2, a4*xa**4, a0, a3*xa**3]
In [93]: c3ArgList
Out[93]: [a1*xa, a2*xa**2, a4*xa**4, a0, a3*xa**3]
这使得无法应用这些条件。我如何根据' xa ^ n'?
对它们进行排序答案 0 :(得分:7)
要获取所有系数,请使用all_coeffs方法:
>>> Poly(1+x**2*2+5*x**4).all_coeffs()
[5, 0, 2, 0, 1]
你不需要自己调用solve_linear_system。您只需传递需要求解的方程组以在列表中求解(并且可选地告诉您要解决的符号的子集),它将返回答案。
>>> solve([Eq(x+y,2), Eq(x**2, 4)])
[{x: -2, y: 4}, {x: 2, y: 0}]