【数值分析】微分求积:复化梯形、复化辛浦生
2014-08-19 16:08
429 查看
本科课程参见:《软件学院那些课》
![](http://img.my.csdn.net/uploads/201302/17/1361081046_6186.png)
,求积节点
![](http://img.my.csdn.net/uploads/201302/17/1361081071_1115.png)
,
![](http://img.my.csdn.net/uploads/201302/17/1361081096_3195.png)
在每个小区间
![](http://img.my.csdn.net/uploads/201302/17/1361081125_6891.png)
上应用梯形公式
![](http://img.my.csdn.net/uploads/201302/17/1361081147_6882.png)
然后将它们累加求和,作为所求积分I的近似值.
![](http://img.my.csdn.net/uploads/201302/17/1361081201_2675.png)
记
![](http://img.my.csdn.net/uploads/201302/17/1361081243_5475.png)
式为复化梯形求积公式,下标n表示将区间n等分。
![](http://img.my.csdn.net/uploads/201302/17/1361081346_9505.png)
view plaincopy
double f(double x){
if(x==0) return 1;
else return (sin(x)/x);
}
double FuhuaTixing(int n,double a,double b){
double h = (b-a)/n;
double x = a;
double s = 0;
for(int k=0; k< n-1; k++){
x += h;
s += f(x);
}
double T = (f(a)+s*2+f(b))*h/2;
return T;
}
int main(){
char ans='n';
do{
cout<<"请输入积分区间(a,b):"<<endl;
double a;
double b;
cin>>a>>b;
cout<<"请输入等分份数n: "<<endl;
int n; cin>>n;
cout<<"由复化梯形公式球的结果:"<<FuhuaTixing(n,a,b)<<endl;
cout<<"是否要继续?(y/n)";
cin>>ans;
}while(ans == 'y');
return 0;
}
![](http://img.my.csdn.net/uploads/201302/17/1361081715_2123.png)
的中点为
![](http://img.my.csdn.net/uploads/201302/17/1361081754_6228.png)
在每个小区间上应用辛普森公式,则有
![](http://img.my.csdn.net/uploads/201302/17/1361081779_4260.png)
其中
![](http://img.my.csdn.net/uploads/201302/17/1361081812_8634.png)
记
![](http://img.my.csdn.net/uploads/201302/17/1361081876_9222.png)
式为复化辛普森求积公式。
![](http://img.my.csdn.net/uploads/201302/17/1361081958_4842.png)
view plaincopy
double f(double x){
if (x==0)
return 1;
else return (sin(x)/x);
}
double Xinfusheng(double a,double b,int n){
double h = (b-a)/n;
double x = a+1/2*h;
double s = 4*f(x);
for(int k=1;k<n;k++){
x += 1/2*h;
s += 4*f(x);
x += 1/2*h;
s += 2*f(x);
}
double T=(f(a)+s+f(b))*h/6;
return T;
}
int main(){
char ans='n';
do{
cout<<"请输入积分区间(a,b):"<<endl;
double a;
double b;
cin>>a>>b;
cout<<"请输入等分份数n: "<<endl;
int n;
cin>>n;
cout<<"由复化梯形公式球的结果:"<<Xinfusheng(a,b,n)<<endl;
cout<<"是否要继续?(y/n)";
cin>>ans;
}while(ans == 'y');
return 0;
}
![](http://img.my.csdn.net/uploads/201302/17/1361082150_7985.png)
取n=2,4,8,16,精确解为0.9460831
![](http://img.my.csdn.net/uploads/201302/17/1361082194_8264.png)
2、比较两种方法运算的结果,复化辛甫生公式等分2份时实际要计算5个点的函数值,与复化梯形公式等分4份时计算量基本相同,但得到精度明显复化辛甫生公式要精确很多。
3、复化梯形公式和复化辛甫生公式对于光滑性较差的被积函数都能得到较为精确的结果,而且公式简单,十分利于编译简单的程序由计算机运算,因而得到广泛的应用。
4、实验中的主要误差来自于计算机浮点运算中的截余。
复化梯形
将积分区间[a,b]划分n等分,步长![](http://img.my.csdn.net/uploads/201302/17/1361081046_6186.png)
,求积节点
![](http://img.my.csdn.net/uploads/201302/17/1361081071_1115.png)
,
![](http://img.my.csdn.net/uploads/201302/17/1361081096_3195.png)
在每个小区间
![](http://img.my.csdn.net/uploads/201302/17/1361081125_6891.png)
上应用梯形公式
![](http://img.my.csdn.net/uploads/201302/17/1361081147_6882.png)
然后将它们累加求和,作为所求积分I的近似值.
![](http://img.my.csdn.net/uploads/201302/17/1361081201_2675.png)
记
![](http://img.my.csdn.net/uploads/201302/17/1361081243_5475.png)
式为复化梯形求积公式,下标n表示将区间n等分。
算法流程
![](http://img.my.csdn.net/uploads/201302/17/1361081346_9505.png)
算法代码
[cpp]view plaincopy
double f(double x){
if(x==0) return 1;
else return (sin(x)/x);
}
double FuhuaTixing(int n,double a,double b){
double h = (b-a)/n;
double x = a;
double s = 0;
for(int k=0; k< n-1; k++){
x += h;
s += f(x);
}
double T = (f(a)+s*2+f(b))*h/2;
return T;
}
int main(){
char ans='n';
do{
cout<<"请输入积分区间(a,b):"<<endl;
double a;
double b;
cin>>a>>b;
cout<<"请输入等分份数n: "<<endl;
int n; cin>>n;
cout<<"由复化梯形公式球的结果:"<<FuhuaTixing(n,a,b)<<endl;
cout<<"是否要继续?(y/n)";
cin>>ans;
}while(ans == 'y');
return 0;
}
复化辛复生
将积分区间[a,b]划分n等分,记子区间![](http://img.my.csdn.net/uploads/201302/17/1361081715_2123.png)
的中点为
![](http://img.my.csdn.net/uploads/201302/17/1361081754_6228.png)
在每个小区间上应用辛普森公式,则有
![](http://img.my.csdn.net/uploads/201302/17/1361081779_4260.png)
其中
![](http://img.my.csdn.net/uploads/201302/17/1361081812_8634.png)
记
![](http://img.my.csdn.net/uploads/201302/17/1361081876_9222.png)
式为复化辛普森求积公式。
算法流程
![](http://img.my.csdn.net/uploads/201302/17/1361081958_4842.png)
算法代码
[cpp]view plaincopy
double f(double x){
if (x==0)
return 1;
else return (sin(x)/x);
}
double Xinfusheng(double a,double b,int n){
double h = (b-a)/n;
double x = a+1/2*h;
double s = 4*f(x);
for(int k=1;k<n;k++){
x += 1/2*h;
s += 4*f(x);
x += 1/2*h;
s += 2*f(x);
}
double T=(f(a)+s+f(b))*h/6;
return T;
}
int main(){
char ans='n';
do{
cout<<"请输入积分区间(a,b):"<<endl;
double a;
double b;
cin>>a>>b;
cout<<"请输入等分份数n: "<<endl;
int n;
cin>>n;
cout<<"由复化梯形公式球的结果:"<<Xinfusheng(a,b,n)<<endl;
cout<<"是否要继续?(y/n)";
cin>>ans;
}while(ans == 'y');
return 0;
}
实验过程原始记录
分别用复化梯形公式和复化辛浦生公式计算定积分![](http://img.my.csdn.net/uploads/201302/17/1361082150_7985.png)
取n=2,4,8,16,精确解为0.9460831
![](http://img.my.csdn.net/uploads/201302/17/1361082194_8264.png)
实验结果及分析
1、用复化梯形公式和复化辛甫生公式都能得到较为准确的结果,且等分份数越多,结果的精度越高,梯形公式虽然在等分16份时得到精度与等分4份时相同,但已经越来越接近精确解。辛甫生公式由于C++运算中双精度数值(double)只有7位有效数字的限制,增加等分份数时不容易看出其精度的增加。2、比较两种方法运算的结果,复化辛甫生公式等分2份时实际要计算5个点的函数值,与复化梯形公式等分4份时计算量基本相同,但得到精度明显复化辛甫生公式要精确很多。
3、复化梯形公式和复化辛甫生公式对于光滑性较差的被积函数都能得到较为精确的结果,而且公式简单,十分利于编译简单的程序由计算机运算,因而得到广泛的应用。
4、实验中的主要误差来自于计算机浮点运算中的截余。
相关文章推荐
- 【数值分析】微分求积:复化梯形、复化辛浦生
- 复化梯形求积公式 c语言实现 数值积分
- 【数值分析】复化积分公式
- 梯形方法(数值分析 c++)
- 【数值分析】复化积分公式
- 变步长梯形求积公式 c语言实现 数值积分
- 数值分析之龙贝格求积法
- 数值作业:变步长梯形求积算法计算积分C语言实现
- 数值积分之复化求积法
- 微分求积:复化梯形、复化辛浦生
- 变步长复化梯形法求积
- 复化梯形和复化辛普生公式,积分函数在0~1上积分结果应该是PI
- C++与matlab混合编程基于主成份分析算法的数值分析(二)
- lucene-2.9.0 数值类型的索引和检索分析
- 复化辛甫生求积
- 超松弛法(C++ 数值分析)
- C++与matlab混合编程基于主成份分析算法的数值分析(一)
- 欧拉折线法求解线性方程组(c++ 数值分析)
- 理查森外推求数值微分
- 关于数值分析和LCP问题的一些开源项目