2012-02-27 88 views
1

我正在構建一個類來構建某種類型的近似函數(數學函數)。這個近似函數將是給定數量的基函數的線性組合,我將其存儲在一個列表中,並且它將返回一個標量。該類的方法需要在每次迭代中更新我的逼近函數,方法是將每個基函數與標量(針對不同基函數的不同標量)相乘,並形成總和。換句話說,我需要通過形成基函數的線性組合並將我的逼近函數設置爲這個未經評估的函數之和來更新我的逼近函數。未評估函數的線性組合

這個類的默認基礎是一個多項式基礎,我用NumPy的poly1d class實現。我形成線性組合的方法是目前

sum(self.basis[i]*self.coeffs[i] for i in range(self.dim)) 

其中(顯然)self.basis是基函數的列表中,self.coeffs是標量的與所述基函數乘以列表,self.dim是基函數的數量。該方法適用於poly1d類,但不是,例如,如果我使用的基礎,如:

basis1 = [lambda x: float(x), lambda y: float(y)**2] 

def x(y): 
    return y 
def x2(y): 
    return y**2 
basis2 = [x, x2] 

Basis1給我的錯誤

TypeError: only length-1 arrays can be converted to Python scalars 

Basis2給我錯誤

TypeError: unsupported operand type(s) for *: 'function' and 'numpy.float64' 

Likew ISE採用

sum(itertools.imap(operator.mul, self.basis, self.lambdas)) 

作品爲基礎poly1d,而不是上面的其他基地,並給出了同樣的錯誤消息。

所以我的問題是:如何在Python中使用或不使用NumPy形成未評估函數的線性組合?

回答

2

的快速方法的功能基礎上與該係數相結合是一個Python字典:

f = lambda x : x+1 
g = lambda x : 2*x 
d = { f : 7, g : 3 } 
print(d) 
d[f]=8 
print(d) 
def app (d,x): return np.sum([ v * k(x) for k,v in d.items() ]) 
print(app(d,0)) 

此打印:

{<function <lambda> at 0x115e7dc08>: 7, <function <lambda> at 0x115e7de60>: 3} 
{<function <lambda> at 0x115e7dc08>: 8, <function <lambda> at 0x115e7de60>: 3} 
8 

然後,你將需要獲得一個快譯通子類來處理數學你需要的操作。

更簡單的做法是將coef和函數列表分開,並在coef列表上進行操作,直到需要評估爲止。

0

TypeError是當數組爲null或它不是數組,或者它是空的,或者它是NaN等時,所以也許嘗試打印x和x2並與總和內的內容進行比較。 更困難的數學通常可以分解爲原子操作,因此使用打印來調試這些東西更容易,以查看之前操作的結果。