在从a到b的范围内找到函数下的区域



对于分配,我试图在从 ab的范围之间找到区域函数 F(X)[a,b]

使用微积分,这并不难。我确实将其基于微积分定理以找到该区域,并围绕它围绕它到达代码的某些部分,例如:

注意:我正在使用f = x**2进行测试。

def integrate(a,b,tolerance_level):
    firsttrapezoid = simpleIntegrate(a,b)
    secondtrapezoid = simpleIntegrate(a,b/2) + simpleIntegrate(b/2,b)
    error_range = abs(firsttrapezoid - secondtrapezoid)
    if error_range < tolerance_level:
        return secondtrapezoid
    else:
        return integrate(a, b/2, tolerance_level/2) + integrate(b/2, b, tolerance_level/2)
def simpleIntegrate(a,b):
    return (b-a)*(f(a)+f(b))/2
def f(x):
    f = x**2
    return f
result = integrate(0,5,0.0001)
print(result)

问题是,我应该得到一个值约41的值,但是我得到的值约为44。

b/2更改为a和b之间的中点,即 (a+b)/2

def integrate(a, b, tolerance_level):
    firsttrapezoid = simpleIntegrate(a, b)
    secondtrapezoid = simpleIntegrate(a, (a + b) / 2) + simpleIntegrate((a + b) / 2, b)
    error_range = abs(firsttrapezoid - secondtrapezoid)
    if error_range <= tolerance_level:
        return secondtrapezoid
    else:
        return integrate(a, (a + b) / 2, tolerance_level / 2) + integrate((a + b) / 2, b, tolerance_level / 2)

def simpleIntegrate(a, b):
    return (b - a) * (f(a) + f(b)) / 2

def f(x):
    f = x ** 2
    return f

def intf(x):
    int_f = (x ** 3) / 3
    return int_f

a = 0
b = 5
tolerance = 0.0001
result = integrate(a, b, tolerance)
exactly = intf(b) - intf(a)
error = abs(exactly-result)
print("aprox: {approx} exactly: {exactly} error:{error} max error:{max_error}"
      .format(approx=result, exactly=exactly, error=error, max_error=tolerance))

输出:

aprox: 41.66668653488159 exactly: 41.666666666666664 error:1.9868214927498684e-05 max error:0.0001

@eyllanesc(以及@joanolo)指出了中点计算中的错误。

另外两个言论:

1)在f中用力线作为函数的全局名称是差的设计。如果一个人想作为单个计算的一部分集成两个或多个功能怎么办?您的方法会迫使他们反复重新定义f,这将是不便的。相反,我建议更改

def integrate(a, b, tolerance_level):

to

def integrate(f, a, b, tolerance_level):

具有与simpleIntegrate相似的更改,并对调用integratesimpleIntegrate的行进行了适当的调整。所得功能将更加灵活。除其他外,它将允许将功能集成为匿名函数。

2)您正在为大多数积分实现的算法,但对于某些人来说,算法失败了。进行调整后,我在上面建议,

>>> def f(x): return 150*x*(1-x)*(x+1)**2
>>> integrate(f,-1,1,0.001)
0.0

,答案应大约为40。仅仅因为一个函数在端点处具有相同的值,在中点下,函数并不是函数是恒定的,但是该算法实际上假定是。另一方面,您的算法确实适用于大多数函数和大多数间隔,因此,如果您被告知要以这种方式实施它,我不会担心太多。

相关内容

  • 没有找到相关文章

最新更新