根据几何定义使用计算机编程求定积分的值

问题:通过编程,求 ∫ 0 1 x 2 d x \int_{0}^{1} x^2\mathrm{d}x 01x2dx的近似值.
在数学上,这是一道很简单的定积分的题目。使用数学方法,可以进行以下计算:
∫ 1 2 x 2 d x = x 3 3 ∣ 0 1 = 1 3 3 − 0 3 3 = 1 3 = 0.333333... \int_{1}^{2} x^2\mathrm{d}x = \left.\frac{x^3}{3}\right|_0^1=\frac{1^3}{3}-\frac{0^3}{3}=\frac{1}{3}=0.333333... 12x2dx=3x301=313303=31=0.333333...
然而如果使用程序计算,很难按积分的相关公式来进行计算。所以,我们换个思路,直接利用定积分的定义进行求解。

在这里插入图片描述

如上图所示(注:本图由 LaTeX \LaTeX LATEX 的TikZ包绘制,具体方法参见 这里),曲线为函数 y = x 2 y = x^2 y=x2,而 ∫ 1 2 x 2 d x \int_{1}^{2} x^2\mathrm{d}x 12x2dx 的值实际上曲线在[0, 1] 上与 X轴的夹成的区域,即图中阴影区域的面积。为了通用性,设开始点为 x 1 x_1 x1结束点为 x 2 x_2 x2。我们将阴影垂直切分成 n n n份,则每一份的长度为 Δ x \Delta x Δx,其值为
Δ x = ( x 2 − x 1 ) n \Delta x = \frac{(x_2-x_1)}{n} Δx=n(x2x1).
则对于其中一份的面积,可以近似看为一个矩形,高为 f ( x 1 + i Δ x ) f(x_1 + i\Delta x) f(x1+iΔx),宽度为 Δ x \Delta x Δx,即图中蓝色区域,故面积为 f ( x 1 + i Δ x ) Δ x f(x_1 + i\Delta x)\Delta x f(x1+iΔx)Δx。将所有面积求和可得
∑ i = 1 n f ( x i ) Δ x \sum_{i=1}^{n}f(x_i)\Delta x i=1nf(xi)Δx其中 x i = x 1 + i Δ x_i = x_1 + i \Delta xi=x1+iΔ。当 n → ∞ n \rightarrow \infty n 时,可以等于原值,即:
lim ⁡ n → ∞ ∑ i = 1 n f ( x i ) Δ x = ∫ x 1 x 2 f ( x ) d x \lim_{n \rightarrow \infty}\sum_{i=1}^{n}f(x_i)\Delta x = \int_{x_1}^{x_2} f(x) \mathrm{d}x nlimi=1nf(xi)Δx=x1x2f(x)dx
根据这个公式,当 n n n 取得比较大的时候,我们可以很很容易求得比较接近的原值。

不过用矩形计算,由于忽略的面积比较多,如上图所未,红色区域都被忽略了,所以近似度有限(即收敛慢)。为了提高精度,如果我们将矩形改成梯型。如上图的几何含义,计算结果显然会更接近真实值,所以公式可以改为如下:
∑ i = 1 n f ( x i ) + f ( x i + 1 ) 2 Δ x \sum_{i=1}^{n}\frac{f(x_i) + f(x_{i+1})}{2}\Delta x i=1n2f(xi)+f(xi+1)Δx
根据以上分析,对两种计算方式进行了编码实现(见附录一)。
n n n等于10000,可以获得以下两种结果。

result1: 0.33328333499999957
result2: 0.33333333500000084

显然,第二种取梯形的结果更接近真实值。

结论与展望

利用以上公式,我们可以快速求定积分的值,尤其是在函数 y = f ( x ) y = f(x) y=f(x) 比较复杂,使用现有的计算公式难以取得其值的情况下,使用计算机会非常方便。在实际工程计算中,只需要将 n n n取到足够大,即可满足绝大部分的需求。

附一:源代码

public class Integration {
	public static void main(String[] args) {
		double x1 = 0;
		double x2 = 1;
		int interval = 10000;
		double delta = (x2 - x1) / interval;
		double result1 = 0; 
		double result2 = 0;

		// 以矩形进行求和。
		for (int i = 0; i < interval; i++) {
			result1 += f(x1 + delta * i) * delta;
		}
		

		// 以梯形进行求和
		for (int i = 0; i < interval; i++) {
			result2 += (f(x1 + delta * i) + f(x1 + delta * i + delta)) * delta / 2;
		}

		System.out.println("result1: " + result1);
		System.out.println("result2: " + result2);
	}

	static double f(double x) {
		return x * x;
	}
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值