二重積分的C語言實現
阿新 • • 發佈:2018-12-31
想到求二重積分,我們可能第一下想到的是先對其中的一個變數進行積分,同時將另外一個變數看成常數,之後再對第二個變數進行積分,筆者高中的教材上就這這麼寫的。
但是對於計算機來說,實現不定積分是一件很困難的事情,於是這條“人類的方法”在計算機上面就行不通了,但是別急,我們可別忘了積分最原始的定義——分割 、 求和 、 取極限
我們先來複習一下二重積分的定義:
當然,這裡面影響定積分的精度的主要因素就是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; }
下面是終端執行的情況,注意在這裡筆者取了兩個積分割槽間,其中
,
對於至於為什麼不取上面程式碼裡面的十億,看第四段。
對於D1:(真實值應該是20.625)
對於D2:(真實值應該是1)
由於膝上型電腦運算能力導致的運算時間的限制,我不得不降低了精讀,如果使用更加專業的工具,或許就能在提高精度的同時提高速度了。