乘以括号得到 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]
我被要求做牛顿多项式插值,我能够编写主要代码。 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]