我想1.将Simpson的规则表达为python中集成的一般函数,并使用它来计算和绘制函数的傅立叶级数系数。
我为Simpson规则偷了并改编this code,这似乎可以很好地集成之类的简单函数, 或
其中k = 1,2,3,......
我很难弄清楚如何表达。我知道,因为这个函数很奇怪,但我希望能够为其他函数计算它。
这是我到目前为止的尝试:
import matplotlib.pyplot as plt
from numpy import *
def f(t):
k = 1
for k in range(1,10000): #to give some representation of k's span
k += 1
return sin(t)*sin(k*t)
def trapezoid(f, a, b, n):
h = float(b - a) / n
s = 0.0
s += f(a)/2.0
for j in range(1, n):
s += f(a + j*h)
s += f(b)/2.0
return s * h
print trapezoid(f, 0, 2*pi, 100)
这根本没有给出0的正确答案,因为它随着k的增加而增加,并且我确定我在for循环方面接近隧道视觉。我的困难尤其在于陈述函数以便k被读为k = 1,2,3,...
遗憾的是,我给出的问题并没有说明要对哪些系数进行绘图,但我认为这意味着要反对k。
答案 0 :(得分:1)
如果你想运行自己的积分或傅里叶系数确定而不是使用numpy
或scipy
的内置方法,这是一种方法:
import numpy as np
def integrate(f, a, b, n):
t = np.linspace(a, b, n)
return (b - a) * np.sum(f(t)) / n
def a_k(f, k):
def ker(t): return f(t) * np.cos(k * t)
return integrate(ker, 0, 2*np.pi, 2**10+1) / np.pi
def b_k(f, k):
def ker(t): return f(t) * np.sin(k * t)
return integrate(ker, 0, 2*np.pi, 2**10+1) / np.pi
print(b_k(np.sin, 0))
这给出了结果
0.0
另一方面,梯形积分对于均匀时间间隔并不是非常有用。但如果你愿意:
def trap_integrate(f, a, b, n):
t = np.linspace(a, b, n)
f_t = f(t)
dt = t[1:] - t[:-1]
f_ab = f_t[:-1] + f_t[1:]
return 0.5 * np.sum(dt * f_ab)
如果您想使用预内置功能,还有np.trapz
。同样,还有scipy.integrate.trapz