数值积分用matlab实现
数值积分在MATLAB中的应用

数值积分在MATLAB 中的应用摘 要:介绍了数值积分法的几种计算公式及相应的MATLAB 命令,并给出了用MATLAB 编程求数值积分的实例.牛顿—莱布尼兹公式在计算积分的方法和解决实际问题中期了很大作用,但在某些领域遇到一些复杂情况,用牛顿—莱布尼兹公式则无法求解。
这时可以“数值积分”的方法求定积分。
“数值积分”法中常用的方法有“矩形公式”,“梯形公式”和“辛普森公式”等。
MATLAB 中求数值积分的命令有:矩形公式命令 sum ;梯形公式命令 trapz ;辛普森公式命令 quad 。
使用这些命令可以快速计算一些数值积分问题。
关键词:MATLAB ;数值积分;矩形公式;梯形公式;辛普森公式Numerical integration in MATLAB ApplicationsAbstract : Introduced several numerical integration formula and the corresponding MATLAB commands, and gives the Numerical Integration with MATLAB programming examples. Newton - Leibniz formula in calculating the integral method to solve practical problems and a significant role in the medium-term However, the complexities encountered in some areas, with Newton - Leibniz formula can not be solved. Then you can "numerical integration" method seeking the definite integral. "Numerical integration" method commonly used method in the "rectangular formula", "trapezoidal rule" and "Simpson formula," and so on.Numerical Integration in MATLAB commands are: rectangle formula order sum ; trapezoidal formula order trapz ; Simpson formula command quad . Use these commands to quickly calculate some numerical integration problems.Key words: MATLAB ; Numerical integration; Rectangular formula; Trapezoid formula; Simpson formula 引言MATLAB 是一个包含大量计算算法的集合。
高斯-勒让德数值积分Matlab代码

dblquad(f((1-v)*g1(y)+v*g2(y),y)*(g2(y)-g1(y)) ,0,1,a,b);
用 matlab 求定积分的三个实例代码
一、符号积分 符号积分由函数 int 来实现。该函数的一般调用格式为: int(s):没有指定积分变量和积分阶数时,系统按 findsym 函数指示的默认变量对被积函 数或符号表达式 s 求不定积分; int(s,v):以 v 为自变量,对被积函数或符号表达式 s 求不定积分; int(s,v,a,b):求定积分运算。a,b 分别表示定积分的下限和上限。该函数求被积函数在 区间[a,b]上的定积分。a 和 b 可以是两个具体的数,也可以是一个符号表达式,还可以是 无穷(inf)。当函数 f 关于变量 x 在闭区间[a,b]上可积时,函数返回一个定积分结果。当 a,b 中有一个是 inf 时,函数返回一个广义积分。当 a,b 中有一个符号表达式时,函数返 回一个符号函数。 例: 求函数 x^2+y^2+z^2 的三重积分。内积分上下限都是函数,对 z 积分下限是 sqrt(x*y), 积分上限是 x^2*y;对 y 积分下限是 sqrt(x),积分上限是 x^2;对 x 的积分下限 1,上限 是 2,求解如下: >>syms x y z %定义符号变量 >>F2=int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x^2*y),y,sqrt(x),x^2),x,1,2) %注意定 积分的书写格式 F2 = 1610027357/6563700-6072064/348075*2^(1/2)+14912/4641*2^(1/4)+64/225*2^(3/4) % 给出有理数解 >>VF2=vpa(F2) %给出默认精度的数值解 VF2 = 224.92153573331143159790710032805
数值积分的MATLAB实现

数值积分的MATLAB实现数值积分是通过数值方法计算定积分的近似值。
MATLAB是一种功能强大的数值计算软件,提供了多种函数和工具箱用于数值积分的实现。
在MATLAB中,常用的数值积分方法包括梯形法则、辛普森法则和龙贝格法。
梯形法则是最简单的数值积分方法之一、它的基本思想是将要积分的区间划分成多个小的梯形并计算每个梯形的面积,然后将这些面积相加得到最终的近似积分值。
在MATLAB中,可以使用trapz函数进行梯形法则的计算。
例如,要计算函数sin(x)在区间[0, pi]的积分,可以使用以下代码:```MATLABx = linspace(0, pi, 1000); % 在[0, pi]区间生成1000个等间隔的点y = sin(x); % 计算函数sin(x)在每个点的值integral_value = trapz(x, y) % 使用梯形法则进行数值积分```辛普森法则是一种更精确的数值积分方法,它使用二次多项式来逼近被积函数。
在MATLAB中,可以使用simpson函数进行辛普森法则的计算。
例如,上面例子中的积分可以改用辛普森法则进行计算:```MATLABintegral_value = simpson(x, y) % 使用辛普森法则进行数值积分```龙贝格法是一种高效的自适应数值积分方法,它通过逐步加密网格和逼近函数来提高积分的精度。
在MATLAB中,可以使用quad和quadl函数进行龙贝格法的计算。
例如,计算函数sin(x)在区间[0, pi]的积分:```MATLAB```除了上述方法外,MATLAB还提供了许多其他的数值积分函数和工具箱,用于处理不同类型的积分问题。
例如,int和integral函数可以用于处理多重积分和奇异积分。
Symbolic Math Toolbox中的函数可以用于计算符号积分。
需要注意的是,数值积分是一种近似方法,计算结果的误差与划分区间的精细程度有关。
用matlab实现romberg积分法

一、概述在数值分析中,求解定积分是一项重要的任务。
传统的数值积分方法包括梯形法则、辛普森法则等。
而Romberg积分法,是一种更加精确的数值积分方法,它通过不断增加区间的细分,逐步提高数值积分的精度。
在本文中,我们将尝试用MATLAB实现Romberg积分法,探索其优势和应用。
二、Romberg积分法原理Romberg积分法的基本原理是通过对梯形法则和辛普森法则进行逐步的细分和修正,以获得更加精确的数值积分结果。
假设我们需要求解函数 f(x) 在区间 [a, b] 上的定积分,那么Romberg积分法的步骤可以概括为以下几点:1. 将区间 [a, b] 均匀分成若干个子区间;2. 计算每个子区间上的梯形规则和辛普森规则的数值积分;3. 利用已知结果进行Richardson外推,修正数值积分的误差;4. 逐步增加子区间的细分,直到达到所需的精度要求。
三、MATLAB实现Romberg积分法我们可以使用MATLAB编程语言来实现Romberg积分法,以下是一个示例代码:function [I, R] = romberg(f, a, b, n)h = (b - a) ./ (2 .^ (0:n-1));R = zeros(n, n);R(1, 1) = (b - a) * (feval(f, a) + feval(f, b)) / 2;for j = 2:nsubtotal = 0;for i = 1:2^(j-2)subtotal = subtotal + feval(f, a + (2*i - 1) * h(j));endR(j, 1) = R(j-1, 1)/2 + h(j) * subtotal;endfor k = 2:nfor j = k:nR(j, k) = (4^(k-1) * R(j, k-1) - R(j-1, k-1)) / (4^(k-1) - 1); endendI = R(n, n);通过以上的MATLAB代码,我们可以轻松地实现Romberg积分法,对给定的函数和区间进行数值积分,并得到精确的积分结果。
matlab离散数据积分

matlab实现离散数据积分
在MATLAB中,离散数据积分可以通过数值积分方法来实现。
MATLAB提供了一些内置函数来计算数值积分,如integral 函数。
下面是一个示例代码,展示如何在MATLAB中实现离散数据积分:
在上面的示例中,我们首先生成了一组离散数据,其中x表示输入数据,y表示输出数据。
然后,我们使用MATLAB内置的integral函数来计算离散数据的积分。
integral函数接受一个函数句柄和积分的范围作为参数。
在示例中,我们将y(x)作为函数句柄传递给integral函数,表示要根据输出数据y和输入数据x计算积分。
积分的范围是1到5,即从x=1到x=5。
运行上述代码后,将输出计算得到的积分结果。
请注意,这只是一个简单的示例,演示了如何在MATLAB中实现离散数据积分。
对于更复杂的情况,您可能需要使用其他数值积分方法或自定义函数来计算积分。
MATLAB数值积分及算例

6.2.3 被积函数由一个表格定义
(要求积分,但是函数没有直接给出,只是自己在 做实验时得到的一组相关联的数据)
在MATLAB中,对由表格形式定义的函数关系的求定积分问 题用trapz(X,Y)函数。其中向量X,Y定义函数关系Y=f(X)。
例4 用trapz函数计算定积分。
命令如下:
X=1:0.01:2.5; Y=exp(-X); trapz(X,Y)
例2 求定积分:
x sin x
dx
0 (1 cos x cos x)
(1) 被积函数文件fx.m。
function f=fx(x) f=x.*sin(x)./(1+cos(x).*cos(x));
(2) 调用函数quad8求定积分。
I=quad8('fx',0,pi)
例3
分别用quad函数和quad8函数求定积分
global ki;ki=0; I=dblquad('fxy',-2,2,-1,1) ki
6.2 数值积分的实现方法
6.2.1 变步长辛普生法
基于变步长辛普生法,MATLAB给出了quad函数来 求定积分。该函数的调用格式为:
[I, n] = quad('fname', a, b, tol, trace) 其中fname是被积函数名。a和b分别是定积分的下 限 和 上 限 。 tol 用 来 控 制 积 分 精 度 , 缺 省 时 取 tol=0.001。trace控制是否展现积分过程,若取非0则 展现积分过程,取0则不展现,缺省时取trace=0。 返回参数I即定积分值,n为被积函数的调用次数。
2.5 exdx
1
的近似值,并在相同的积分精度下,比较函数的调
数值积分的Matlab实现研究

3.指令所采用的算法是将一般的积分区域映射到矩形区域, 然后利用自适应Lobatton算法进行计算.
例题:计算
1
2 1 x 2 2
( x 2 y 2 ) sin(x y 2 )dx
可用如下指令:
quad2d (@(x, y)(x.^2 y.^2).* sin(x y.^2), ...1,2, @( x) x, @( x)1 x.^2)
其中:tic,toc是秒表计时命令,tic表示秒表计时开始,toc表 示秒表计时结束,运行花费时间输出格式为“elapsed_time=”, 单位为秒。 2、被积函数用内嵌函数表示
sym s y 2; y 2 inline('1. /((x 0.3)^2 0.01) 1. /((x 0.9)^2 0.04) 6' );
…*(x.^2+y.^2),x,1+x.^2),x),0,inf)
运行结果:0.6427 例2.计算三重积分 2 2 ( xz y ) ln( 1 x z)dv
其中积分区域由xoy坐标面 与旋转抛物面z=16-x^2-y^2所 围成的立体区域.
4 x 4; 16 x 2 y 16 x 2 ; 0 z 16 x 2 y 2
二、一般数值积分的讨论与研究 由于数值积分非常复杂,如振荡积分,无界区域的积分,无 界函数的积分,高维积分等,目前matlab系统还没有直接提供 一般区域上的三元及三元以上函数积分的指令,这需要人们 从问题出发,利用matlab系统现有的指令,探索求解一般区域 的积分问题. 以具体例题进行讨论: 例1
如 : dz dy ( x 2 y 2 ) ln(x y z )dx
matlab切比雪夫数值积分

一、介绍MATLAB 是一款用于高级数学和工程计算的软件,切比雪夫数值积分是一种常见的数值积分方法。
本文将介绍MATLAB中切比雪夫数值积分的原理和实现方式,并结合实例进行详细讲解。
二、切比雪夫数值积分原理切比雪夫数值积分是一种通过在特定区间上拟合切比雪夫多项式来进行数值积分的方法。
其原理是利用切比雪夫多项式的性质,将被积函数在给定区间上进行插值拟合,从而计算积分值。
切比雪夫数值积分的优点在于其在一定条件下可以达到很高的精度,尤其适用于非光滑函数的数值积分。
三、MATLAB中的切比雪夫数值积分实现在MATLAB中,可以利用内置的函数chebfun来实现切比雪夫数值积分。
chebfun是一个专门用于处理切比雪夫多项式的工具包,其中包含了丰富的函数和方法,可以方便地进行数值积分。
1. 定义被积函数需要定义被积函数,并将其转换为chebfun对象。
如果要计算函数f(x)在区间[a, b]上的积分值,可以使用以下代码将f(x)转换为chebfun对象:```matlabF = chebfun((x) f(x), [a, b]);```2. 计算积分值接下来,可以使用内置的积分函数sum来计算切比雪夫数值积分的结果。
可以使用以下代码计算chebfun对象F在区间[a, b]上的积分值:```matlabI = sum(F);```这样,就可以得到函数f(x)在区间[a, b]上的切比雪夫数值积分结果I。
四、实例演示接下来,我们通过一个具体的实例来演示MATLAB中切比雪夫数值积分的实现。
假设要计算函数f(x) = sin(x) 在区间[0, π] 上的积分值。
1. 定义被积函数定义函数f(x) 并转换为chebfun对象:```matlabF = chebfun((x) sin(x), [0, pi]);```2. 计算积分值使用sum函数计算积分值:```matlabI = sum(F);```通过上述步骤,就可以得到函数f(x)在区间[0, π]上的切比雪夫数值积分结果I。
数值积分的matlab实现

