Python scipy.integrate.quad给出TypeError:需要整数参数,得到浮点值

Python scipy.integrate.quad给出TypeError:需要整数参数,得到浮点值,python,numpy,Python,Numpy,我想用numpy做傅里叶级数。我试图按照定义编写函数 但我在定义a0时已经遇到了麻烦 # "M1(t)" function definition. def M1(t, *args): tau, M0 = args omega = 2 * np.pi / tau return (2 * M0 + M0 * np.sin(omega * t - 2 / 3 * np.pi) + M0 * np.sin(omega * t - 4/ 3 * np

我想用numpy做傅里叶级数。我试图按照定义编写函数

但我在定义a0时已经遇到了麻烦

# "M1(t)" function definition.
def M1(t, *args):
    tau, M0 = args
    omega = 2 * np.pi / tau
    return (2 * M0 + M0 * np.sin(omega * t - 2 / 3 * np.pi) +
                M0 * np.sin(omega * t - 4/ 3 * np.pi))


# "M2(t)" function definition.
def M2(t, *args):
    tau, M0 = args
    omega = 2 * np.pi / tau
    return (3 * M0 + M0 * np.sin(omega * t) + M0 * np.sin(omega * t - 2 / 3 * np.pi) +
                M0 * np.sin(omega * t - 4/ 3 * np.pi))    

 def a0(tau, *args):
    # limits of integrals; a = lower of 1st integral;
    # b = higher of 1st and lower od 2nd integral;
    # c = higher of 2nd integral
    a, b, c = 0, tau / 2, tau
    i1, err1 = quad(M1, a, b, *args)
    i2, err2 = quad(M2, b, c, *args)
    return 2 / tau * (i1 + i2)
当我运行此代码时,出现以下错误:

TypeError:应为整数参数,得到浮点值

根据要求,对错误进行回溯:

Traceback (most recent call last):
  File "C:/Users/Alex/Documents/Faks/Magisterij/1. letnik/VD/2. seminar/periodicno_vzbujanje.py", line 86, in <module>
    a0 = a0(parameters[0], *parameters)
  File "C:/Users/Alex/Documents/Faks/Magisterij/1. letnik/VD/2. seminar/periodicno_vzbujanje.py", line 41, in a0
    i1, err1 = quad(M1, a, b, *args)
  File "C:\Users\Alex\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 315, in quad
    points)
  File "C:\Users\Alex\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 380, in _quad
    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
TypeError: integer argument expected, got float
额外问题:如何将组合函数传递给四边形?例如:M1t,*args*np.cosomega*t?我是否必须将它定义为一个新函数,然后将其传入,还是有更快的方法?因为我觉得输入4个额外的函数有点多余

更新: 我意识到我一直在传递错误的传统观点。 我将i2,err2=quadM2,b,c,*args更改为i2,err2=quadM2,b,c,args。但是现在我得到了以下错误: ValueError:没有足够的值来解包预期的2个,得到1个。

使用M1


args元组应该与使用*语法传递给M1的元组类似。

请在问题中包含完整的回溯,即完整的错误消息。它将显示哪一行触发了错误。我怀疑问题出在*参数中,该参数作为*args传递给quad。args应该是元组,而不是扩展元组。可以在函数中使用*args。回顾一下使用args=…,…我确实使用了args=,并且它起了作用。第二点注意,对于我的额外问题,您是否有一个anwser?您的函数需要args中的2个值,tau,M0=args。这意味着四元组调用应该看起来像四元组m2,b,c,tau,M0。是的,我在你第一次评论后意识到了这一点,只是我没有进一步更新。
In [202]: M1(0,1,1)
Out[202]: 1.9999999999999996
In [203]: integrate.quad(M1,0,1,(1,1))
Out[203]: (2.0, 2.220446049250313e-14)
In [204]: M1(0,*(1,1))
Out[204]: 1.9999999999999996