【问题标题】:How to convert a sympy polynomial into a list?如何将 sympy 多项式转换为列表?
【发布时间】:2014-10-02 11:52:35
【问题描述】:

我正在尝试使用 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,表示函数 p4 在 xa 的值为 0.5。在任何情况下,对于a0a1a2a3a4,4 个方程的最终系统都是线性的。

我的问题是,如何组装矩阵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

矩阵期望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' 中的 n 对它们进行排序?

【问题讨论】:

  • 尝试使用sympy.Poly()

标签: python sympy


【解决方案1】:

要获取所有系数,请使用 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}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2017-01-29
    • 2017-11-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多