- C语言积分
- Trapezoidal Rule
- Simpson's Rule
- 参考文档
标准C语言的积分好像很难,至少收集资料前是这么想的,当收集完资料,看到各位前辈的介绍,又重拾信心,梳理记录一下,以备后用吧。翻了翻参考文献,打底利用数值计算的方法都是利用微积分的思维,小图像累加求和来做的。实用的算法分为梯形算法(Trapezoidal Rule)和辛普森算法(Simpson’s Rule),那么区别和性能呢?本文的图形都来自文献Integration
相对于上图的样条矩形,肉眼可见的误差很大,真实面积更大,如何减小误差,直接连接插值点,矩形就变成梯形了
很明显,误差小了,计算公式
S
=
δ
x
2
(
y
0
+
y
1
+
y
1
+
y
2
.
.
.
+
y
4
+
y
5
)
S=frac{delta x}{2}(y_0+y_1+y_1+y_2...+y_4+y_5)
S=2δx(y0+y1+y1+y2...+y4+y5)
引申一下,假设这个函数为
f
(
x
)
f(x)
f(x)积分范围
a
−
b
a-b
a−b,把这个积分面积分成
n
n
n份,采样点
n
+
1
n+1
n+1。则积分(面积)可以表达为:
∫
a
b
f
(
x
)
=
b
−
a
2
∗
n
(
f
(
a
)
+
2
∗
∑
k
=
1
n
−
1
f
(
x
k
)
+
f
(
b
)
)
int_a^b f(x)=frac{b-a}{2*n}(f(a)+2*sum_{k=1}^{n-1}f(x_k)+f(b))
∫abf(x)=2∗nb−a(f(a)+2∗k=1∑n−1f(xk)+f(b))
这个规则就是认为利用抛物线来拟合边界会带来更好的结果,
∫
a
b
f
(
x
)
=
δ
x
3
(
y
0
+
4
y
1
+
2
y
2
+
4
y
3
+
2
y
4
+
4
y
5
+
y
6
)
int_a^b f(x)=frac{delta x}{3}(y_0+4y_1+2y_2+4y_3+2y_4+4y_5+y_6)
∫abf(x)=3δx(y0+4y1+2y2+4y3+2y4+4y5+y6)
这个规则要求
n
n
n必须是偶数,一般公式为:
∫
a
b
f
(
x
)
=
δ
x
3
(
y
0
+
2
∑
y
e
v
e
n
+
4
∑
y
o
l
d
+
y
n
)
int_a^b f(x)=frac{delta x}{3}(y_0+2sum y_{even}+4sum y_{old}+y_n)
∫abf(x)=3δx(y0+2∑yeven+4∑yold+yn)
看到这个公式有点懵,不知从哪里来的,那先了解一下抛物线(parabolas)的面积公式,有幸搜到一篇博文可视化微积分:一种全新的视野解释抛物线的面积,大致上就是说围成抛物线的面积等于外围矩形面积的
1
/
3
o
r
2
/
3
1/3 or 2/3
1/3or2/3,那要看怎么看了,上面就是把每条分成矩形和一个抛物线形,两个面积累加,上式采用
1
/
3
s
t
e
p
t
o
2
/
3
1/3 step to 2/3
1/3 stepto 2/3 的方法,得到了这个规则公式,推导上图片吧,不码公式了。
这就提供了简单的积分运算的数值方法。可以利用c最基本的库来实现积分了。当然还是有误差的,参考文档里有几个现成的实例。
GNU Scientific Library
Numerical Integration Using Trapezoidal Method C Program
C library for Numerical Integration
Numerical integration
Numerical Recipes:The Art of Scientific Computing
Simpson’s Rule (辛普森法则)
Integration
可视化微积分:一种全新的视野解释抛物线的面积



