不同的方法最大区别在于公式的不同/矩形区域的不同,依据公式而定,需要什么代码你可以自己进行更改,很简单。
本文代码为不严格代码,最严格的代码为先判断连续性。当你需要对大量函数积分(懒得写函数连续性检测的时候)可以使用本文代码用try…except…不严格替代。
看不懂公式的可以去 CSDN 查看图片。
- Simpson积分法:
\(\int _ { a } ^ { b } f ( x ) d x \approx \frac { ( b – a ) ( f ( a ) + f ( b ) + 4 f ( \frac { a + b } { 2 } ) ) } { 6 }\)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def calculate_integral(begin, end, func, epsilon): n = 1 result = 0 preResult = float("inf") while abs(preResult - result) > epsilon: preResult = result result = 0 n *= 2 between = (end - begin) / n for i in range(n): try: a = begin + i * between b = begin + (i + 1) * between result += between * (func(a) + func(b) + 4 * func((a + b) / 2)) / 6 except: return "Integrated function has discontinuity or does not defined in current interval" return result |
- 右矩形积分公式
\(\int _ { a } ^ { b } f ( x ) d x = \lim _ { n \rightarrow \infty } \sum _ { i = 1 } ^ { n } \frac { b – a } { n } f ( a + \frac { b – a } { n } i )\)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def calculate_integral(begin, end, func, epsilon): n = 1 result = 0 preResult = float("inf") while abs(preResult - result) > epsilon: preResult = result result = 0 n *= 2 for i in range(n): try: result += (end - begin) / n * func(begin + (end - begin) / n * (i + 1)) except: return "Integrated function has discontinuity or does not defined in current interval" return result |
- 左矩形积分公式
\(\int _ { a } ^ { b } f ( x ) d x = \lim _ { n \rightarrow \infty } \sum _ { i = 1 } ^ { n } \frac { b – a } { n } f ( a + \frac { b – a } { n } (i – 1) )\)
- 中矩形积分公式
\(\int _ { a } ^ { b } f ( x ) d x = \lim _ { n \rightarrow \infty } \sum _ { i = 1 } ^ { n } \frac { b – a } { n } f ( a + \frac { (b – a)} { 2 n }(2i – 1 ) )\)
- 梯形积分公式
\(\int _ { a } ^ { b } f ( x ) d x = \lim _ { n \rightarrow \infty } \sum _ { i = 1 } ^ { n } \frac { b – a } { 2n } (f ( a + \frac { b – a } { n }( i – 1) ) + f ( a + \frac { b – a } { n } i ))\)