【数值分析】复化积分公式

对于积分:

只要找到被积公式的原函数F(x),利用牛顿莱普利兹公式有:

但是,实际使用这种求积分的方法往往是有困难的,因为大量的被积函数的原函数是不能用初等函数表示的;另外,当f(x)是由测量或数值计算给出的一张数据表时,牛顿莱普利兹公式也无法直接运用,因此有必要研究积分的数值计算问题。

对于一些理论的推导,大家可以看看维基百科,下面我主要给出牛顿-科特斯公式在n=1(梯形求积公式)、n=2(辛普森公式)的情况,并通过代码实现

梯形公式:

辛普森公式:

应用高阶牛顿-科特斯公式计算积分时,会出现数值不稳定的情况,而低阶公式往往因为积分步长过大使得离散误差变大,因此,为了提高求积公式的精度,可以把积分区间分成若干个子区间,在每个子区间上使用低阶求积公式,然后将结果加起来,这种方法称为复化求积法。

复化梯形公式

将区间[a,b]划分为n等分,步长为h=(b-a)/h,节点为,在每个子区间使用梯形公式得:

复化辛普森公式

根据复化梯形公式的推导,同理可得复化辛普森公式为:

下面我们通过实例来实现复化梯形公式和复化辛普森公式:

        对于函数f(x)=sin(x)/x,试用复化梯形公式和复化辛普森公式计算函数f(x)在[0,1]上的积分。

具体的程序实现如下:

#include<stdio.h>
#include<math.h>
double Function(double x)//所要计算积分的函数f(x)
{
    if(x==0)//sin(x)/x在0处的取值为1
        return 1;
    else
        return sin(x)/x;
}
//复化梯形公式
double Trapz(double a,double b,int n)
{
    double h=(b-a)/n;
    double T=0;
    for(int i=1;i<n;i++)
    {
        T=T+Function(a+i*h);
    }
    T*=2;
    T=(Function(a)+Function(b)+T)*h/2;
    return T;
}
//复化辛普森公式
double MulripleSimpson(double a,double b,int n)
{
    double h=(b-a)/n;
    double T=0;
    for(int i=0;i<n;i++)
    {
        T=T+Function(a+i*h)+4*Function(a+(i+0.5)*h)+Function(a+(i+1)*h);
    }
    T=T*h/6;
    return T;
}
void main()
{
    printf("使用复化梯形公式可得:%f\n",Trapz(0,1,8));
    printf("使用复化辛普森公式可得:%f\n",MulripleSimpson(0,1,4));
}

运行结果如下图:

结果分析:

比较复化梯形公式和复化辛普森公式两种方法的运行结果,我们发现复化辛普森公式与准确值0.9460831更加接近,复化梯形公式只有2位有效数字,而复化辛普森公式有6为有效数字。

原文:http://blog.csdn.net/tengweitw/article/details/43311685

作者:nineheadedbird

时间: 2024-07-31 19:40:23

【数值分析】复化积分公式的相关文章

玩转matlab之一维 gauss 数值积分公式及matlab源代码

目录 标准区间 一般区间 数值实验 实验一 实验二 总结 下节预告 matlab代码 在数值分析中,尤其是有限元刚度矩阵.质量矩阵等的计算中,必然要求如下定积分: \[ I=\int_a^b f(x)dx \]学好gauss积分也是学好有限元的重要基础,学过高等数学的都知道,手动积分能把人搞死(微笑脸),而且有些函数还不存在原函数,使用原始的手动算出原函数几乎是不现实的.因此非常有必要学习数值积分,简单讲就是近似计算,只要这个近似值精确度高和稳定性好就行.Gauss积分公式就是这么一个非常好用的

黄金分割二分法数值分析回顾

今天看了2012年写的对黄金分割二分法的数值探讨,推理公式不记得了,当时写的不细致,晚上回顾了下,做了些补充 原文: http://blog.csdn.net/aaajj/article/details/7878480 比如ABCDE 5个节点,通过以下斐波拉契数列二分方式组织起来, 找A需要3次,即从5开始到A的路径 找B需要3次 找C需要2次 找D需要2次 找E需要2次 平均期望次数E=总次数 / 节点数 = (3+3+2+2+2) / 5 = 2.4 这里,设斐波拉契数列Tn 为 1 1

