简介
Newton-Cotes 公式在构造时,限定积分区间的等分点作为求积节点,这样做在简化处理的同时也限制了代数精度。如果求积节点也可自由选择,即机械求积公式:
∫ a b f ( x ) d x ≈ ( b − a ) ∑ i = 0 n λ i f ( x i ) \ \int_a^b{f\left( x \right) dx\approx \left( b-a \right) \sum_{i=0}^n{\lambda _if\left( x_i \right)}} ∫abf(x)dx≈(b−a)i=0∑nλif(xi)
中的 λ i , x i λ_i, x_i λi,xi共 2n + 2 个均为待定参数,适当选取这些参数可以使公式具有 2n + 1 次代数精度。这种高精度的求积公式称为Gauss 公式。
参数选择
代码
#include<iostream>
#include<math.h>
using namespace std;
double a,b;
double g[3][3]={{0},{-1/sqrt(3.0),-1/sqrt(3.0)},{-sqrt(3.0/5.0),0,sqrt(3.0/5.0)}};
double m[3][3]={{1},{0.5,0.5},{5.0/18.0,4.0/9.0,5.0/18.0}};
double f(double x){
return x*x ;
}
double guassi( int n)
{
double re = 0;
double x = (a+b)/2.0, y = (b-a)/2.0;
for(int i=0;i<n;i++)
{
re += m[n-1][i] * f( x + y*g[n-1][i] );
// cout<<f( x + y*g[n-1][i] )<<endl;
// cout<<re<<endl;
}
return re*(b-a);
}
int main()
{
int n;
cout<<"输入要积分的点的个数"<<endl;
cin>>n;
cout<<"输入积分区间"<<endl;
cin>>a>>b;
double re = guassi( n);
cout<<"结果是:"<<re<<endl;
return 0;
}
结果是(默认函数为
f
(
x
)
=
x
×
x
f(x) = x\times x
f(x)=x×x):