问题的引入
在实际生活中我们常遇到数值积分的求积问题,虽然我们也学过求数值积分的一些方法,但是由于用插值多项式L(x)近似表达函数f(x)时存在截断误差,即有插值余项,因此插值型求积公式也有相应的余项。存在求函数f(x)在区间[a,b]上的定积分,以及f(x)在给定点上的值的数值方法,为了克服求f(x)的原函数可能遇到的困难和便于计算,我们利用牛顿——科茨来计算。其中还推导它的两种特殊形式——梯形求积公式和辛普森求积公式,并对这三种求积公式(梯形公式、辛普森公式和柯茨公式)进行了分析和比较。
代码的实现
Newton-Cotes.h
#include <iostream>
#include <cmath>
using namespace std;
class Newton_Cotes{
public:
double a, b, h, core[100], f[100];
int n;
//牛顿——科茨公式的求积系数
double c[7][9] = { {2, 1,1}, {6, 1, 4,1}, {8, 1, 3,3,1}, {90, 7, 32, 12,32,7}, {288, 19, 75, 50,50,75,19}, {840, 41, 216, 27, 272,27,216,41},
{17280, 751, 3577,1323, 2989,2989,1323,3577,751} };
Newton_Cotes(){}
void input() {
cout << "输入积分区间:" << endl;
cin >> a >> b;
cout << "需要将区间n等分 n=" << endl;
cin >> n;
h = (b - a) / n;
//输入纵坐标的对应值
cout << "输入横坐标x对应的纵坐标y的值:" << endl;
for (int i = 0; i <= n; i++) {
cout << "x[" << i << "] = " << a + i * h << " y[" << i << "] = ";
cin >> f[i];
}
}
double run() {
double sum = 0;
for (int i = 0; i <= n; i++) {
double x = c[n - 1][i + 1];
sum += x * f[i];
}
sum = sum / c[n - 1][0] * (b - a);
return sum;
}
private:
};
Newton-Cotes.cpp
#include <iostream>
#include "Newton-Cotes.h"
using namespace std;
int main() {
Newton_Cotes nw;
nw.input(); //输入区间和纵坐标的值
double result = nw.run();
cout << "输出结果:" << result << endl;
return 0;
}