我正在构建一个类,用于构造某种类型的近似函数(数学函数)。这个近似函数将是给定数量的基函数的线性组合,我将其存储在一个列表中,它将返回一个标量。该类的方法需要在每次迭代中更新我的近似函数,方法是将每个基函数与标量(不同基函数的不同标量)相乘,并形成和。换句话说,我需要通过形成基函数的线性组合并将我的近似函数设置为这个未计算的函数和来更新我的近似函数。
这个类的默认基数是一个多项式基,这是我用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'
同样,使用
sum(itertools.imap(operator.mul, self.basis, self.lambdas))
适用于poly1d基础,但不适用于上面的其他基础,并给出相同的错误消息。
所以我的问题是:如何在Python语言中形成未计算函数的线性组合(使用或不使用NumPy)?
发布于 2012-02-27 19:18:14
将函数基础与系数相结合的一种快速方法是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
然后,您将需要派生Dict子类来处理所需的数学运算。
更简单的方法是将coef和function列表分开,只在coef列表上操作,直到需要计算为止。
发布于 2012-02-27 19:21:07
当数组为空,或者不是数组,或者是空的,或者是NaN,等等,那么可以尝试打印x和x2,并与和中的值进行比较。更难的数学通常可以拆分成原子操作,所以更容易用print调试这个东西,看看前一个操作的结果是什么。
https://stackoverflow.com/questions/9470760
复制相似问题