繁体   English   中英

使用 for 循环的辛普森规则(数值积分)

[英]Simpson's Rule using for loops (numerical integration)

我正在尝试使用 for 循环在 python 中编写辛普森规则,但我不断收到断言错误并且无法找出原因。

def integrate_numeric(xmin, xmax, N):
    xsum = 0
    msum = 0
    h = (xmax-xmin)//N

    for i in range(0, N):
        xsum += f(xmin + i*h)
        print (xsum)

    for i in range(0,N-1):
        msum += f(xmin + (h/2) + i*h)    
        print (msum)

    I = (h/6) * (f(xmin) + 4*(msum) + 2*(xsum) + f(xmax))
    return I

F:

def f(x):
    return (x**2) * numpy.sin(x)

样本:

assert numpy.isclose(integrate_numeric(xmin=0, xmax=4, N=50), 1.096591)

这是您的代码的固定版本:

import numpy

def integrate_numeric(xmin, xmax, N):
    '''                                                                                                                               
    Numerical integral of f from xmin to xmax using Simpson's rule with                                                               
        N panels.                                                                                                                     
    '''
    xsum = 0
    msum = 0
    h = (xmax-xmin)/N

    for i in range(1, N):
        xsum += f(xmin + i*h)
        print(xsum)

    for i in range(0, N):
        msum += f(xmin + (h/2) + i*h)
        print(msum)

    I = (h/6) * (f(xmin) + 4*msum + 2*xsum + f(xmax))
    return I


def f(x):
    '''Function equivalent to x^2 sin(x).'''
    return (x**2) * numpy.sin(x)


assert numpy.isclose(integrate_numeric(xmin=0, xmax=4, N=50), 1.096591)

笔记:

  • 两个for循环中的范围已更改:我们希望第一个for循环到 go 从xmin + hxmin + (N-1)*hh为步长(所以N-1总值),第二个 for从xmin + h/2循环到 go 到xmin + (N-1)*h + h/2 ,步长为hN个总值)。
  • 在最终计算中,无需将f应用于msumxsum :这些值已经是f值的总和。 我们仍然需要评估f的唯一地方是xminxmax (注意:这已经在对问题的编辑中得到修复。)
  • h = (xmax-xmin)//N需要为h = (xmax-xmin)/N 您只需要这里的常规分区,而不是地板分区。 这可能是您最初得到零的原因: h本来是0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM