MATlAB运用——数值积分

简介: MATlAB运用——数值积分

实验一

分别利用变步长复化梯形公式、变步长复化Simpson公式和复化Guass-Legendre I型公式计算下列式子,要求绝对误差限为0.5image.png,并比较每种算法的计算时间。

image.png


1、思路

1.1、变步长复化梯形公式和变步长Simpson公式,是在实际计算时,将区间逐次分半计算(每分一次就进行一次计算),并利用结果来判断误差的大小。

对于变步长复化梯形公式,有

image.png

1.2、以上两种,实际上限定了求积公式的精度。若以求公式的代数精度达到最大值的原则去选取求积节点和求出相应的求积系数,那就是Gauss求积公式。以Gauss-Legendre I型求积公式为例子,在区间[a,b]的复化积分公式为:

image.png

2、程序

function test_4_1
%分别利用变步长复化梯形公式、变步长复化Simpson公式、复化Gauss-Legendre I型公式计算。
% 绝对误差限为1/2*10^(-7)
% 将计算结果与精确解作比较,并比较各种算法的运行时间
promps={'选择积分公式,若用变步长复化梯形公式,输入T;用复化Simpson公式,输入S;用复化Gauss_Legendre,输入GL'};
Nb=char(inputdlg(promps,'text_4_1',1,{'T'}));
if (Nb~='T'& Nb~='S'& Nb~='GL')
    errordlg('积分公式选择错误!');
    return;
