【问题标题】:How can I create functions that handle polynomials?如何创建处理多项式的函数?
【发布时间】:2013-08-07 02:12:48
【问题描述】:

我有这些关于多项式的问题,我花了大约 4 个小时来解决这个问题,但我就是搞不懂。我是 Python 和编程的新手,我已经尝试在纸上解决它,但我就是不知道。

  1. 编写并测试一个 Python 函数 negate(p),它否定由其系数列表 p 表示的多项式并返回一个新的多项式(表示为一个列表)。换句话说,编写一个使数字列表为负数的函数。

  2. 编写一个 Python 函数 eval_polynomial(p, x),它返回 P(x) 的值,其中 P 是由其系数列表 p 表示的多项式。例如,eval_polynomial([1, 0, 3], 2) 应该返回 1*2^2 + 0*2 + 3 = 7。使用单个 while 循环。

  3. 编写并测试一个函数 multiply_by_one_term(p, a, k),它将由系数列表表示的给定多项式 p 乘以 ax^k,并将乘积作为新列表返回。

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 启动 Python shell 并在此处尝试这些示例:docs.python.org/2/tutorial/…
  • 案例2:返回的值最好用python说1 * 2 ** 2 + 0 * 2 ** 1 + 3 * 2 ** 0...
  • 添加到@Anycorn 的评论,使用 ipython 或 ipython notebook。

标签: python polynomial-math evaluate multiplication


【解决方案1】:

我建议使用numpy.poly1dnumpy.polymul,其中系数为a0*x2 + a1*x + a2

例如表示3*x**2 + 2*x + 1

p1 = numpy.poly1d([3,2,1])

通过生成的poly1d 对象,您可以使用*/ 等进行操作...:

print(p1*p1)
#   4      3      2
#9 x + 12 x + 10 x + 4 x + 1

如果你想构建自己的函数,假设 p 按顺序包含系数:a0 + a1*x + a2*x**2 + ...:

def eval_polynomial(p,x):
    return sum((a*x**i for i,a in enumerate(p)))

def multiply_by_one_term(p, a, k):
    return [0]*k + [a*i for i in p]

注意

我的评估函数使用指数,这可以通过霍纳规则来避免,正如另一个答案中所发布的,该答案可在 Numpy 的 polyval 函数中找到

【讨论】:

  • 我还没有足够的声望,但会投票给你。我实际上了解您的解决方案背后的逻辑。
  • @confusedstudent 太好了,你理解这个逻辑
  • 此解决方案虽然方法清晰,但效率明显低下。请考虑使用 horner 规则以避免在每次迭代中调用指数。我想我应该将其发布为答案。
【解决方案2】:

请改用霍纳法!

对于多项式,您应该考虑Horner's Method。它的主要特点是计算 N 阶多项式只需要 N 次乘法和 N 次加法——不需要指数:

def eval_polynomial(P, x):
    '''
    Compute polynomial P(x) where P is a vector of coefficients, highest
    order coefficient at P[0].  Uses Horner's Method.
    '''
    result = 0
    for coeff in P:
        result = x * result + coeff
    return result

>>> eval_poly([1, 0, 3], 2)
7

您可以手动完成它,或者点击链接查看它是如何工作的。

【讨论】:

  • 评估多项式的​​好解决方案,虽然可以使用 Numpy 的 polyval
  • numpy 很棒,但 OP 是写一个函数。在很多情况下,您希望在不拖入所有 numpy 的情况下评估多项式。
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多