Advertisement
Norvager

Интег

Nov 12th, 2021
647
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #define _CRT_SECTRE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cmath>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. double func(double x) {
  8.     return sqrt(0.2 * x) * cos(0.02 * x);
  9. }
  10. vector<double> init(double n, double a, double b) {
  11.     vector<double> ans;
  12.     double step = (b - a) / n;
  13.     for (int i = 0; i <= n+1; i++) {
  14.         if (!ans.size()) {
  15.             ans.push_back(step);
  16.         }
  17.         else {
  18.             ans.push_back(a);
  19.             a += step;
  20.         }
  21.     }
  22.     return ans;
  23. }
  24. void output(vector<double> vec) {
  25.     printf("For %d intervals\n", vec.size() - 2);
  26.     printf("Step = %.3lf\n", vec[0]);
  27.     for (int i = 1; i < vec.size(); i++) {
  28.         printf("%.3lf ", vec[i]);
  29.         if (9 == (i - 1) % 10) {
  30.             printf("\n");
  31.         }
  32.     }
  33.     printf("\n");
  34. }
  35. double methodLeft(vector<double> nodes) {
  36.     double sum = 0;
  37.     for (int i = 1; i < nodes.size() - 1; i++) {
  38.         sum += func(nodes[i]) * nodes[0];
  39.     }
  40.     return sum;
  41. }
  42. double methodRight(vector<double> nodes) {
  43.     double sum = 0;
  44.     for (int i = 2; i < nodes.size(); i++) {
  45.         sum += func(nodes[i]) * nodes[0];
  46.     }
  47.     return sum;
  48. }
  49. double methodMiddle(vector<double> nodes) {
  50.     double sum = 0;
  51.     for (int i = 1; i < nodes.size() - 1; i++) {
  52.         sum += 0.5 * (nodes[i+1] - nodes[i]) * (func(nodes[i]) + func(nodes[i + 1]));
  53.     }
  54.     return sum;
  55. }
  56. double methodSimpson(vector<double> nodes) {
  57.     double sum = 0;
  58.     for (int i = 1; i < nodes.size() - 1; i++) {
  59.         sum += (nodes[i + 1] - nodes[i]) / 6.0 * (func(nodes[i]) + 4.0 * func(0.5 * (nodes[i + 1] + nodes[i])) + func(nodes[i + 1]));
  60.     }
  61.     return sum;
  62. }
  63.  
  64. vector<double> iterate(vector<double> nodes) {
  65.     vector<double> ans;
  66.     ans.push_back(methodLeft(nodes));
  67.     ans.push_back(methodRight(nodes));
  68.     ans.push_back(methodMiddle(nodes));
  69.     ans.push_back(methodSimpson(nodes));
  70.     return ans;
  71. }
  72. int main() {
  73.     double a = 1.0;
  74.     double b = 3.0;
  75.     double n[4] = { 4.0, 20.0, 100.0, 400.0 };
  76.     vector<double> inter;
  77.     vector <vector<double>> result;
  78.     for (int i = 0; i < 4; i++) {
  79.         inter = init(n[i], a, b);
  80.         //output(inter);
  81.         result.push_back(iterate(inter));
  82.         inter.clear();
  83.     }
  84.     printf("%11.c |%6s    |%7s   |%8s  |%8s  |\n", ' ', "left", "right", "middle", "simpson");
  85.     for (int i = 0; i < result.size(); i++) {
  86.         printf("for n=%-5.0lf ", n[i]);
  87.         for (int j = 0; j < result[i].size(); j++) {
  88.             printf("|% 8.5lf  ", result[i][j]);
  89.         }
  90.         printf("|\n");
  91.     }
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement