C语言实现二重积分

想到求二重积分,我们可能第一下想到的是先对其中的一个变量进行积分,同时将另外一个变量看成常数,之后再对第二个变量进行积分,笔者高中的教材上就这这么写的。

但是对于计算机来说,实现不定积分是一件很困难的事情,于是这条“人类的方法”在计算机上面就行不通了,但是别急,我们可别忘了积分最原始的定义——分割 、 求和 、 取极限

我们先来复习一下二重积分的定义:

\iint_{D}^{ }f(x,y)dxdy=\lim_{N\rightarrow \infty }\left[\sum_{i=0}^{N}f(x_{i},y_{i})\bigtriangleup x\bigtriangleup y\right]

对于一重积分的情况,请参见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;
}

下面是终端运行的情况,注意在这里笔者取了两个积分区间,其中

D_{1}=\left \{ (x,y)|x\in [1.5 , 3],y\in [2 , 4.5] \right \},N_{1}=10000 ,

D_{2}=\left \{ (x,y)|x\in [0 , 1] , y\in [0 , 1]\right\},N_{2}=100000

对于至于为什么不取上面代码里面的十亿,看第四段。

对于D1:(真实值应该是20.625)

对于D2:(真实值应该是1)

由于笔记本电脑运算能力导致的运算时间的限制,我不得不降低了精读,如果使用更加专业的工具,就能在提高精度的同时提高速度了。

猜你喜欢

转载自blog.csdn.net/weixin_42612337/article/details/82894270