【发布时间】:2017-05-02 05:33:32
【问题描述】:
我正在尝试用 numpy 做傅里叶级数。我正在尝试编写定义为here
的函数但我在定义 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: integer argument expected, got float
根据要求,追溯错误:
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
额外问题:如何将组合函数传递给 quad?例如:M1(t, *args) * np.cos(omega * t)?我是否必须将它定义为一个新函数,然后将其传入或者是否有更快的方法?因为我觉得输入 4 个额外的函数有点多余。
更新:
我意识到我一直在传递错误的其他论点。
我将i2, err2 = quad(M2, b, c, *args) 更改为i2, err2 = quad(M2, b, c, args)。但是现在我收到以下错误:
ValueError: not enough values to unpack (expected 2, got 1).
【问题讨论】:
-
请在问题中包含完整的回溯(即完整的错误消息)。它将显示哪一行触发了错误。
-
我怀疑问题出在
*parameters,它作为*args传递给quad。args应该是一个元组,而不是一个扩展的。在你的函数中使用*args是可以的。查看使用args=(...,...)。 -
我确实使用了 args=() 并且它有效。另外,您可能对我的额外问题有答案吗?
-
您的函数需要
args、tau, M0 = args中的两个值。这意味着quad调用应该类似于quad(M2, b, c, (tau, M0))。