如何从系数列表中构建多项式lambda函数?

时间:2011-02-01 05:20:13

标签: python function numpy lambda mpmath

我有一个与多项式表达式对应的系数列表,即:[1,2,0]对应x^2 + 2x + 0。 我想将这些系数的任意长度数组放入lambda函数中。

具体来说,我使用mpmath并且我有一个用于polyval module的列表:

polyval(ctx, coeffs, x, derivative=False)

给定系数和数字,polyval()评估多项式。

我需要使用findroot module 采用一维函数,即:

findroot(lambda x: x**3 + 2*x + 1, 2)

如何从系数列表中构造lambda函数?

4 个答案:

答案 0 :(得分:7)

你真的需要 lambda 功能吗?使用“普通”功能应该更容易:

def poly(coeffs):
   def calc(x):
      result = 0
      for c in coeffs:
         result = result*x + c
      return result
   return calc

findroot(poly([1,2,0]))

使用你提到的polyval()函数,这样的东西应该有效:

findroot(lambda x: polyval(ctx, [1,2,0], x))

(适用于ctx值)

答案 1 :(得分:1)

基于polyval()的方法看起来是最好的答案(因为你已经可以访问该函数),但如果你想实现自己的等价,​​那么该函数看起来更像:

def poly(coeffs):
  def calc(x)
    result = 0
    for i,c in enumerate(reversed(coeffs)):
      result += c*(x**i)
    return result
  return calc

findroot(poly([1,2,0]))

答案 2 :(得分:1)

如果你真的想要一个lambda表达式,我能想到的最简单的就是使用reduce()

coeffs = [1, 2, 0]
f = lambda x: reduce(lambda y, a: x*y + a, coeffs, 0.0)
findroot(f, 2)

由于此标记为numpy,您还可以使用numpy.poly1d

coeffs = [1, 2, 0]
f = numpy.poly1d(coeffs)
findroot(f, 2)

答案 3 :(得分:0)

由于出色的Python基本功能,Lambda表达式是可行的!第一件事是通过强大的zip函数得到(coef,exponent)夫妇:

>>> l = [3, 0, 4, -9]
>>> range(len(l) - 1, -1, -1)
[3, 2, 1, 0]
>>> zip(l, range(len(l) - 1, -1, -1))
[(3, 3), (0, 2), (4, 1), (-9, 0)]

我使用反向range,因为更大的指数位于列表的开头。现在,多项式是一个总和......由于sum函数计算了!

>>> f = lambda x: sum([coef*x**exp for (coef, exp) in zip(l, range(len(l) - 1, -1, -1))])
>>> f(3)
84

确实是3*3^3 + 0*3^2 + 4*3^1 - 9*3^0 = 3*27 + 0 + 4*3 - 9*1 = 81 + 12 - 9 = 84。 由于f的使用,l的所有表达式对于所有系数len(l)都是正确的,无论其长度如何。