数值分析快速复习(1)——Matlab数值积分

数值分析快速复习(1)——Matlab数值积分

  • 序言
  • 数值积分基础知识
    • 为什么要进行数值积分?
    • 数值积分的几种基本方法?
      • 插值型
      • 复化求积公式
      • Romberg公式
  • 作业:Matlab实现Romberg积分

序言

由于最近的项目需要用到数值分析的相关知识,需要简单回顾以下数值积分的知识,复习内容以上学期数值分析课本内容和课后Matlab作业为主,在这里将复习的感悟分享给大家。

数值积分基础知识

为什么要进行数值积分?

在工程中,自变量和因变量往往不能通过简单的函数映射关系去表达,例如最简单的光/声波的传播,也会因为噪声而变得不能用简单的三角函数去表达。因此f(x)往往是通过列表函数表达,对于列表函数,求导和积分的公式都不能使用,这就要求我们要学会数值积分这个强有力的工具。

另外,在高等数学里我们学过,一些函数根本不能积分,找不到初等函数的原函数,例如:1/ln(x),所以对于这些函数,也必须使用数值积分进行求解。

数值积分的几种基本方法?

插值型

对于列表函数或一些复杂函数,我们一般可以知道一些节点的具体坐标,根据这些坐标拟合出一个多项式,这个过程叫做插值,得到拟合的多项式再进行积分就非常简单了。

  • 两个插值节点得到的求积公式——梯形公式
    数值分析快速复习(1)——Matlab数值积分_第1张图片
    数值分析快速复习(1)——Matlab数值积分_第2张图片

  • 三个等距插值节点得到的求积公式——Simpson公式

在这里插入图片描述

数值分析快速复习(1)——Matlab数值积分_第3张图片

  • 五个等距插值节点得到的求积公式——cotes公式

复化求积公式

插值型求积公式在较小的积分区间中非常好用,但是随着积分区间的增大,截断误差也在不断增大,因此我们很自然的想到,如果将一个很大的积分区间划分成无限小段,再对每一小段使用前面的插值型求积公式,是不是就非常好了呢?

于是有了:

  • 复化梯形公式
    数值分析快速复习(1)——Matlab数值积分_第4张图片

  • 复化Simpson公式
    数值分析快速复习(1)——Matlab数值积分_第5张图片

  • 复化Cotes公式
    在这里插入图片描述

Romberg公式

从上面可以看到,复化Simpson公式计算简单,但是精度相比于复化cotes来说比较差,收敛速度也相对较慢。怎么样发扬优点,避免缺点呢?

数学家从复化梯形公式的误差估计式入手,推导梯形公式、Simpson公式、Cotes公式之间的关系,这样在计算Cotes公式时就不需要上面那么复杂的公式了,而是通过求梯形公式的值——Simposon公式的值——Cotes公式的值,这就是Romberg公式。
数值分析快速复习(1)——Matlab数值积分_第6张图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以只需要计算最简单的梯形公式就可以得到很精确地Romberg积分值了!

(想看具体推导的同学,可以翻一下书本《数值分析(东南大学出版社)》215页)

作业:Matlab实现Romberg积分

贴一下我们老师布置的matlab作业的代码,实现了一个小的龙伯格积分,给大家作为参考。

%%Romberg integration method
clear,clc;format long;
f=@(x)1/(1+100*x^2);
syms x;            %定义函数
e=0.5*10^(-7);
for c=4:100
    for i=0:c
        n=2^i;
        h=2/n;
        x=zeros(1,n+1);
        x(1)=-1;
        x(n+1)=1;
        t=0;
        if i~=0
            for j=2:n
                x(j)=-1+2/n*(j-1);
            end
            t=f(x(2));
            if i~=1
                for j=3:n
                    t=t+f(x(j));
                end
            end
        end
        T(1,i+1)=h/2*(f(-1)+f(1)+2*t);
    end
    for i=1:c
        T(2,i)=4/3*T(1,i+1)-T(1,i)/3;
    end
    for i=1:c-1
        T(3,i)=16/15*T(2,i+1)-T(2,i)/15;
    end
    for i=1:c-2
        T(4,i)=64/63*T(3,i+1)-T(3,i)/63;
    end
    if abs(T(4,i)-T(4,i-1))<e
            break
    end
end
disp('____________________________________________________')
fprintf('区间等分数                   %f\n',n);
fprintf('积分值                       %f\n',T(4,i));
disp('____________________________________________________')


以上内容如有误,还请各位批评指正。

你可能感兴趣的:(matlab数值分析,matlab)