end
Nb_f=str2num(char(inputdlg('输入积分式子题号1-4:','text_4_1',1,{'1'})));
if(Nb_f<1'&&Nb_f>4)
    errordlg('没有该积分式子');
    return;
end
switch Nb_f
    case 1
        fun=@(x)-2./(x.^2-1);a=2;b=3;
    case 2
        fun=@(x)4./(1+x.^2);a=0;b=1;
    case 3
        fun=@(x)3.^x;a=0;b=1;
    case 4
        fun=@(x)x.*exp(x);a=1;b=2;
end
r=0.5e-7;%误差
if (Nb=='T')%变步长复化梯形公式
    tic;
    t=(fun(a)+fun(b))*(b-a)/2;
    t0=0;
    k=1;
    while abs(t-t0)>=3*r%用区间逐次分半求积分,T2n-Tn<3r
        h=(b-a)/(2^k);
        t0=t;
        t=(fun(a)+fun(b))*h/2+h*sum(fun(a+h:h:b-h));
        k=k+1;
    end
    time=toc;
elseif (Nb=='S')%变步长复化Simpson公式
    tic;
    [t,iter]=quad(fun,a,b,r);%quad()函数是MATLAB自带的Simpson自适应函数
    time=toc;
elseif (Nb=='GL')%复化Gauss-Legendre I型公式
    tic;
    promps={'请输入用复化Gauss-Legendre I型公式应取的步长:'};
    h=str2num(char(inputdlg(promps,'test 4-1',1,{'0.01'})));
    N=(b-a)/h;t=0;
    for k=1:N-1
        xk=a+k*h+h/2;
        t=t+fun(xk-h/(2*sqrt(3)))+fun(xk+h/(2*sqrt(3)));
    end
    t=t*h/2;
    time=toc;
end
fprintf('方程(%s)的计算结果:%.10f\n',Nb,t);
switch Nb_f
    case 1
        result=log(2)-log(3);
        fprintf('精确解:ln2-ln3=%.10f\n',result);
        disp(['绝对误差:',num2str(abs(t-result))]);
        disp(['运行时间:',num2str(time)]);
    case 2
        result=pi;
        fprintf('精确解:Π=%.10f\n',result);
        disp(['绝对误差:',num2str(abs(t-result))]);
        disp(['运行时间:',num2str(time)]);
    case 3
        result=2/log(3);
        fprintf('精确解:2/log(3)=%.10f\n',result);
        disp(['绝对误差:',num2str(abs(t-result))]);
        disp(['运行时间:',num2str(time)]);
    case 4
        result=exp(2);
        fprintf('精确解:exp(2)=%.10f\n',result);
        disp(['绝对误差:',num2str(abs(t-result))]);
        disp(['运行时间:',num2str(time)]);
end

3、运行结果

从结果可看出,精度最高的是Guass-Legendre I型公式,且步长取得越小,绝对误差越小,但是相应所花费的时间越长。而计算时间最短的是变步长梯形公式,但是其绝对误差三者中最大。

绝对误差:Guass-Legendre I型公式<变步长Simpson公式<变步长复化梯形公式
计算时间:变步长复化梯形公式<变步长Simpson公式<Guass-Legendre I型公式


实验二

利用复化Simpson公式和变步长复化Simpson公式计算下列定积分,并比较这两种算法所需的节点数和计算时间,要求绝对误差限为0.5image.png

image.png

1、思路

复化Simpson公式:

image.png

变步长复化Simpson公式如实验一,在MATLAB中可以调用库函数quad()

2、程序

function test_4_1
promps={'选择积分公式,用复化Simpson公式,输入S;用变步长复化Simpson公式,输入VS'};
Nb=char(inputdlg(promps,'text_4_2',1,{'S'}));
if (Nb~='S'& Nb~='VS')
    errordlg('积分公式选择错误!');
    return;
end
Nb_f=str2num(char(inputdlg('输入积分式子题号1-3:','text_4_2',1,{'1'})));
if(Nb_f<1 &&Nb_f>3)
    errordlg('没有该积分式子');
    return;
end
switch Nb_f
    case 1
        fun=@(x)(x.^6/10)-x.^2+x;a=0;b=2;
    case 2
        fun=@(x)x.*sqrt(x);a=0;b=1;
    case 3
        fun=@(x)1./sqrt(x);a=5;b=200;
end
r=0.5e-7;%误差
if (Nb=='S')%复化Simpson公式
    tic;
    promps={'请输入用复化Simpson公式应取的步长:'};
    h=str2num(char(inputdlg(promps,'test 4-2',1,{'0.01'})));
    N=(b-a)/h;t1=0;t2=0;
    for k=0:N-1
        xk=a+k*h+h/2;
        t1=t1+fun(xk);
    end
    for k=1:N-1
        xk=a+k*h;
        t2=t2+fun(xk);
    end
    t=(1+fun(b)+4*t1+2*t2)*h/6;
    n=2*N+1;
    time=toc;
elseif (Nb=='VS')%变步长复化Simpson公式
    tic;
    [t,iter]=quad(fun,a,b,r);
    n=2*iter+1;
    time=toc;
end
fprintf('方程(%s)的计算结果:\n',Nb);
if (Nb=='S')
    fprintf('用复化Simpson公式,所需的节点数:%d,求得的近似值:%.10f,运行时间:%.5f\n',n,t,time);
elseif(Nb=='VS')
    fprintf('用变步长复化Simpson公式,所需的节点数:%d,求得的近似值:%.10f,运行时间:%.5f\n',n,t,time);
end

3、运行结果

目录
相关文章
|
1月前
|
算法 C++ Windows
基于离散差分法的复杂微分方程组求解matlab数值仿真
本程序使用离散差分法求解复杂微分方程组,将连续微分方程转化为差分方程,采用一阶显式时间格式和一阶偏心空间格式。经MATLAB2022a测试验证有效。
|
2月前
|
算法 C++ Windows
基于离散差分法的复杂微分方程组求解matlab数值仿真
本程序基于离散差分法求解复杂微分方程组,将连续微分方程转化为差分方程,采用一阶显式时间格式和一阶偏心空间格式。在MATLAB2022a上测试通过,展示了运行结果。
|
存储
专题一MATLAB基础知识——1.2数值数据
专题一MATLAB基础知识——1.2数值数据
140 0
MATLAB快速入门(一):数值数据和字符串
MATLAB快速入门(一):数值数据和字符串
80 0
|
算法
基于实时迭代的数值鲁棒NMPC双模稳定预测模型(Matlab代码实现)
基于实时迭代的数值鲁棒NMPC双模稳定预测模型(Matlab代码实现)
153 0
|
数据采集 监控 定位技术
【状态估计】基于增强数值稳定性的无迹卡尔曼滤波多机电力系统动态状态估计(Matlab代码实现)
【状态估计】基于增强数值稳定性的无迹卡尔曼滤波多机电力系统动态状态估计(Matlab代码实现)
122 0
|
存储 人工智能 NoSQL
MATLAB 之 数值数据,矩阵的表示和变量及其操作
MATLAB 数据类型较为丰富,既有数值型、字符串等基本数据类型,又有结构(Structure)、单元(Cell)等复杂的数据类型。 在 MATLAB 中,没有专门的逻辑型数据,而以数值 1 (非零)表示真,以数值 0 表示假。 MATLAB 各种数据类型都以矩阵形式存在,所以矩阵是 MATLAB 最基本的数据对象形式。
|
计算机视觉
MATLAB数值运算(六)
MATLAB数值运算(六)
135 0
|
机器学习/深度学习 传感器 算法
基于matlab求Prandtl-Meyer膨胀波流场数值解
基于matlab求Prandtl-Meyer膨胀波流场数值解

热门文章

最新文章