我需要爲任意數量的峯值創建一個函數,以傳遞給最小二乘擬合例程。對於每一個峯存在於50次返回的函數的函數的額外項,即Python中的動態函數構建
一個術語具有值:f(p, x) = p[0]*50 + p[1]*60*x
:在50,60返回的函數f(p, x) = p[0]*50
兩個方面與值三個方面與值在50,60,70返回:f(p, x) = p[0]*50 + p[1]*60*x + p[2]*70*x^2
等
幾個幼稚嘗試如下所示,
def foo(vals):
fn = lambda p, x: 0
i = 0
for v in vals:
fn = lambda p, x : fn(p, x) + p[i] * v * x**i
i += 1
return fn
# Causes a recursion error (I think)
第二次嘗試......
def bar(vals):
terms = []
i = 0
for v in vals:
terms.append(lambda x, p: p[i] * v * x**i)
i += 1
def fn(x, p):
tvals = [t(x, p) for t in terms]
sum = 0
for t in terms:
sum = sum + t(x, p)
return sum
return fn
# Generates the wrong values
我懷疑這是引用一個問題,即Python將參照表聲明等,但是這是一個有點複雜解開 - 任何幫助,將不勝感激!
你能提供一個測試用例,顯示你期待得到什麼(和你在第二種情況中得到什麼)? – NPE 2010-12-07 13:17:03
是的,有點難以猜到你想要什麼,特別是因爲第一次只是覆蓋`fn`多... – 2010-12-07 13:22:21
嗯,它似乎在我試圖調試時複製代碼的第二次嘗試時,它不應該返回一個列表,它應該返回該列表的總和......並且我更好地解釋了期望的結果 – Brendan 2010-12-07 14:18:22