插值函数卷积的数值积分

Numerical integration of convolution of interpolating function

我有 x 和 y 数据点数组,用于创建插值函数 func_spline,如下所示。

 import numpy
 from numpy import loadtxt
 from scipy.interpolate import *
 x_given = numpy.arange(1,21400,21400/25000)
 y_given  = loadtxt("Yvalues.txt", comments="#", delimiter=",", unpack=False)

 func_spline = interp1d(x_given,y_given, kind='cubic')
 y_is = func_spline(x_given)

 def alphasinterp(ktsq):
 return func_spline(ktsq)

 import sympy as sp
 import scipy.integrate.quadrature as sciquad

 result = sciquad(alphasinterp,0,21400)
 print(result)

代码成功集成,但我想修改代码以允许集成表单

   result = sciquad(alphasinterp*f1,0,21400)

其中 f1 是我在积分中与 alphasinterp 卷积的任何函数(ktsq 和其他不参与积分的变量的函数)。例如,对于特定的 f1 我得到错误

TypeError: unsupported operand type(s) for *: 'function' and 'FunctionClass'

如何解决? 谢谢! (从代码中可以看出,y 数组包含大约 21000 个点,因此可能不允许或不建议在此处复制和粘贴我的数据。我很乐意上传包含数据的文本文件 'Yvalues.txt',但我还没有看到这样做的方法)

您必须将这两个函数的乘积定义为您可以在集成中使用的另一个函数。所以在你的代码中它看起来像:

def alphasinterp(ktsq):
    return func_spline(ktsq)

def f1(ktsq, a1, a2):
    return a1*ktsq+a2# some value

def f_product(ktsq, a1, a2):
    return alphasinterp(ktsq)*f1(ktsq, a1, a2)

def integrated_f(a1, a2):
    return sciquad(f_product,0,21400, args=(a1, a2))

a1=5.0 # just some numbers
a2=3.2
result = integrated_f(a1, a2)

如果你想计算卷积,你必须更进一步。使用 (f*g)(x)=\int f(t)g(x-t) dt 它会是这样的

def conv_without_int(t, x):
    return alphasinterp(t)*f1(x-t)
def convolution(x):
    return sciquad(conv_without_int,0,21400, args=(x))

您可以使用 lambda 表示法缩短它