Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 插值函数卷积的数值积分_Python 3.x_Integration_Interpolation_Numerical Integration_Cubic Spline - Fatal编程技术网

Python 3.x 插值函数卷积的数值积分

Python 3.x 插值函数卷积的数值积分,python-3.x,integration,interpolation,numerical-integration,cubic-spline,Python 3.x,Integration,Interpolation,Numerical Integration,Cubic Spline,我有数据点的x和y数组,用于创建插值函数func_样条,如下所示 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 = inte

我有数据点的x和y数组,用于创建插值函数
func_样条
,如下所示

 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:不支持*:“函数”和“函数类”的操作数类型

如何解决?
谢谢(从代码中可以看出,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)=\intf(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符号缩短它

是的,我刚刚意识到,所以我删除了我的评论,但你已经看到了:)你的答案的上半部分对我来说已经足够了,谢谢,但我的
f1
原则上是积分变量
ktsq
以及我问题中提到的其他变量的函数。我尝试添加其他变量,但错误是
TypeError:无法确定关系的真值
,我想因为我调用了数值积分方法(quad),所以我必须将其他变量指定为数值,而不是符号定义的,但我以前在python中没有这样做(只是一个想法)是的,如果您使用数值积分方法,并且不能将其与符号积分或诸如此类的方法混合,则只能在函数中使用数值参数。好的,非常感谢,您能否修改您的答案,以说明在实践中如何做到这一点?我以前只在mathematica做过你什么意思?额外的争论?这是我回答的第二部分。x是积分中的一个额外参数