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

3 投票
4 回答
4641 浏览
提问于 2025-04-16 10:59

我有一组系数,它们对应一个多项式表达式,比如说:[1,2,0] 对应的就是 x^2 + 2x + 0。我想把这组系数放进一个可以随意长度的数组里,放到一个 lambda 函数中。

具体来说,我在使用 mpmath,而我有一个列表是用来给 polyval 模块用的,这个列表是:

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

给定系数和一个数字,polyval() 就可以计算这个多项式的值。

而我需要使用 findroot 模块,这个模块需要一个一维的函数,比如:

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

我该如何从一组系数构建一个 lambda 函数呢?

4 个回答

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]))
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)
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值)

撰写回答