1. 程式人生 > >求解積分的數值方法——Matlab實現

求解積分的數值方法——Matlab實現

求解節分的數值方法

方法主要是以下兩種的實現:

  • 複合梯形公式
  • 複合辛普森公式

實現程式碼見最下方

演算法實現

  • 請採用複合梯形公式與複合辛普森公式,計算 sin(x)/x 在[0, 1]範圍內的積分。取樣點數目為 5、9、17、33。

設計思路

  • 複合梯形公式,利用取樣點,每兩個相鄰的取樣點,利用梯形公式計算其積分,最後將所有小部分的積分加在一起
  • 複合辛普森公式,同樣是利用取樣點,不過每相鄰的取樣點,在中間再取一個點,三點插值計算該部分的積分,最後加起來

數值實驗

  • 複合梯形公式,不同數目取樣點的結果與精確解的關係
    這裡寫圖片描述
  • 複合梯形公式,不同數目取樣點的結果與精確解的關係
    這裡寫圖片描述

結果分析

  • 由複合梯形公式的結果可見,取樣點數越高,所要求的式子所求積分更加接近於精確解
  • 複合辛普森公式則不同,在本道題題目要求下,取樣點越多,一開始越接近精確解,但是當超過一定數目後,遠離精確解

實現程式碼

  • 複合型梯形公式
clear;
format long;
a1 = 0;
b1 = 1;
x = [5,9,17,33];
y(1) = oula(a1, b1, x(1));
y(2) = oula(a1, b1, x(2));
y(3) = oula(a1, b1, x(3));
y(4) = oula(a1, b1, x(4));
for s = 1:4
z(s) = 0.9460831; end y(2,:) = z; plot(x,y); function result = oula(a, b, n) h = (b-a)/n; x = 0.0; for m = 1:n x0 = a + (m-1)*h; x1 = a + m*h; if(x0 == a) y0 = 1; else y0 = (sin(x0))/x0; end y1 = (sin(x1))/x1; x = x + y0 + y1; end
result = x * (h/2); end
  • 複合型辛普森公式
clear;
format long;
a = 0;
b = 1;
x = [5,9,17,33];
y(1) = simpson(a, b, x(1));
y(2) = simpson(a, b, x(2));
y(3) = simpson(a, b, x(3));
y(4) = simpson(a, b, x(4));
for s = 1:4
    z(s) = 0.9460831;
end
y(2,:) = z;
plot(x,y);

function result = simpson(a, b, n)
    h = (b-a)/n;
    y0 = 0.0;
    y1 = 0.0;

    for m = 0:n-1
        x0 = a + m*h;
        x1 = x0 + h/2;
        if(x0 == a) 
            y0 = 1;
        else
            y0 = y0 + (sin(x0))/x0;
        end
        y1 = y1 + (sin(x1))/x1;
    end

    fa = 1;
    fb = (sin(b))/b;
    result = (4*y1 + 2*y0 - fa + fb) * (h/6);
end