想到求二重积分,我们可能第一下想到的是先对其中的一个变量进行积分,同时将另外一个变量看成常数,之后再对第二个变量进行积分,笔者高中的教材上就这这么写的。
但是对于计算机来说,实现不定积分是一件很困难的事情,于是这条“人类的方法”在计算机上面就行不通了,但是别急,我们可别忘了积分最原始的定义——分割 、 求和 、 取极限
我们先来复习一下二重积分的定义:
对于一重积分的情况,请参见https://blog.csdn.net/weixin_42612337/article/details/82829351
当然,这里面影响定积分的精度的主要因素就是N的大小,N越大,计算结果越接近真实值, 但同时,N越大,计算时间也就越长。(温馨提示,笔者在计算 f(x,y) = x + y 的时候取 【0,1】*【0,1】的区间,在N取到1000000000(十亿)的时候,6W大洋顶配的MBP算了十几分钟也没算出来,面板烫到怀疑人生,这个故事告诉我们,精度与速度不可兼得)
下面是C代码:
//
// main.c
// double_integral
//
// Created by Wayne on 2018/9/29.
// Copyright © 2018 Wayne. All rights reserved.
//
#include <stdio.h>
#include <math.h>
long double function(long double x , long double y); //这里声明被积函数
int main(void)
{
unsigned long long N = 1000000000; //强烈建议把N取小一点 , 十亿实在算的太慢了
unsigned long long i , j;
long double V;
long double a , b , c , d;
scanf("%Lf %Lf %Lf %Lf" , &a , &b , &c , &d);
for (j = 0 ; j <= N ; j++)
{
for (i = 0 ; i <= N ; i++)
{
V += ((b - a) * (d - c) / (N * N)) * function((a + ((b - a) / N) * i) , (c + ((d - c) / N) * j));
}
}
printf("%Lf\n" , V);
return 0;
}
long double function(long double x , long double y) //这里定义被积函数
{
long double z = x + y; //我们取 f(x,y) = x + y 这个简单的情形为例
return z;
}
下面是终端运行的情况,注意在这里笔者取了两个积分区间,其中
,
对于至于为什么不取上面代码里面的十亿,看第四段。
对于D1:(真实值应该是20.625)
对于D2:(真实值应该是1)
由于笔记本电脑运算能力导致的运算时间的限制,我不得不降低了精读,如果使用更加专业的工具,就能在提高精度的同时提高速度了。