求解积分的数值方法——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

猜你喜欢

转载自blog.csdn.net/qq_36312878/article/details/80945704
今日推荐