Simpson与Python的集成:Can';无法获得预期的输出

Simpson与Python的集成:Can';无法获得预期的输出,python,integration,intervals,convergence,simpsons-rule,Python,Integration,Intervals,Convergence,Simpsons Rule,我已经实现了这个偶数()&simpson(),但是无法获得所需的输出。其次,获取错误([lambda x:1/x,1,11,6]])ZeroDivisionError:division by zero,无法理解此错误 import math import matplotlib import matplotlib.pyplot as plt import numpy as np def even(x): if x % 2 == 0: return 2 else:

我已经实现了这个
偶数()
&
simpson()
,但是无法获得所需的输出。其次,获取错误
([lambda x:1/x,1,11,6]])ZeroDivisionError:division by zero
,无法理解此错误

import math
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

def even(x):
    if x % 2 == 0:
        return 2
    else:
        return 4

def simpson(fn,a,b,n):
    ans = 0

    for x in range(1, n):
        ans = ans + even(x) * fn(x)
    return ((b - a) / (3 * n)) * (ans + fn(0) + fn(n))

    

if __name__ == "__main__":
    """
    The code in "__main__" is not being graded, but a tool for you to test 
    your code outside of the `test_a8.py`. Feel free to add print statements. 
    """

    data = [[lambda x:3*(x**2)+1, 0,6,2],
            [lambda x:x**2,0,5,6],
            [lambda x:math.sin(x), 0,math.pi, 4],
            [lambda x:1/x, 1, 11, 6]]

    for d in data:
        f,a,b,n = d
        print(simpson(f,a,b,n))

    t = np.arange(0.0, 10.0,.1)
    fig,ax = plt.subplots()
    s = np.arange(0,6.1,.1)
    ax.plot(t, (lambda t: 3*(t**2) + 1)(t),'g')
    plt.fill_between(s,(lambda t: 3*(t**2) + 1)(s))
    ax.grid()
    ax.set(xlabel ="x", ylabel=r"$f(x)=3x^2 + 1$",
        title = r"Area under the curve $\int_0^6\,f(x)$")

    plt.show()
我正在尝试这样的预期输出

222.0
41.66666666666667
2.0045597549844207
2.4491973405016885

我是否正确地将第三个数字解释为包括终点在内的总分计数?如果是,请执行以下操作。您使
偶数
函数太重(不需要if,只需要整数计算)。代码的主要问题是,只在整数点上循环
x
,并从零开始(当然,参数
a
b
应该是边界)


不要期望你提供的输出。您应该为每个范围指定至少30-50个点,以使结果接近准确,2-6太小。如果使用100分,结果将接近预期。

欢迎使用SO。请正确格式化您的代码。@miquelvir不说“请正确格式化您的代码”,您可以通过提问来演示它是如何完成的。至少,你应该指向OP,这样他们知道当你说“正确格式化”时该怎么做@Raza我为你格式化了你的问题。请看一下Stack Overflow的降价语法是如何工作的,以及如何很好地格式化您的问题。请不要回滚对格式的更改—您的问题更具可读性,因此如果格式正确,可能会得到有用的答案。@PranavHosangadi true,我对0除错误的看法,
lambda x:1/x,1,11,6
x=0
时中断,因为1/0是无穷大的。
import math
import numpy as np

def simpson(fn,a,b,n):
    # n = n + 2 # uncomment this line if only inner points are included in n
    ans = sum((2-i%2)*fn(x) for i,x in enumerate(np.linspace(a,b,n)[1:-1]))
    return ((b - a) / (3 * n)) * (fn(a) + 2*ans + fn(b))

data = [[lambda x:3*(x**2)+1, 0,6,2],
        [lambda x:x**2,0,5,6],
        [lambda x:math.sin(x), 0,math.pi, 4],
        [lambda x:1/x, 1, 11, 6]]

for d in data:
    f,a,b,n = d
    print(simpson(f,a,b,n))