- 问题描述
设计复化辛浦生求积算法,并求函数f(x) = sin(x)在区间[0,1]的积分。
- 算法思想
把整个区间分成N份,每个小区间用辛浦生公式求解,最后在累加即可。
- 复化辛浦生求积公式
- 算法实现
#include <iostream>
#include <math.h>
using namespace std;
//保存生成的节点横坐标
double dataX[1000];
//保存生成的节点纵坐标
double dataY[1000];
//定义一个数学函数
double function(double x);
//分割区间
void devide(double a,double b,int N);
//复化辛普生求积
double getIntegralValue(double a,double b,int N);
int main()
{
//产生的节点数
double a,b ;
int N;
char ch = 'n';
while(ch != 'y')
{
cout<<"请输入等分区间数:";
cin>>N;
cout<<"请输入左右区间范围:";
cin>>a;
cin>>b;
devide(a,b,N);
cout<<"积分值为:"<<getIntegralValue(a,b,N)<<endl;
cout<<"是否继续?按y退出:";
cin>>ch;
}
return 0;
}
//定义一个数学函数
double function(double x)
{
return sin(x);
}
//分割区间
void devide(double a,double b,int N)
{
double x;
double dX = (b - a) /(N) ;
for(int i=0;i<=N;i++)
{
x = a + i * dX;
dataX[i] = x;
dataY[i] = function(x);
}
}
//复化梯形求积
double getIntegralValue(double a,double b,int N)
{
double sum = 0;
//求2*f(xk)+4*f(k+0.5)的总和,1<= k <= n-1
for(int i=1;i<=N-1;i++)
{
sum += 2*dataY[i];
}
for(int i=1;i<=N;i++)
{
sum +=4*function((dataX[i]+dataX[i-1])/2);
}
double value = ((b-a)/(6*N))*(dataY[0] + sum + dataY[N]);
return value;
}
- 运行截图