求函数在 a 到 b 范围内的面积
Find the area under a function in the range from a to b
对于作业,我试图在 a
到 b
、[a,b]
.
范围内找到面积函数 F(X)
使用微积分,这不会那么难。我确实根据微积分定理来找到这个区域,并围绕它工作以达到代码的某些部分,如下所示:
注意:我正在使用 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):
到
def integrate(f, a, b, tolerance_level):
对 simpleIntegrate
进行了类似的更改,并对调用 integrate
或 simpleIntegrate
的行进行了适当的调整。生成的函数将更加灵活。除其他外,它将允许集成函数作为匿名函数传递。
2) 您正在实施的算法适用于大多数积分,但对某些积分来说却失败了。进行我上面推荐的调整后,
>>> def f(x): return 150*x*(1-x)*(x+1)**2
>>> integrate(f,-1,1,0.001)
0.0
但答案应该在 40 左右。仅仅因为一个函数在端点和中点取相同的值,并不意味着函数是常量,但这个算法实际上假设它是.另一方面,您的算法 确实 适用于大多数函数和大多数时间间隔,因此如果您被告知以这种方式实现它,我不会太担心它。
对于作业,我试图在 a
到 b
、[a,b]
.
F(X)
使用微积分,这不会那么难。我确实根据微积分定理来找到这个区域,并围绕它工作以达到代码的某些部分,如下所示:
注意:我正在使用 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):
到
def integrate(f, a, b, tolerance_level):
对 simpleIntegrate
进行了类似的更改,并对调用 integrate
或 simpleIntegrate
的行进行了适当的调整。生成的函数将更加灵活。除其他外,它将允许集成函数作为匿名函数传递。
2) 您正在实施的算法适用于大多数积分,但对某些积分来说却失败了。进行我上面推荐的调整后,
>>> def f(x): return 150*x*(1-x)*(x+1)**2
>>> integrate(f,-1,1,0.001)
0.0
但答案应该在 40 左右。仅仅因为一个函数在端点和中点取相同的值,并不意味着函数是常量,但这个算法实际上假设它是.另一方面,您的算法 确实 适用于大多数函数和大多数时间间隔,因此如果您被告知以这种方式实现它,我不会太担心它。