特点:Cotes 系数仅取决于 n 和 i,可通过查表得到。与被积函数 f (x) 及积分区间 [a, b] 均无关。
梯形求积公式的几何意义:用梯形面积近似代替曲边梯形的面积。梯形公式的余项为 代数精度 = 1
n = 2:
Simpson求积公式(为抛物线求积公式)
辛普森公式的余项为 代数精度 = 3
n = 4: 科特斯(Cotes)求积公式(五点公式)
柯特斯公式的余项为 柯特斯公式具有5次代数精度
科特斯系数具有以下特点:
(1) 当 n ? 8 时,出现负数,稳定性得不到保证。而且当 n 较大时,由于Runge现象,收敛性也无段派法保握燃贺证。一般不采用高阶的牛顿-科特斯求积公式。
当 n ? 7 时,牛顿-科特斯公式是稳定的。
当 n 为偶数时,牛顿-科特斯公式至少有 n+1 阶代数精度。
牛顿-柯特斯公式的舍入误差只是函数值误差的
复化求积公式特点
直接使用牛顿-柯特斯公式余项将会较大当n>8时,公式的舍入误差又很难得段键到控制此时,使用复化方法,然后在每个小区间上使用低阶牛顿-柯特斯公式,最后将每个小区间上的积分的近似值相加,这种方法称为复化求积法
复化梯形公式余项为 误差是阶 即复化梯形公式是收敛的
误差是h4阶, 复化辛普森公式是收敛的时,复化柯特斯公式也是收敛的三种复化公式的的余项
将Simpson一元函数积分**************//***************拓展到任意一个牛顿柯特斯积分****
#include<iostream>
#include<math.h>
using namespace std
//设置全局数组——牛顿 科特斯公式系数表
double C[6][7]={{1.0/2,1.0/2},{1.0/6,4.0/6,1.0/6},{1.0/8,3.0/嫌肆8,3.0/8,1.0/8},
{7.0/90,16.0/45,2.0/15,16.0/45,7.0/90},
{19.0/288,25.0/96,25.0/144,25.0/144,25.0/96,19.0/188},
{41.0/840,9.0/35,9.0/280,34.0/105,9.0/280,9.0/35,41.0/840}}
int main()
{
double a=0.0,b=0.0,Cotes=0.0
int n=0
cout<<"请分别输入积分段的下届和上届:"<<endl
cin>>a>>b
cout<<"请输入您想设置的分段数(节点数-1):"<<endl
cin>>n
//检测输入
while(!(n>=1&&n<=6))
{
cout<<"分段数最多为6,请重新输入"<<endl
cin>>n
}
//计算科特斯公式的值
for(int j=0j<=nj++)
Cotes=Cotes+C[n-1][j]*log((j*(b-a)/n)+a)//函数f(x)为f(x)=ln x 这里你可以自己改为你想要的函数 当然也可以像你芹喊轿的代码一渗消样通过函数指针传递f(x)表达式~~
Cotes=(b-a)*Cotes
cout<<"牛顿—柯特斯公式计算积分的结果是"<<Cotes<<endl
return 0
%Newton-Cotes求积公式州中敏的MATLAB程序 %调用格式:册枝f=inline('sqrt(x)')a=0.5b=1n=6
newtoncotes(f,a,b,n)
function s=newtoncotes(f,a,b,n) %f:要求函数 %a,b:区间 %n:等分数
format long%设置精度 syms t
h=(b-a)/n %计算步长培皮 C=zeros(1,n+1)
%求Newton-Cotes系数 j=1
for k=0:n d=1
J=((-1)^(n-k))/(n*prod(1:k)*prod(1:n-k))for i=0:n if i~=k
d=d*(t-i)end end
C(j)=J*int(d,0,n)j=j+1 end
%求定积分
s=0j=1
for k=0:n
s=s+C(j)*feval(f,a+k*h)j=j+1end
s=s*(b-a) %输出结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)