3

我有一个对应于多项式表达式的系数列表,即:[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

4 回答 4

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

于 2011-02-01T05:29:15.150 回答
1

基于sth 的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]))
于 2011-02-01T05:53:25.887 回答
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)
于 2011-02-01T10:45:54.730 回答
0

得益于强大的 Python 基础函数,Lambda 表达式成为可能!第一件事是通过强大的功能获得一对 (coef, exponent) zip

>>> 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了.llen(l)

于 2011-02-01T10:04:13.367 回答