给定一个连续函数以及积分区间,编写程序计算它的定积分(至少两种积分方法),比较不同方法的精度及误差。C++
时间: 2023-08-12 19:06:02 浏览: 66
数值分析数值积分实验报告.docx
下面是两种积分方法的实现:
方法一:梯形法
梯形法是一种比较简单的数值积分方法,它的基本思想是将一个区间分成若干个小梯形,然后计算这些小梯形的面积之和,从而得到区间上函数的积分值。
下面是梯形法的 C++ 代码实现:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
double f(double x) {
return sin(x);
}
double trapezoidal(double a, double b, int n) {
double h = (b - a) / n;
double sum = 0.5 * (f(a) + f(b));
for (int i = 1; i < n; i++) {
double x = a + i * h;
sum += f(x);
}
return sum * h;
}
int main() {
double a = 0, b = 3.14159265358979323846;
int n = 1000;
double exact = 2.0;
double approx = trapezoidal(a, b, n);
double error = fabs(approx - exact);
cout << "Exact value: " << exact << endl;
cout << "Approximate value: " << approx << endl;
cout << "Error: " << error << endl;
return 0;
}
```
方法二:辛普森法
辛普森法是一种更加精确的数值积分方法,它的基本思想是将一个区间分成若干个小梯形和小三角形,然后计算这些小梯形和小三角形的面积之和,并且对于每一个小梯形和小三角形,都假设它们的函数值为一个二次多项式,从而得到区间上函数的积分值。
下面是辛普森法的 C++ 代码实现:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
double f(double x) {
return sin(x);
}
double simpson(double a, double b, int n) {
double h = (b - a) / n;
double sum1 = 0, sum2 = 0;
for (int i = 1; i < n; i += 2) {
double x = a + i * h;
sum1 += f(x);
}
for (int i = 2; i < n; i += 2) {
double x = a + i * h;
sum2 += f(x);
}
return (f(a) + f(b) + 4 * sum1 + 2 * sum2) * h / 3;
}
int main() {
double a = 0, b = 3.14159265358979323846;
int n = 1000;
double exact = 2.0;
double approx = simpson(a, b, n);
double error = fabs(approx - exact);
cout << "Exact value: " << exact << endl;
cout << "Approximate value: " << approx << endl;
cout << "Error: " << error << endl;
return 0;
}
```
我们可以通过改变 n 的值来比较不同方法的精度及误差。一般来说,n 越大,计算出来的积分值越精确,但是计算的时间也会更长。
阅读全文