如何从系数列表构建多项式lambda函数?
我有一组系数,它们对应一个多项式表达式,比如说:[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
值)