使用Simpson的规则

时间:2018-04-21 02:50:10

标签: python numerical-integration continuous-fourier simpsons-rule

我想1.将Simpson的规则表达为python中集成的一般函数,并使用它来计算和绘制函数sin(t)的傅立叶级数系数​​。

我为Simpson规则偷了并改编this code,这似乎可以很好地集成e^t之类的简单函数, sin(t)poly

给定句点period,傅立叶级数系数​​计算如下:

a_k

b_k

其中k = 1,2,3,......

我很难弄清楚如何表达ak。我知道a_k=0,因为这个函数很奇怪,但我希望能够为其他函数计算它。

这是我到目前为止的尝试:

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。

1 个答案:

答案 0 :(得分:1)

如果你想运行自己的积分或傅里叶系数确定而不是使用numpyscipy的内置方法,这是一种方法:

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