我正在构建一个用于构造某种近似函数(数学函数)的类。这个近似函数将是给定数量的基函数的线性组合,我将其存储在列表中,它将返回一个标量。类的方法需要在每次迭代中更新我的近似函数,方法是将每个基函数与标量(不同基函数的不同标量)相乘,并形成总和。换句话说,我需要通过形成基函数的线性组合并将我的近似函数设置为这个未评估的函数和来更新我的近似函数。
这个类的默认基础是多项式基础,我用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)?
答案 0 :(得分: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
然后,您需要派生一个Dict子类来处理您需要的数学运算。
更简单的方法是将coef和函数列表分开,并在coef列表上运行,直到需要进行评估。
答案 1 :(得分:0)
TypeError是指数组为null或者不是数组,或者它是空的,或者是NaN等,所以也许尝试打印x和x2并与总和内部进行比较。 更困难的数学通常可以分解为原子操作,因此使用打印来调试这些东西更容易,看看之前操作的结果是什么。