我有一个与多项式表达式对应的系数列表,即:[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函数?
答案 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)
都是正确的,无论其长度如何。