数值分析之奇异值分解(SVD)篇

在很多线性代数问题中,如果我们首先思考若做SVD,情况将会怎样,那么问题可能会得到更好的理解[1].                                       --Lloyd N. Trefethen & David Bau, lll 为了讨论问题的方便以及实际中遇到的大多数问题,在这里我们仅限于讨论实数矩阵,注意,其中涉及到的结论也很容易将其扩展到复矩阵中(实际上,很多教材采用的是复矩阵的描述方式),另外,使用符号 x,y 等表示向量,A,B,Q等表示矩阵. 首先给出正交矩阵

【原创】开源Math.NET基础数学类库使用(六)数值分析之线性方程直接求解

开源Math.NET基础数学类库使用系列文章总目录: 1.开源.NET基础数学计算组件Math.NET(一)综合介绍  2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算  3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式 4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式 5.开源.NET基础数学类库使用Math.NET(五)C#解析Delimited Formats数据格式 6.开源.NET基础

复化梯形求积分——用Python进行数值计算

用程序来求积分的方法有很多,这篇文章主要是有关牛顿-科特斯公式. 学过插值算法的同学最容易想到的就是用插值函数代替被积分函数来求积分,但实际上在大部分场景下这是行不通的. 插值函数一般是一个不超过n次的多项式,如果用插值函数来求积分的话,就会引进高次多项式求积分的问题.这样会将原来的求积分问题带到另一个求积分问题:如何求n次多项式的积分,而且当次数变高时,会出现龙悲歌现象,误差反而可能会增大,并且高次的插值求积公式有可能会变得不稳定:详细原因不赘述. 牛顿-科特斯公式解决这一问题的办法是将大的插

数值分析课程设计

数值分析学习心得: 插值法:拉格朗日插值,埃米特插值 函数逼近:最小二乘法 求积分的算法:牛顿-科斯特公式,龙贝格求积公式,高斯求积公式 求线性方程组的迭代法:jacobi迭代法,高斯-赛德尔迭代法 求非线性方程的算法:牛顿法 求常微分方程初值问题的算法:欧拉法,龙格-库塔法 数值分析课程设计  浙江大学 陈越 第1章 数值分析课程实践概要1.1 课程实践的意义1.2 实验的基本要求第2章 MATLAB简介2.1 MATLAB概述2.2 常用基本指令2.3 数值技术第3章 案例详解1:误差的影响

【数值分析】误差的分析与减少及Matlab解线性方程的四种方法

1.误差的来源 模型误差:数学模型与实际问题之间的误差 观测误差:测量数据与实际数据的误差 方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如 舍入误差:对数据进行四舍五入后产生的误差 2.减少误差的几种方法 现在,我们一般用计算机解决计算问题,使用最多的是Matlab软件.对实际问题进行数学建模时,可能存在模型误差,对数学模型进行数值求解时,我们使用的方法可能产生方法误差,我们输入计算机的数据一般是有测量误差的,计算机在运算过程的每一步又会产生舍入误差(十进制转化为二进制时可能产

数值分析习题

Q1(hdu6209): 给出常数k,欲用类似二分搜索的迭代策略,求解方程k^2=x^3分母不超过100000的最近似的解的最简分数形式. 分析:这是一个很直观方程求数值解的数值分析问题,因此应该能够联想到的是用迭代搜索策略.这里有如下两种策略: 策略1(二分迭代):可行解在[a/b , c/d]中,下次迭代考虑重点(ad+bc)/2cd. 策略2(类二分策略):可行解在[a/b , c/d]中,下次迭代考虑(a+c)/(b+d). 考虑这里用策略而能够保证整个迭代过程中,分数的分子和分母一定是

数值分析小项目Numeric

花了一星期把以前学过的数值分析算法用c++整理了下, 取名Numeric NumericV1.0 https://github.com/caicai9494/numericV1.0 基本实现了以下功能: 1 多项式的插值 2 矩阵求逆 以及 线性方程组 3 迭代法求非线性方程的解 计划在V2.0中用qt实现界面, 并且增加其他功能比如特征根,积分,微分等. 还有非常非常多缺陷,希望能逐步完善它.