1. 程式人生 > >二重積分的C語言實現

二重積分的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]

當然,這裡面影響定積分的精度的主要因素就是N的大小,N越大,計算結果越接近真實值, 但同時,N越大,計算時間也就越長。(溫馨提示,筆者在計算 f(x,y) = x + y 的時候取 【0,1】*【0,1】的區間,在N取到1000000000(十億)的時候,頂配的MBP算了十幾分鍾也沒算出來,面板燙到和用FCP剪視訊差不多的溫度,這個故事告訴我們,精度與速度不可兼得)

下面是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)

由於膝上型電腦運算能力導致的運算時間的限制,我不得不降低了精讀,如果使用更加專業的工具,或許就能在提高精度的同時提高速度了。