实验10 数值积分实验目的:1.了解数值积分的基本原理; 2.熟练掌握数值积分的MATLAB 实现; 3.会用数值积分方法解决一些实际问题。
实验内容:积分是数学中的一个基本概念,在实际问题中也有很广泛的应用。
同微分一样,在《微积分》中,它也是通过极限定义的,由于实际问题中遇到的函数一般都以列表形式给出,所以常常不能用来直接进行积分。
此外有些函数虽然有解析式,但其原函数不是初等函数,所以仍然得不到积分的精确值,如不定积分⎰10 d sin x x x。
这时我们一般考虑用数值方法计算其近似值,称为数值积分。
10.1 数值微分简介设函数()y f x =在*x 可导,则其导数为hx f h x f x f h )()(lim )(**0*-+='→ (10.1)如果函数()y f x =以列表形式给出(见表10-1),则其精确值无法求得,但可由下式求得其近似值hx f h x f x f )()()(***-+≈' (10.2)表 10-1一般的,步长h 越小,所得结果越精确。
(10.2)式右端项的分子称为函数()y f x =在*x 的差分,分母称为自变量在*x 的差分,所以右端项又称为差商。
数值微分即用差商近似代替微商。
常用的差商公式为:000()()()2f x h f x h f x h +--'≈(10.3)hy y y x f 243)(2100-+-≈' (10.4)hy y y x f nn n n 234)(12+-≈'-- (10.5)其误差均为2()O h ,称为统称三点公式。
10.2 数值微分的MATLAB 实现MATLAB 提供了一个指令求解一阶向前差分,其使用格式为: dx=diff(x) 其中x 是n 维数组,dx 为1n -维数组[]21321,,,n x x x x x x ---,这样基于两点的数值导数可通过指令diff(x)/h 实现。
(完整版)数值积分及matlab实现

建立数值积分公式的途径比较多, 其中最常用的
有两种:
(1)由积分中值定理可知,对于连续函数f(x),在
积分区间[a,b]内存在一点ξ,使得
分,因此将 选(x取) 为插值多项式, 这样f(x)的积分就
可以用其插值多项式的积分来近似代替
2.2 插值求积公式
设已知f(x)在节点 xk (k 0,1, , n) 有函数值 f (xk ) ,作n次拉格朗日插值多项式
式中
n
P(x) f (xk )lk (x)
k 0
lk (x)
n j0
b
n
f (x)dx
a
Ak f (xk )
k 0
为插值型求积公式的充要条件是公式
(
x)dx
时,则称求积公式为插值
设插值求积公式的余项为 R( f ) ,由插值余项定理得
R( f ) b f (x) P(x)dx b f (n1) ( ) (x)dx
a
a (n 1)!
其中 a, b
当f(x)是次数不高于n的多项式时,有 f (n1) (x) 0 R( f ) =0,求积公式(4)能成为准确的等式。由于闭区 间[a,b]上的连续函数可用多项式逼近,所以一个 求积公式能对多大次数的多项式f(x)成为准确等式, 是衡量该公式的精确程度的重要指标,为此给出以 下定义。
数值积分与微分
2009.4.22
数值积分和数值微分
1 引言 我们知道,若函数f(x)在区间[a,b]上连续且其原
函数为F(x),则可用Newton-Leibnitz公式
Matlab数值积分与数值微分

M a t l a b 数值积分与数值微分Matlab 数值积分1. 一重数值积分的实现方法变步长辛普森法、高斯-克朗罗德法、梯形积分法 1.1 变步长辛普森法Matlab 提供了quad 函数和quadl 函数用于实现变步长辛普森法求数值积分.调用格式为: [I,n]=Quad(@fname,a,b,tol,trace) [I,n]=Quadl(@fname,a,b,tol,trace)Fname 是函数文件名,a,b 分别为积分下限、积分上限;tol 为精度控制,默认为1.0×10-6,trace 控制是否展开积分过程,若为0则不展开,非0则展开,默认不展开. 返回值I 为积分数值;n 为调用函数的次数.---------------------------------------------------------------------例如:求∫e 0.5xsin (x +π6)dx 3π0的值.先建立函数文件 fesin.mfunction f=fesin(x)f=exp(-0.5*x).*sin(x+(pi/6));再调用quad 函数[I,n]=quad(@fesin,0,3*pi,1e-10)I=0.9008n=365--------------------------------------------------------------------- 例如:分别用quad函数和quadl函数求积分∫e0.5x sin(x+π6)dx3π的近似值,比较函数调用的次数.先建立函数文件fesin.mfunction f=fesin(x)f=exp(-0.5*x).*sin(x+(pi/6));formatlong[I,n]=quadl(@fesin,0,3*pi,1e-10)I=n=198[I,n]=quad(@fesin,0,3*pi,1e-10)I=n=365--------------------------------------------------------------------- 可以发现quadl函数调用原函数的次数比quad少,并且比quad函数求得的数值解更精确.1.2高斯-克朗罗德法Matlab提供了自适应高斯-克朗罗德法的quadgk函数来求震荡函数的定积分,函数的调用格式为:[I,err]=quadgk(@fname,a,b)Err返回近似误差范围,其他参数的意义与quad函数相同,积分上下限可以是-Inf或Inf,也可以是复数,若为复数则在复平面上求积分.--------------------------------------------------------------------- 例如:求积分∫xsinx1+cos2xdx π的数值.先编写被积函数的m文件fsx.mfunction f=fsx(x)f=x.*sin(x)./(1+cos(x).^2);再调用quadgk函数I=quadgk(@fsx,0,pi)I=2.4674--------------------------------------------------------------------- 例如:求积分∫xsinx1+cos2xdx +∞−∞的值.先编写被积函数的m文件fsx.mfunction f=fsx(x)f=x.*sin(x)./(1+cos(x).^2); 再调用quadgk函数I=quadgk(@fsx,-Inf,Inf)I=-9.0671e+017---------------------------------------------------------------------1.3 梯形积分法对于一些不知道函数关系的函数问题,只有实验测得的一组组样本点和样本值,由表格定义的函数关系求定积分问题用梯形积分法,其函数是trapz 函数,调用格式为: I=Traps(X,Y)X,Y 为等长的两组向量,对应着函数关系Y=f(X) X=(x 1,x 2,…,x n )(x 1<x 2<…<x n ),Y=(y 1,y 2,…,y n ),积分区间是[x 1,x n ]---------------------------------------------------------------------例如:已知某次物理实验测得如下表所示的两组样本点.现已知变量x 和变量y 满足一定的函数关系,但此关系未知,设y=f(x),求积分∫f(x)dx 13.391.38的数值.X=[1.38,1.56,2.21,3.97,5.51,7.79,9.19,11.12,13.39];Y=[3.35,3.96,5.12,8.98,11.46,17.63,24.41,29.83,32.21];I=trapz(X,Y) I=217.1033---------------------------------------------------------------------例如:用梯形积分法求积分:∫e −x dx 2.51的数值.x=1:0.01:2.5; y=exp(-x); I=trapz(x,y) I= 0.2858---------------------------------------------------------------------2. 多重数值积分的实现重积分的积分函数一般是二元函数f(x,y)或三元函数f(x,y,z);形如:∫∫f (x,y )dxdy ba dc∫∫∫f(x,y,z)dxdydz b a d cf eMatlab 中有dblquad 函数和triplequad 函数来对上述两个积分实现.调用格式为: I=dblquad(@fun,a,b,c,d,tol)I=triplequad(@fun,a,b,c,d,e,f,tol)Fun 为被积函数,[a,b]为x 的积分区间;[c,d]为y 的积分区间;[e,f]为z 的积分区间.Dblquad 函数和triplequad 函数不允许返回调用的次数,如果需要知道函数调用的次数,则在定义被积函数的m 文件中增加一个计数变量,统计出被积函数被调用的次数.---------------------------------------------------------------------例如:计算二重积分I =∫∫√x 2+y 2dxdy π2−π2π2−π2的值.先编写函数文件fxy.mfunction f=fxy(x,y) global k; k=k+1;f=sqrt(x.^2+y.^2);再调用函数dblquadglobalk; k=0;I=dblquad(@fxy,-pi/2,pi/2,-pi/2,pi/2,1.0e-10) I= 11.8629 k k= 37656---------------------------------------------------------------------例如:求三重积分∫∫∫4xze −z2y−x 2dxdydz ππ1的值.编写函数文件fxyz1.mfunction f=fxyz1(x,y,z) global j; j=j+1;f=4*x.*z.*exp(-z.*z.*y-x.*x);调用triplequad函数editglobalj;j=0;I=triplequad(@fxyz1,0,pi,0,pi,0,1,1.0e-10)I=1.7328jj=1340978---------------------------------------------------------------------Matlab数值微分1.数值微分与差商导数的三种极限定义f′(x)=limn→0f(x+h)−f(x)f′(x)=limn→0f(x)−f(x−h)f′(x)=limn→0f(x+h2)−f(x−h2)上述公式中假设h>0,引进记号:?f(x)=f(x+h)−f(x)?f(x)= f(x)−f(x−h)δf(x)= f(x+h)−f(x−h)称上述?f(x)、?f(x)、δf(x)为函数在x点处以h(h>0)为步长的向前差分、向后差分、中心差分,当步长h足够小时,有:f′(x)≈?f(x) hf′(x)≈?f(x) hf′(x)≈δf(x)?f(x) h 、?f(x)h、δf(x)h也分别被称为函数在x点处以h(h>0)为步长的向前差商、向后差商、中心差商.当h足够小时,函数f(x)在x点处的导数接近于在该点的任意一种差商,微分接近于在该点的任意一种差分.2.函数导数的求法2.1用多项式或样条函数g(x)对函数f(x)进行逼近(插值或拟合),然后用逼近函数g(x)在点x处的导数作为f(x)在该点处的导数.2.2用f(x)在点x处的差商作为其导数.3.数值微分的实现方法Matlab中,只有计算向前差分的函数diff,其调用格式为:·DX=diff(X):计算向量X的向前差分,DX(i)=X(i+1)-X(i),i=1,2,…,n-1·DX=diff(X,n):计算向量X的n阶向前差分,例如diff(X,2)=diff(diff(X))·DX=diff(A,n,dim):计算矩阵A的n阶向前差分,dim=1(默认值)按列计算差分,dim=2按行计算差分. --------------------------------------------------------------------- 例如:生成6阶范德蒙德矩阵,然后分别按行、按列计算二阶向前差分A=vander(1:6)A=111111321684212438127931102425664164131256251252551777612962163661D2A1=diff(A,2,1)D2A1=180501220057011018200132019424200255030230200D2A2=diff(A,2,2)D2A2=000084211083612457614436920004008016540090015025--------------------------------------------------------------------- 例如:设f(x)=√x3+2x2−x+12+√()6+5x+2求函数f(x)的数值导数,并在同一坐标系中作出f’(x)的图像.已知函数f(x)的导函数如下:f′(x)=3x2+4x−12√x3+2x2−x+12+16√()56+5编辑函数文件fun7.m和fun8.mfunctionf=fun7(x)f=sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2;functionf=fun8(x)f=(3*x.^2+4*x-1)/2./sqrt(x.^3+2*x.^2-x+12)+1/6./(x+5).^(5/6)+5;x=-3:0.01:3;p=polyfit(x,fun7(x),5);用5次多项式拟合曲线dp=polyder(p);对拟合多项式进行求导dpx=polyval(dp,x);对dp在假设点的求函数值dx=diff(fun7([x,3.01]))/0.01;直接对dx求数值导数gx=fun8(x);求函数f的函数在假设点的导数plot(x,dpx,x,dx,'.',x,gx,'-')可以发现,最后得到的三条曲线基本重合.--------------------------------------------------------------------- 练习:A.用高斯-克朗罗德法求积分∫dx2 +∞−∞的值并讨论计算方法的精确度.(该积分值为π)function f=fun9(x)f=1./(1+x.^2);formatlong[I,err]=quadgk(@fun9,-Inf,Inf)I=err=B.设函数f(x)=sin x用不同的办法求该函数的数值导数,并在同一坐标系中作出f′(x)的图像.已知f′(x)=x cos x+cos x cos2x−sin x+2sin x sin2x()2function f=fun10(x)f=sin(x)./(x+cos(2*x));function f=fun11(x)f=(x.*cos(x)+cos(x).*cos(2*x)-sin(x)-2*sin(x).*sin(2*x))/(x+cos(2*x)).^2;x=-3:0.01:3;p=polyfit(x,fun10(x),5);dp=polyder(p);dpx=polyval(dp,x);dx=diff(fun10([x,3.01]))/0.01;gx=fun11(x);plot(x,dpx,'r:',x,dx,'.g',x,gx,'-k')。
matlab 数组积分

matlab 数组积分导言:数组积分是MATLAB中常用的一项计算任务,它能够对数组进行积分运算并输出相应结果。
本文将介绍MATLAB中进行数组积分的方法及应用实例。
一、MATLAB中数组积分的基本概念在MATLAB中,利用数值积分方法可以对数组进行积分计算。
一般而言,MATLAB提供了多种数值积分函数,包括但不限于trapz、quad和integral等。
对于待积分的数组,这些函数可以通过数值逼近来计算出积分结果。
二、trapz函数的使用方法trapz函数是MATLAB中常用的数值积分函数之一,它基于梯形法则进行数值逼近。
下面是它的基本使用方法:```result = trapz(x, y);```其中,x是自变量的数组,y是对应的因变量的数组。
trapz函数将根据这两个数组的数据点进行梯形逼近,并返回积分结果。
三、quad函数的使用方法quad函数是MATLAB中更为通用的数值积分函数,它可以处理更加复杂的积分问题。
下面是它的基本使用方法:```result = quad(fun, a, b);```其中,fun是待积分函数的句柄,a和b分别是积分区间的起点和终点。
quad函数将根据传入的函数句柄及积分区间进行数值逼近,并返回积分结果。
四、数组积分的应用实例为了更好地理解和应用数组积分,我们以一个具体的实例来说明。
假设有一组实验数据x和y,我们需要计算并绘制其积分曲线。
首先,我们可以使用trapz函数来计算积分结果:```matlabresult = trapz(x, y);```接着,我们可以通过绘制积分曲线来展示结果:```matlabfigure;plot(x, y, 'b-', 'LineWidth', 1.5);hold on;area(x, y, 'FaceColor', 'r', 'FaceAlpha', 0.3);title('积分曲线');xlabel('x');ylabel('y');legend('原始曲线', '积分曲线');```这段代码将会生成一张带有原始曲线和积分曲线的图像,用于直观地展示积分结果。
matlab 数组积分

matlab 数组积分在MATLAB中,数值积分是常见的数值计算任务之一。
数值积分是对函数在给定区间上的积分值进行数值计算的过程。
在MATLAB中,有几种不同的方法可以用来进行数值积分。
一、MATLAB中的积分函数MATLAB提供了一些内置的函数,可以用来进行数值积分计算。
其中最常用的函数是`integral`函数。
`integral`函数可以用于一维和多维积分,可以使用固定步长或自适应步长算法。
下面是一个使用`integral`函数计算一维积分的示例:```matlabf = @(x) exp(-x^2); %定义需要积分的函数a = -1; %积分下限b = 1; %积分上限result = integral(f, a, b); %计算积分disp(result); %输出结果```在这个示例中,我们首先定义了需要积分的函数`f`,然后定义了积分的下限`a`和上限`b`。
然后我们使用`integral`函数来计算积分的值,并将结果存储在`result`变量中。
最后,我们使用`disp`函数来输出积分的结果。
除了`integral`函数,MATLAB还提供了其他一些积分函数,如`quad`、`quadl`、`quadgk`等。
这些函数提供了不同的积分算法和参数设置,可以根据具体的需求选择合适的函数进行数值积分计算。
二、积分方法在进行数值积分时,常用的方法包括:1.矩形法:将积分区间划分为若干个子区间,然后在每个子区间上选取某个点的函数值作为近似值。
这种方法简单易懂,但精度较低。
2.梯形法:将积分区间划分为若干个子区间,然后在每个子区间上通过线性插值得到函数的近似值,再对近似值进行积分。
这种方法比矩形法精度更高,但仍然有误差。
3.辛普森法:将积分区间划分为若干个子区间,然后在每个子区间上使用二次插值得到函数的近似值,再对近似值进行积分。
这种方法的精度比梯形法更高,但计算量也更大。
三、示例下面我们通过一个具体的示例来演示如何在MATLAB中进行数值积分计算。
matlab中的微分方程的数值积分

MATLAB是一种流行的数学软件,用于解决各种数学问题,包括微分方程的数值积分。
微分方程是许多科学和工程问题的数学描述方式,通过数值积分可以得到微分方程的数值解。
本文将介绍在MATLAB中如何进行微分方程的数值积分,以及一些相关的技巧和注意事项。
一、MATLAB中微分方程的数值积分的基本方法1. 常微分方程的数值积分在MATLAB中,常微分方程的数值积分可以使用ode45函数来实现。
ode45是一种常用的数值积分函数,它使用4阶和5阶Runge-Kutta 方法来求解常微分方程。
用户只需要将微分方程表示为函数的形式,并且提供初值条件,ode45就可以自动进行数值积分,并得到微分方程的数值解。
2. 偏微分方程的数值积分对于偏微分方程的数值积分,在MATLAB中可以使用pdepe函数来实现。
pdepe可以求解具有定解条件的一维和二维偏微分方程,用户只需要提供偏微分方程的形式和边界条件,pdepe就可以进行数值积分,并得到偏微分方程的数值解。
二、在MATLAB中进行微分方程数值积分的注意事项1. 数值积分的精度和稳定性在进行微分方程的数值积分时,需要注意数值积分的精度和稳定性。
如果数值积分的精度不够,可能会导致数值解的误差过大;如果数值积分的稳定性差,可能会导致数值解发散。
在选择数值积分方法时,需要根据具体的微分方程来选择合适的数值积分方法,以保证数值解的精度和稳定性。
2. 初值条件的选择初值条件对微分方程的数值解有很大的影响,因此在进行微分方程的数值积分时,需要选择合适的初值条件。
通常可以通过对微分方程进行分析,或者通过试验求解来确定合适的初值条件。
3. 数值积分的时间步长在进行微分方程的数值积分时,需要选择合适的时间步长,以保证数值积分的稳定性和效率。
选择时间步长时,可以通过试验求解来确定合适的时间步长,以得到最优的数值解。
三、MATLAB中微分方程数值积分的实例以下通过一个简单的例子来演示在MATLAB中如何进行微分方程的数值积分。
用梯形法或者辛普森法数值积分-分别用Matlab和c语言实现。

Matlab作业(一)作业要求:用梯形法或者辛普森法数值积分,分别用Matlab和c语言实现。
C语言1.程序代码:#include <>>#include <>double fun(double x){return x*x;{}double definfresult1(double (*pfun)(double),double a,double b,double eps){int n=1;,double h,k,tn,tn1,fh,fh1=0;double fa=pfun(a);double fb=pfun(b);tn=(b-a)*(fa+fb)/2;do {…for(k=0,fh1=0;k<n;k++){h=(b-a)/(n);fh=pfun(a + (2*k + 1)*(b-a)/(2*n));fh=fh+fh1;fh1=fh;~}tn1=tn;tn=(tn1+fh*h)/2;n=2*n;} while(fabs(tn- tn1) >= eps);^return tn;}int main(){$double a,b,eps,definfresult;printf("积分下限a=");scanf("%lf",&a);printf("积分上限b=");scanf("%lf",&b);;printf("精度eps=");scanf("%lf",&eps);definfresult=definfresult1(fun,a,b,eps);printf("\n计算结果=%.7lf\n", definfresult);】}2.运行结果:、MatLab1.程序代码:*function y=fun1(x)y=x*x;)function result=definf1(fhandle, a, b, eps) fa=feval(fhandle, a);fb=feval(fhandle, b);tn=(b-a)*(fa+fb)/2;tn1=0;[n=1;fh1=0;while abs(tn- tn1) > epsfh1=0;for i=0:n-1&h=(b-a)/n;fh=feval(fhandle,a + (2*i + 1)*(b-a)/(2*n) );fh=fh+fh1;fh1=fh;end;tn1=tn;tn=(tn1+fh*h)/2;n=2*n;endresult=tn;>> result=definf1(@fun1, 0, 10, ) result =2.运行结果。
matlab数值积分实例

数值积分 1.求积分dx e x ⎰--112,在积分区间中,点与点之间的间隔取为0.1.解:(一)用MATBLE 编写复化梯形求积函数:function I=T_quad(x,y)n=length(x);m=length(y);if n ~=merrorendh=(x(n)-x(1))/(n-1);a=[1 2*ones(1,n-2) 1];I =h/2*sum(a.*y);输入:x=-1:0.1:1;y=exp(-x.^2);I =T_quad(x,y)运行得到:I =1.4924(二)用MATBL 编写复化Simpson 求积函数:function I=S_quad(x,y);n=length(x);m=length(y);if n ~=merrorendif rem(n-1,2) ~=0I=T_quad(x,y);return;endN=(n-1)/2;h=(x(n)-x(1))/N;a=zeros(1,n);for k=1:Na(2*k-1)=a(2*k-1)+1;a(2*k)=a(2*k)+4;a(2*k+1)=a(2*k+1)+1;endI=h/6*sum(a.*y);输入:x= -1:0.1:1;y=exp(-x.^2);I= S_quad(x,y)运行得到:I =1.4936(三)用MATBL 编写复化Cotes 求积函数:function I=C_quad(x,y);n=length(x);m=length(y);if n ~=merrorendif rem(n-1,4) ~=0I=S_quad(x,y);returnendN=(n-1)/4;h=(x(n)-x(1))/N;a=zeros(1,n);for k=1:Na(4*k-3)=a(4*k-3)+7;a(4*k-2)=a(4*k-2)+32;a(4*k-1)=a(4*k-1)+12;a(4*k)=a(4*k)+32;a(4*k+1)=a(4*k+1)+7;endI=h/90*sum(a.*y);输入:x= -1:0.1:1;y=exp(-x.^2);I= C_quad(x,y)运行得:I =1.4936(四)利用trapz()函数,采用复化梯形公式求积分输入:x=-1:0.1:1;y=exp(-x.^2);I=trapz(x,y)输出:I =1.49242. 求积分dx e x ⎰--112,取精度要求510-=ε (一)用MATLAB 编写自适应步长的梯形公式function I=T_quad_iter(fun,a,b,ep)if nargin<4 ep=1e-5;endN=1;h=b-aT=h/2*(feval(fun,a)+feval(fun,b));while 1h=h/2;I=T/2;for k=1:NI=I+h*feval(fun,a+(2*k-1)*h);endif abs(I-T)<ep breakendN=2*N;T=IEnd输入:I=T_quad_iter(@(x)exp(-x.^2),-1,1)输出:I =1.4936(二)用MATLAB编写自适应步长的Simpson公式function I=S_quad_iter(fun,a,b,ep)if nargin<4 ep=1e-5endN=1;h=b-aT1=h/2*(feval(fun,a)+feval(fun,b));S0=T1;while 1h=h/2;T2=T1/2;for k=1:NT2=T2+h*feval(fun,a+(2*k-1)*h)endI=(4*T2-T1)/3;if abs(I-S0)<ep breakendN=2*N;T1=T2;S0=IEnd输入:I=S_quad_iter(@(x) exp(-x.^2),-1,-1)输出:I =1.4936(三)用quad()函数,采用自适应步长的Simposon求积分输入:I=quad(@(x) exp(-x.^2) ,-1,1)输出:I =1.4936。
用matlab求数值积分的方法

用matlab求数值积分的方法
数值积分也称为数值积分法,是一种用计算机来近似求解定积分的方法。
在MATLAB中,可以使用三种数值积分方法:梯形法、辛普森法和积分变换法。
梯形法是最简单的数值积分方法之一,它通过将被积函数在区间上近似为一条直线,然后计算这条直线下的面积来近似定积分。
在MATLAB中,可以使用trapz函数来使用梯形法进行数值积分。
辛普森法是梯形法的改进版,它通过将被积函数在区间上近似为一个二次函数,然后计算这个二次函数下的面积来近似定积分。
在MATLAB中,可以使用quad函数来使用辛普森法进行数值积分。
积分变换法是一种更加精确的数值积分方法,它通过将被积函数进行一定的变换,然后将变换后的函数在区间上近似为一个多项式函数,最后计算这个多项式函数下的面积来近似定积分。
在MATLAB中,可以使用quadgk函数来使用积分变换法进行数值积分。
总之,MATLAB提供了许多数值积分的函数,选择合适的数值积分方法可以根据具体问题的要求来确定。
matlab数值计算杜哈梅尔积分

Matlab是一种用于数学建模、仿真和数据分析的计算机软件,它广泛应用于工程、科学和经济领域。
杜哈梅尔积分是一种常见的数值积分方法,它可以用来计算一些特定类型的积分。
在本文中,我们将介绍matlab如何用于进行杜哈梅尔积分的数值计算。
一、杜哈梅尔积分的原理在数学中,积分是求曲线下面积的一个常见操作。
而杜哈梅尔积分是一种数值积分方法,它通过将被积函数进行离散化处理,然后采用插值方法来近似计算积分值。
具体原理如下:1. 网格划分:首先将积分区间进行网格划分,将被积函数在每个网格点上进行采样。
2. 插值:利用插值方法对采样点进行插值,得到近似的积分函数。
3. 积分计算:对插值得到的积分函数进行数值积分,得到最终的积分值。
二、Matlab中的杜哈梅尔积分计算Matlab提供了丰富的数值计算工具和函数,其中包括了用于进行杜哈梅尔积分计算的函数。
在Matlab中,可以使用以下步骤进行杜哈梅尔积分的数值计算:1. 网格划分:利用linspace函数对积分区间进行网格划分,得到采样点。
2. 采样:将被积函数在采样点上进行采样,得到函数值。
3. 插值:利用interp1函数对采样点进行插值,得到近似的积分函数。
4. 积分计算:利用trapz函数对插值得到的积分函数进行数值积分,得到最终的积分值。
三、实例分析下面通过一个具体的实例来演示在Matlab中如何进行杜哈梅尔积分的数值计算。
假设我们要计算下面的积分:∫(2x+3)dx,积分区间为[0,5]。
我们可以使用linspace函数对积分区间进行网格划分,得到采样点:x = linspace(0, 5, 1000);将被积函数在采样点上进行采样,得到函数值:y = 2 .* x + 3;接下来,利用interp1函数对采样点进行线性插值,得到近似的积分函数:f = interp1(x, y, 'linear');利用trapz函数对插值得到的积分函数进行数值积分,得到最终的积分值:integral_value = trapz(x, f);通过上述步骤,我们可以在Matlab中得到该积分的数值近似值。
matlab中求积分的命令

matlab中求积分的命令求积分是数学中的一个重要概念,也是数学分析中的基础内容。
在MATLAB中,我们可以使用一些特定的命令来实现对函数的积分计算,从而得到函数的解析式或数值结果。
本文将介绍一些常用的MATLAB求积分命令,并探讨其在实际问题中的应用。
一、MATLAB中的求积分命令在MATLAB中,求积分的命令主要有两种:符号积分和数值积分。
下面分别介绍这两种求积分的命令及其使用方法。
1. 符号积分命令符号积分是指对给定的函数进行解析求积分,得到一个含有未知常数的解析式。
在MATLAB中,可以使用符号积分命令'int'来进行符号积分的计算。
其基本语法为:int(f, x) 或 int(f, x, a, b)其中,f表示被积函数,x表示积分变量,a和b表示积分区间的上下限。
例如,要对函数f(x) = x^2进行符号积分,可以使用以下命令:syms xf = x^2;F = int(f, x)这样,MATLAB将输出函数F(x) = (1/3)x^3,即f(x)的积分结果。
2. 数值积分命令数值积分是指对给定的函数进行数值近似求积分,得到一个数值结果。
在MATLAB中,可以使用数值积分命令'integral'来进行数值积分的计算。
其基本语法为:Q = integral(fun, a, b)其中,fun表示被积函数的函数句柄,a和b表示积分区间的上下限。
例如,要对函数f(x) = exp(-x^2)进行数值积分,可以使用以下命令:f = @(x) exp(-x^2);Q = integral(f, -inf, inf)这样,MATLAB将输出数值结果Q,即f(x)的积分值。
二、MATLAB求积分命令的应用MATLAB中的求积分命令在工程和科学计算中有着广泛的应用。
下面将介绍两个实际问题的求解过程,以展示这些命令的应用。
1. 求解概率密度函数的积分概率密度函数是统计学中的一个重要概念,用于描述随机变量的概率分布。
MATLAB教程第8章MATLAB数值积分与微分

MATLAB教程第8章MATLAB数值积分与微分1.数值积分数值积分是计算函数的定积分值的近似方法。
在MATLAB中,有几个函数可以帮助我们进行数值积分。
(1) quad函数quad函数是MATLAB中用于计算一维定积分的常用函数。
它的语法如下:I = quad(fun, a, b)其中,fun是被积函数的句柄,a和b分别是积分区间的下界和上界,I是近似的积分值。
例如,我们可以计算函数y=x^2在区间[0,1]内的积分值:a=0;b=1;I = quad(fun, a, b);disp(I);(2) integral函数integral函数是在MATLAB R2024a版本引入的新函数,它提供了比quad函数更稳定和准确的积分计算。
integral函数的语法如下:I = integral(fun, a, b)其中fun、a和b的含义与quad函数相同。
例如,我们可以使用integral函数计算函数y = x^2在区间[0, 1]内的积分值:a=0;b=1;I = integral(fun, a, b);disp(I);2.数值微分数值微分是计算函数导数的近似方法。
在MATLAB中,可以使用diff 函数计算函数的导数。
(1) diff函数diff函数用于计算函数的导数。
它的语法如下:derivative = diff(fun, x)其中,fun是需要计算导数的函数,x是自变量。
例如,我们可以计算函数y=x^2的导数:syms x;fun = x^2;derivative = diff(fun, x);disp(derivative);(2) gradient函数gradient函数可以计算多变量函数的梯度。
它的语法如下:[g1, g2, ..., gn] = gradient(fun, x1, x2, ..., xn)其中fun是需要计算梯度的函数,x1, x2, ..., xn是自变量。
例如,我们可以计算函数f=x^2+y^2的梯度:syms x y;fun = x^2 + y^2;[gx, gy] = gradient(fun, x, y);disp(gx);disp(gy);以上是MATLAB中进行数值积分和微分的基本方法和函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东北大学秦皇岛分校数值计算课程设计报告数值积分及Matlab实现学院数学与统计学院专业信息与计算科学学号*******姓名楚文玉指导教师张建波姜玉山成绩教师评语:指导教师签字:2015年07月14日1 绪论在科研计算中,经常会碰到一些很难用公式定理直接求出精确解的积分问题,对于这类问题,我们一般转化为数值积分问题,用计算机来实现求解问题. 1.1 课题的背景对于定积分()ba f x dx ⎰在求某函数的定积分时,在一定条件下,虽然有牛顿-莱布里茨公式()()()baI f x dx F b F a ==-⎰可以计算定积分的值,但在很多情况下的原函数()f x 不易求出或非常复杂.被积函数的原函数很难用初等函数表达出来,例如2sin (),x x f x e x-=等;有的函数()f x 的原函数()F x 存在,但其表达式太复杂,计算量太大,有的甚至无法有解析表达式.因此能够借助牛顿-莱布尼兹公式计算定积分的情形是不多的.另外,许多实际问题中的被积函数()f x 往往是列表函数或其他形式的非连续函数,对这类函数的定积分,也不能用不定积分方法求解,只能设法求其近似值.因此,探讨近似计算的数值积分方法是有明显的实际意义的,即有必要研究定积分的数值计算方法,以解决定积分的近似计算.而数值积分就是解决此类问题的一种有效的方法,它的特点是利用被积函数在一些节点上的信息求出定积分的近似值.微积分的发明是人类科学史上一项伟大的成就,在科学技术中,积分是经常遇到的一个重要计算环节数值积分是数学上重要的课题之一,是数值分析中重要的内容之一.随着计算机的出现,近几十年来,对于数值积分问题的研究已经成为一个很活跃的研究领域.现在,数值积分在计算机图形学,积分方程,工程计算,金融数学等应用科学领域都有着相当重要的应用,所以研究数值积分问题有着很重要的意义.国内外众多学者在数值积分应用领域也提出了许多新方法.在很多实际应用中,只能知道积分函数在某些特定点的取值,比如天气测量中的气温、湿度、气压等,医学测量中的血压、浓度等等.通过这个课题的研究,我们将会更好地掌握运用数值积分算法求出特殊积分函数的定积分的一些基本方法、理论基础;并且通过Matlab 软件编程的实现,应用于实际生活中. 1.2 课题的主要内容框架1.2.1 数值积分各求积公式简介简介牛顿-柯特斯求积公式及其辛普森求积公式,龙贝格求积公式,高斯求积公式的基本理论基础和方法. 1.2.2 求积公式的代码实现通过理解各种数值积分求积公式的原理方法,通过Matlab 软件编程,实现以上求积公式. 1.2.3 应用举例通过简单举例,自建一个相对简单和复杂的函数,用上面编写的Matlab 源程序来解决实际问题,体会数值积分和Matlab 的优势.2 牛顿-柯特斯公式及Matlab 实现2.1 牛顿-柯特斯公式的基本原理方法设将积分区间[a, b]划分为n 等分,步长为b ah n-=,选取等距节点k x a kh =+构造出的差值型求积公式()0()()nn n k k k I b a C f x ==-∑, (2.1)称为牛顿-柯特斯公式,式中()n k C 称为柯特斯系数.根据()bk a A l x dx =⎰, 0,1,2,,.k n = (2.2)引进变量代换x a th =+,则有()0000(1)()!()!n kn n n n n kj j j kj kh t j Cdt t j dt b a k j nk n k -==≠≠--==----∏∏⎰⎰ (2.3) 当n = 2时,此时柯特斯系数为(2)16C =,(2)146C =,(2)216C =,相应的求积公式就是辛普森求积公式:()4()()62b a a b S f a f f b -+⎡⎤=++⎢⎥⎣⎦(2.4)2.2 牛顿-柯特斯公式的Matlab实现function[C, g] = NCotes(a, b, n, m)% a,b分别为积分的上下限;% n是子区间的个数;% m是被调用第几个被积函数;% 当n=1时计算梯形公式;当n=2时计算辛普森公式,以此类推;I = n;h = (b - a) / i;z = 0;for j = 0 : ix(j + 1) = a + j * h;s = 1;if j == 0s = s;elsefor k=1 : js =s * k;endendr = 1;if i - j == 0r = r;elsefor k = 1 : (I - j)r = r * k;endendif mod((I - j), 2) == 1q = -(I * s * r); elseq = i * s * r; end y = 1; for k = 0 : i if k ~= jy = y * (sym('t') - k); end endl = int(y, 0 , i); C(j + 1)= l / q;z = z + C(j + 1)*f1(m, x(j + 1)); endg=(b - a)*z3 复合求积公式及Matlab 实现3.1 复合梯形公式的基本原理将区间[a , b ]划分成n 等分,分点k x a kh =+,,0,1,b ak n n-=,在每个子区间[1,k k x x +](0,1,1k n =-)上采用梯形公式得: 11110()()[()()]()2k kn n bx k k n ax k k h I f x dx f x dx f x f x R f +--+=====++∑∑⎰⎰(3.1)记11100[()()][()2()()]22n n n k k k k k h hT f x f x f a f x f b --+===+=++∑∑ (3.2)称式(3.2)为复合梯形公式. 3.2 复合梯形公式的Matlab 实现function s = trapr1(f, a, b, n) % f 表示被积函数; % a ,b 表示积分上下限; % n 是子区间的个数; h = (b - a) / n; s = 0;for k = 1 : (n - 1) x = a + h * k; s = s + feval('f', x); end format longs = h*(feval('f', a) + feval('f', b)) / 2 + h * s; 3.3 复合辛普森求积公式的基本原理将区间[a,b]分等分,在每一个子区间1,k k x x +]上采用辛普森公式,若记1/212k k x x h +=+,则得1111/210()()[()4()()]()6k kn n bx k k k n ax k k h f x dx f x dx f x f x f x R f +--++====+++∑∑⎰⎰(3.3)记1111/211/2001[()4()()][()4()2()()]66n n n n k k k k k k k k h hS f x f x f x f a f x f x f b ---+++====++=+++∑∑∑(3.4)称式(3.4)为复合辛普森求积公式. 3.4 复合辛普森求积公式的Matlab 实现 function s = simpr1(f, a, b, n) % f 表示被积函数; % a ,b 表示积分上下限; % n 是子区间的个数; h = (b - a) / (2 * n);s1 = 0; s2 = 0; for k = 1 : nx = a + h * (2*k - 1); s1 = s1 + feval('f', x); endfor k = 1 : (n - 1) x = a + h * 2 * k; s2 = s2 + feval('f', x); ends = h*(feval('f', a) + feval('f', b) + 4 * s1 + 2 * s2) / 3;4 龙贝格求积公式及Matlab 实现4.1 龙贝格算法的基本原理由梯形的递推法可以看出,将积分区间等分时,用复化梯形公式计算的结果2N T 作为积分I 的近似值,其误差近似值为21()3N N T T - (4.1) 可以设想,如果用这个误差作为2N T 的一种补偿,即将22241()341NN N N N T T T T T -+-=- (4.2) 作为积分的近似值,可望提高其精确度.直接根据复化求积公式,不难验证22241()341N N N N N N T T S T T T -=+-=- (4.3)这说明,将区间对分前后两次复化梯形公式的值,按式222211()()341N N N N N N I T T T T T T ≈+-=+-- (4.4)作线性组合恰好等于复合辛普森公式的值N S ,它比2N T 更接近于近似值. 同样,根据2222211(S )(S )1541N N N N N N I S S S S ≈+-=+-- (4.5) 用2N S 于N S 作线性组合会得到比2N S 更精确的值,且通过直接验证可得222224S 1(S )1541N N N NN N S C S S -=+-=- (4.6) 再由222211(C )(C )6341N N N N N I C C C ≈+-=-- (4.7) 用2N C 与N C 作线性组合,又可得到比2N C 更精确的值,通常记为R N ,即322234C 1R (C )6341N N N NN N C C C -≈+-=- (4.8) 此式(4.8)就称为龙贝格求积公式.上述用若干积分近似值推算出更为精确的积分近似值得方法,称为外推法.我们将 序列{T },{S },{C },{R }N N N N 分别称为梯形序列,辛普森序列,柯特斯序列和龙贝格序列.由龙贝格序列求积的算法称为龙贝格算法.具体步骤为: 第一步:算出(a)f 和(b)f 的值,根据公式1211(a (2j 1))(N 2,k 1,2,)222N k NN j b a b a T T f N N-=--=++-==∑ (4.9) 求出1T ;第二步:将区间[a,b]分半,算出()2a bf +的值,并根据(4.3)和(4.9)式计算2T 和1S ; 第三步:再将区间分半,算出()4b a f a -+及(3)4b af a -+⨯的值,并根据(4.3)和(4.9)式计算4T 和2S ,再有公式(4.4)求出1C ;第四步:再将区间分半,计算8T ,4S , 2C ,并根据公式(4.5)计算1R . 第五步:再将区间分半,类似上述过程计算16T ,8S , 4C ,2R .重复以上步骤即可得到1R ,2R,一直到龙贝格序列中前后两项的绝对值差不超过给定的误差险为止.4.2 龙贝格算法的Matlab 实现function [R, quad, err, h]=romber(f, a, b, n, delta)% f表示被积函数;% a,b表示积分上下限;% n是子区间的个数% delta是误差限M = 1;h = b - a;err = 1J = 0;R = zeros(4, 4);R(1, 1) = h * (feval('f', a) + feval('f', b)) / 2while ((err > delta) & (J < n) ) | (J < 4)J = J + 1;h = h / 2;s = 0;for p = 1 : Mx = a + h * (2*p - 1);s = s + feval('f', x);endR(J + 1, 1) = R(J, 1) / 2 + h*s;M = 2*M;for K = 1 : JR(J + 1,K + 1) = R(J + 1, K) + (R(J + 1,K) - R(J, K)) / (4^K - 1); enderr = abs(R(J, J) - R(J + 1,K + 1));endquad = R(J + 1, J + 1);5 高斯-勒让德求积公式及Matlab 实现5.1 高斯-勒让德求积公式的基本原理在高斯求积公式()()()nbk k ak f x x dx A f x ρ=≈∑⎰(5.1)中,若取权函数()x ρ=1,区间[-1,1],则得公式1-1()()nk k k f x dx A f x =≈∑⎰(5.2)我们知道勒让德多项式是区间[-1,1]上的正交多项式,因此,勒让德多项式1()n P x +的零点就是求积公式(5.2)的高斯点,形如(5.1)式的高斯公式特别的称为高斯-勒让德求积公式.如下表5.1所示为高斯-勒让德求积公式的节点数和系数. 5.2 高斯-勒让德求积公式的Matlab 实现 function quad = gauss8(f ,a, b, x, A) N = length(x); T = zeros(1, N);T = (a + b) / 2 + ((b - a) / 2) * x;quad = ((b - a) / 2) * sum(A. * feval('f', T));表5.1 高斯-勒让德求积公式的节点数和系数6 各个求积公式的应用举例与比较分析6.1 简单数值积分10sin xdx x的解(精确值0.946083070367183)6.1.1 牛顿-柯特斯当n=1时的梯形算法和n=2时的辛普森算法的结果解:先用M文件定义一个f1.m的函数function f = f1(i, x)g(1) = sqrt(x);if x == 0g(2) = 1;elseg(2) = sin(x) / x;endf = g(i);输入>>Ncotes(0, 1, 1, 2)回车得到;ans =0.9270输入>>Ncotes(0, 1, 2, 2)回车得到:ans =0.94616.1.2 复合梯形公式和复合辛普森求积公式的计算结果解:建立一个M文件定义一个f.m函数function y = f(x)if x == 0y = 1;elsey = sin(x) / xend输入>>trapr1(‘f’, 0, 1, 10)回车得到:ans =0.9458输入>>simpr1(‘f’, 0, 1, 10)ans =0.946110 )6.1.3 龙贝格求积公式的计算结果(取误差不超过10解:建立一个M文件定义一个f.m函数function y = f(x)if x == 0y = 1;elsey = sin(x) / xend输入>>romber(‘f’, 0, 1, 10,0.5*10^(- 10))回车得到:quad =0.9461ans =0.9207 0 0 0 00.9398 0.9461 0 0 00.9445 0.9461 0.9461 0 00.9457 0.9461 0.9461 0.9461 00.9460 0.9461 0.9461 0.9461 0.9461 6.1.4 高斯-勒让德求积公式的计算结果(给定节点3) 解:建立一个M 文件定义一个f.m 函数 function y = f(x) ; y = sin(x) / x; 输入 >>gauss8(‘f ’,0,1,[-0.7745966692,0.7745966692,0],[0.5555555556,0.5555555556,0.8888888888]) 回车得到: ans = 0.89566.2 复杂数值积分2201(cos 1x dx x π-+⎰的解(精确值-1.8785) 6.2.1 牛顿-柯特斯当n = 1时的梯形算法和n = 2时的辛普森算法的结果 解:先用M 文件定义一个f1.m 的函数 function f = f1(i, x) g(1) = sqrt(x); if x == 0 g(2) = 1; elseg(2) = cos(x) – 1 / (1 + x.^2) – 1 / (4.*sqrt(4 + x.^2)); end f = g(i);输入>>Ncotes(0, 2*pi, 1, 2) 回车得到 ans = -1.8692输入>>Ncotes(0, 2*pi, 2, 2)回车得到ans =-1.87046.2.2 复合梯形公式和复合辛普森求积公式的计算结果解:先用M文件定义一个f1.m的函数function y = f(x)if x == 0y = 1;elsey = cos(x) – 1 / (1 + x.^2) – 1 / (4.*sqrt(4 + x.^2)); end输入>>trapr1(‘f’, 0, 2*pi, 10)回车得到:ans =-1.8748输入>>simpr1(‘f’, 0, 2*pi, 10)ans =-1.869410 )6.2.3 龙贝格求积公式的计算结果(取误差不超过10解:先用M文件定义一个f1.m的函数function y = f(x)if x == 0y = 1;elsey = cos(x) – 1 / (1 + x.^2) – 1 / (4.*sqrt(4 + x.^2)); end输入>>romber(‘f’, 0, 2*pi ,10,0.5*10^(-10))回车得到:quad =-1.87646.3 各个求积公式的比较分析(以10sin xdx x的各个积分结果为例)表6.1各个数值积分的比较牛顿-柯特斯方法是一种利用插值多项式来构造数值积分的常用方法,这其中梯形积分方法的误差最大,近似效果最差,辛普森方法的精度比梯形积分高了一个数量级,它的代数精度比梯形积分的代数精度高,能更好地近似积分值;牛顿-柯特斯积分方法的误差比辛普森积分精度高两个数量级.复合梯形积分方法比单独的梯形积分精度高,龙贝格方法收敛速度快、计算精度较高,但是计算量较大.高斯求积方法积分精度高、数值稳定、收敛速度较快,但是节点与系数的计算较麻烦,而且要求已知积分函数.结论本文主要讨论了数值积分的计算方法并通过MATLAB软件编程实现,通过前面的研究我们知道求数值积分近似值的计算方法很多,包括牛顿-柯特斯求积公式、复合求积公式、龙贝格求积公式、高斯求积公式等等.其中牛顿-柯特斯方法是一种利用插值多项式来构造数值积分的常用方法,这其中梯形积分方法的误差最大,近似效果最差,辛普森方法的精度比梯形积分高了一个数量级,它的代数精度比梯形积分的代数精度高,能更好地近似积分值;牛顿-柯特斯积分方法的误差比辛普森积分精度高两个数量级.因此,一般情况下,代数精度越高,积分公式计算精度也越高.但是高阶的牛顿-柯特斯方法的收敛性没有保证,因此,在实际计算中很少使用高阶的牛顿-柯特斯公式.复合梯形积分方法比单独的梯形积分精度高,它的积分精度和被积函数有关,还和复合积分时的步长有关.复合辛普森积分公式比单独的辛普森积分公式高近7个数量级,效果明显.龙贝格方法收敛速度快、计算精度较高,但是计算量较大.高斯求积方法积分精度高、数值稳定、收敛速度较快,但是节点与系数的计算较麻烦、而且要求已知积分函数.一般来说,牛顿-柯特斯方法的代数精度越高,数值积分的效果越好、越精确.当积分区间比较大的时候,可以采用复化积分方法可以得到更好的效果;变步长积分方法不仅可以很好地控制计算误差,并且可以寻找到适当的积分步长;龙贝格积分方法可以更好地利用变步长复合积分公式得到的积分序列从而得到更为精确的数值结果,是一个较好的数值积分方法.高斯求积方法精确度高,收敛性快也是一种很优秀的数值积分方法.参考文献[1]张德丰. Matlab数值分析与应用[M]. 北京: 国防工业出版社, 2007. 1-1[2]胡良剑, 孙晓君.MATLAB数学实验[M]. 北京: 高等教育出版社, 2006[3]李庆扬, 王能超, 易大义. 数值分析[M]. 北京: 清华大学出版社, 2008。