【问题标题】:Multiplying parenthesis to get a polynomial in python在python中乘以括号得到多项式
【发布时间】:2017-12-04 15:35:41
【问题描述】:

我被要求进行牛顿多项式插值,我能够编写主要代码。 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

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

提前谢谢:)

【问题讨论】:

  • 多项式是否以字符串形式提供?给出一个示例输入。

标签: python physics numerical-methods


【解决方案1】:

首先,我将等式改写为

c3(x-r3)(x-r2)(x-r1)+c 2(x-r2)(x-r1)+c1(x-r1)+c 0

接下来,注意这相当于:

((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]

【讨论】:

  • 非常感谢,它就像魔术一样工作,我也做过同样的事情,但方式要复杂得多,甚至没有得到有意义的答案。你拯救了这一天,谢谢:)
【解决方案2】:

一种方法是将多项式表示为一个数组,其中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)。

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

【讨论】:

  • 您不仅需要将多项式与常数相乘,还需要与另一个多项式相乘。
【解决方案3】:

将两个多项式相乘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

【讨论】:

    【解决方案4】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多