zoukankan      html  css  js  c++  java
  • MATLAB笔记-数值积分

    MATLAB笔记-数值积分

    解决问题:

    • 被积函数复杂,原函数很难求出;或被积函数不可积分,与之对应的原函数不存在。
    • 只能得到被积函数的一系列值,无法求出被积函数的具体表达式。

    解决方法:

    • 将被积函数转化为一系列简单函数的和再求积。根据积分“和的积分等于积分的和”规则,若函数 (f(x) = sum_{substack{i}} f_i(x)),则(int f(x) \, mathrm{d}x= sum_{substack{i}} int f_i(x) \, mathrm{d}x)。其中(f_i(x))是一系列简单函数,被积函数(f(x))是他们的线性组合。
    • 使用积分的几何意义求解,即将求积分转化为求面积。

    一、多项式近似求定积分(Newton-Cotes求积)

    用Lagrange插值法对被积函数进行插值,然后对其求积,即可得到原函数。

    设被积函数为(f(x)),积分区间为([a,b]),已知函数n个等间隔数据点(ig(x_0,f(x_0)ig),ig(x_1,f(x_1)ig),dotsb,ig(x_{n-1},f(x_{n-1})ig)),则根据Lagrange插值法,有:

    [f(x) approx sum_{k=0}^n l_k(x)f(x_k) ]

    可以得到求积公式:

    [egin{aligned} int_a^b f(x) ; mathrm{d} x &approx int_a^b sum_{k=0}^n l_k(x)f(x_k) ; mathrm{d} x \ &= sum_{k=0}^n Big[ f(x_k) int_a^b l_k(x); mathrm{d} x Big] end{aligned} ]

    (x_t = a+th),则有:

    [egin{aligned} int_a^b l_k(x) ; mathrm{d} x &= int_a^b Big[ prod_{substack{j=0 \ j eq k}}^n frac{x-x_j}{x_k-k_j} Big] ; mathrm{d} x\ &= int_a^b Big[ prod_{substack{j=0 \ j eq k}}^n frac{x-a-jh}{h(k-j)} Big] ; mathrm{d} x\ &= h int_0^n Big[ prod_{substack{j=0 \ j eq k}}^n frac{th-jh}{h(k-j)} Big] ; mathrm{d} t\ &= h prod_{substack{j=0 \ j eq k}}^n frac{1}{k-j} int_0^n prod_{substack{j=0 \ j eq k}}^n (t-j) ; mathrm{d} t\ &= h frac{(-1)^{n-k}}{k!(n-k)!} int_0^n prod_{substack{j=0 \ j eq k}}^n (t-j) ; mathrm{d} t\ &= (b-a) frac{(-1)^{n-k}}{k!(n-k)!n} int_0^n prod_{substack{j=0 \ j eq k}}^n (t-j) ; mathrm{d} t\ end{aligned} ]

    这样(l_k(x))就化为了一个与被积函数无关的式子,只要确定被积函数的积分区间与数据点数,就可以确定各(l_k(x))的值。

    如果将(b-a)分离出来,令:

    [egin{aligned} C_k^{(n)} &= frac{1}{b-a}int l_k(x) ; mathrm{d} x\ &= frac{(-1)^{n-k}}{k!(n-k)!n} int_0^n prod_{substack{j=0 \ j eq k}}^n (t-j) ; mathrm{d} t\ end{aligned} ]

    那么求积公式可以写成更简洁的形式:

    [int_a^b f(x) ; mathrm{d} x approx sum_{k=0}^n (b-a)C_k^{(n)}f(x_k) ]

    其中的(C_k^{(n)})称为Cotes系数,只与(n)有关,可以事先求出,用时查表。式中其他各参数由积分区间、被积函数的各已知值确定。

    使用这种求积方法,对于开头需要解决的问题一,可以选取合适的步长,计算所需各点函数值后求定积分;对于问题二,则可以选择步长后先通过插值求出所需各点的函数值再求定积分。由于这种方法中的(l_k(x))是由Lagrange插值法直接得到的,这种方法也继承了拉氏插值在阶数过高时计算结果剧烈抖动的缺点,在这里表现为高阶Cotes系数呈锯齿状,靠近中间会有正负交替。所以更适合分段低次插值。

    另外从(C_k^{(n)})的表达式中,可以看出计算过程的时间复杂度和空间复杂度都很高,并且出现了除以阶乘的情况,因此在阶数过高时,这种算法的速度与准确性都大打折扣。

  • 相关阅读:
    leetcode题目19.删除链表的倒数第N个节点(中等)
    Android学习笔记---使用Service模仿下载效果
    Android学习笔记-简单聊天界面的实现
    Android学习笔记-ContentProvider操作
    Android高级-Android操作SQL数据管理,增删改查
    Android高级-正则表达式
    Android高级-SQL语言
    Android学习之路-录音功能实现
    gitee上传下载代码命令
    opencv进行视频播放每帧处理,读取视频失败
  • 原文地址:https://www.cnblogs.com/gznest/p/13021602.html
Copyright © 2011-2022 走看看