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、运行结果

目录
相关文章
|
存储 Serverless
MATLAB实战 | 梯形积分法
在科学实验和工程应用中,函数关系往往是不知道的,只有实验测定的一组样本点和样本值,这时就无法使用integral函数计算其定积分。
790 1
|
4月前
|
决策智能 Python
【高阶系统固定时间一致性追踪】固定时间一致性跟踪控制:高阶积分器多智能体系统研究(Matlab代码、Simulink仿真实现)
【高阶系统固定时间一致性追踪】固定时间一致性跟踪控制:高阶积分器多智能体系统研究(Matlab代码、Simulink仿真实现)
|
10月前
|
算法 数据安全/隐私保护
通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器
本课题通过MATLAB实现PID控制器、积分分离控制器和滑模控制器,对比结果显示滑模控制具有最快的收敛性能、较强的鲁棒性和较小的超调量,优于其他两种控制器。系统仿真结果无水印,核心程序基于MATLAB 2022a。PID控制器由P、I、D单元组成,积分分离PI在大误差时不进行积分,减少超调;滑模控制通过设计滑动面使系统快速收敛,抑制扰动。
|
11月前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。
219 14
|
算法 C++ Windows
基于离散差分法的复杂微分方程组求解matlab数值仿真
本程序使用离散差分法求解复杂微分方程组,将连续微分方程转化为差分方程,采用一阶显式时间格式和一阶偏心空间格式。经MATLAB2022a测试验证有效。
|
算法 C++ Windows
基于离散差分法的复杂微分方程组求解matlab数值仿真
本程序基于离散差分法求解复杂微分方程组,将连续微分方程转化为差分方程,采用一阶显式时间格式和一阶偏心空间格式。在MATLAB2022a上测试通过,展示了运行结果。
|
存储 JavaScript
MATLAB实战 | 求矩阵指数、预定义变量i和j的含义以及梯形积分法
MATLAB实战 | 求矩阵指数、预定义变量i和j的含义以及梯形积分法
510 0
MATLAB实战 | 求矩阵指数、预定义变量i和j的含义以及梯形积分法
|
存储
专题一MATLAB基础知识——1.2数值数据
专题一MATLAB基础知识——1.2数值数据
385 0
MATLAB快速入门(一):数值数据和字符串
MATLAB快速入门(一):数值数据和字符串
181 0
【基于矢量射线的衍射积分 (VRBDI)】基于矢量射线的衍射积分 (VRBDI) 和仿真工具(Matlab代码实现)
【基于矢量射线的衍射积分 (VRBDI)】基于矢量射线的衍射积分 (VRBDI) 和仿真工具(Matlab代码实现)
288 0

热门文章

最新文章