【发布时间】:2019-03-13 17:57:51
【问题描述】:
我编写了以下函数,用于使用辛普森规则估计函数的定积分:
def fnInt(func, a, b):
if callable(func) and type(a) in [float] and type(b) in [float]:
if a > b:
return -1 * fnInt(func, b, a)
else:
y1 = nDeriv(func)
y2 = nDeriv(y1)
y3 = nDeriv(y2)
y4 = nDeriv(y3)
f = lambda t: abs(y4(t))
k = f(max(f, a, b))
n = ((1 / 0.00001) * k * (b - a) ** 5 / 180) ** 0.25
if n > 0:
n = math.ceil(n) if math.ceil(n) % 2 == 0 else math.ceil(n) + 1
else:
n = 2
x = (b - a) / n
ans = 0
for i in range(int((n - 4) / 2 + 1)):
ans += (x / 3) * (4 * func(a + x * (2 * i + 1)) + 2 * func(a + x * (2 * i + 2)))
ans += (x / 3) * (func(a) + 4 * func(a + x * (n - 1)) + func(b))
return ans
else:
raise TypeError('Data Type Error')
然而,似乎每当我尝试使用此功能时,都需要很长时间才能产生输出。有没有办法可以重写这段代码以减少时间?
【问题讨论】:
-
你有没有尝试过分析,看看大部分时间是什么?
-
嗨迈克尔,你可能想把这个 Q 放到下面:codereview.stackexchange.com
-
如果你是出于“严肃”的目的而不是自学 Python,你应该使用 SciPy 而不是自己编写。他们的实现使用 NumPy 数组,速度会更快。
标签: python python-3.x integral simpsons-rule