乘以括号得到 python 中的多项式

Multiplying parenthesis to get a polynomial in python

我被要求做牛顿多项式插值,我能够编写主要代码。 https://en.wikipedia.org/wiki/Newton_polynomial 但是仍然有一件小事我几天来无法解决,在阅读之后我找到了一种使用 Sympy 来完成它的方法,但我不允许使用除基本 numpy 以外的任何东西。 现在我的问题是我试图乘以这样的东西

p(x)=j(x-q)(x-w)(x-e)+k(x-w)(x-e)+l(x-e)+d

为了得到这个 p(x)=ax³+bx²+cx+d ,所以我在寻找多项式系数 a,b,c,d

例如:

p(x)=5-7(x+1)+9(x+1)(x)-7(x+1)(x)(x-1)=-7x³+9x²+9x -2

当然,我正在寻找一般情况,而不仅仅是三次多项式。 任何提示将不胜感激,几天以来我真的一直坚持这一点。 很抱歉符号写得草率,但似乎 Whosebug 不接受乳胶,我无法 post 图片,因为我没有所需的声誉。 (如果还有其他 post 的解决方案,请告诉我,我会再次 post )

提前致谢:)

一种方法是将多项式表示为数组,其中 a[0]..a[n] 其中 a[i] 是您乘以 (x^i) 的常数。该函数类似于 p(x) = a[0] + a[1]*x + a[2]* (x**2)....

现在要在此表示中添加两个多项式,您只需用 0 填充较短的多项式并在匹配索引处添加值。

如果您想将多项式乘以 k*(x**z),您需要将每个值乘以 k 并在前面插入 z 个零 (a[0:0] = [0.] * z)。

使用这两个运算,您可以求解方程并获得所需的系数。

将两个多项式相乘x(x-1)等同于对它们的系数进行卷积:

# x     => [1, 0]
# (x-1) => [1, -1]
numpy.convolve([1, 0], [1, -1])  # [1, -1, 0] => x^2 - x + 0

这意味着您可以使用

解决问题
import numpy

def mult(a, b):
    """
    Polynomial multiplication is simply a convolution
    """
    return numpy.convolve(a, b)

def add(a, b):
    """
    Addition is a bit complex as a and b may have different lengths.
    Simply prepend zeros to the shorter one
    """

    if len(a) < len(b):
        a = numpy.insert(a, 0, [0] * (len(b) - len(a)))
    if len(b) < len(a):
        b = numpy.insert(b, 0, [0] * (len(a) - len(b)))

    return a + b


# p(x)=5-7(x+1)+9(x+1)(x)-7(x+1)(x)(x-1)=-7x³+9x²+9x-2
add(
    add(
        numpy.array([5]),
        mult([-7], [1, 1]),
    ),
    add(
        mult([9], mult([1, 1], [1, 0])),
        mult([-7], mult([1, 1], mult([1, 0], [1, -1])))
    )
)

产量

array([-7,  9,  9, -2])  # => -7x^3 + 9x^2 + 9x - 2

使用numpy,我们可以访问poly1d对象。因此,j(x-q)(x-w)(x-e)+k(x-w)(x-e)+l(x-e)+d 等同于:

In [ ]: j, q, w, e, k, w, l, d = range(1, 9)
   ...: poly1 = j*np.poly1d([-q, -w, -e], r=1)
   ...: poly2 = k*np.poly1d([-w, -e], r=0)
   ...: poly3 = l*np.poly1d([-e])
   ...: poly = poly1 + poly2 + poly3 + d
   ...: print(poly)
   3      2
1 x + 12 x + 14 x + 8

首先,我将等式重写为

c3(x-r3)(x-r2)(x-r1)+c2(x-r2)(x-r1) +c1(x-r1)+c0

接下来,注意这相当于:

((c3(x-r3)+c2)(x-r2)+c1)(x-r1)+c0

你要查的话可以乘出来

所以一般来说,你可以这样做:

poly = np.poly1d([c[n]])
for i in range(n,0,-1):
    poly = poly*np.poly1d([1,-r[n]])+np.poly1d([n-1])

如果您愿意相信强制转换正常工作,您可以将 np.poly1d([c[n]]) 替换为 c[n],将 np.poly1d([c[n-1]]) 替换为 c[n-1]