2011-02-01 19 views
2

我有一個對應於多項式表達式的係數列表,即:[1,2,0]對應於x^2 + 2x + 0。 我想將這些係數的任意長度數組放入一個lambda函數。如何從係數列表構建一個多項式lambda函數?

具體來說,我使用mpmath,我有用於polyval module這是一個列表:

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

鑑於係數和一個數字,polyval()估算多項式。

,我需要使用findroot module ,需要一個一個維功能,即:

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

我怎樣才能構建一個lambda函數出來係數的名單?

+0

怎麼辦你的意思是「把這些係數的任意長度數組放入一個lambda函數」? – Phil 2011-02-01 05:27:36

+2

我不明白爲什麼它很重要,這是一個lambda函數。當然,你可以定義一個常規功能。 – senderle 2011-02-01 05:43:17

回答

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

+0

這從根本上說是對的。只有兩個調整:(1)「ctx」只是變相的自我(polyval是一種方法),並且不需要傳遞; (2)findroot需要一個區間或起點。所以findroot(lambda x:polyval([1,2,0],x),[-3,-1])會返回mpf(' - 2.0'),因爲它應該。 – DSM 2011-02-01 09:50:31

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

感謝Python基本功能,Lambda表達式是可能的!第一件事是通過強大的zip函數來獲取的(COEF,指數)夫婦:

>>> 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。 由於使用了len(l),所以f的這個表達式對於所有的coefs l列表都是正確的。

+0

我認爲ncoghlan答案的和變量更簡單:def f(cfs,x):return sum(c * x ** i for i,c in enumerate(reversed(cfs))) – DSM 2011-02-01 10:26:55

1

如果你真的想要一個lambda表達式,我能想到的easiset使用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) 
相關問題