我有 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表示法来缩短它