Geradot345

лб6

Jun 2nd, 2021
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.44 KB | None | 0 0
  1. // f1 = -(3 * cos(x) * pow(sin(x), 2) / pow(1 + pow(sin(x), 3), 2)),
  2. // f2 = (3 * pow(sin(x), 3) / pow(1 + pow(sin(x), 3), 2)) - (6 * sin(x) * pow(cos(x), 2) / pow(1 + pow(sin(x), 3), 2)) + (18 * pow(cos(x), 2) * pow(sin(x), 4) / pow(1 + pow(sin(x), 3), 3));
  3.  
  4.  
  5. #include <iostream>
  6. #include <cmath>
  7. #include <iomanip>
  8. using namespace std;
  9.  
  10. double f(double x) {
  11. return (1 / (1 + pow(sin(x), 3))); // наша функция
  12. };
  13.  
  14. double F1(double x) {
  15. return (-(3 * cos(x) * pow(sin(x), 2) / pow(1 + pow(sin(x), 3), 2))); // первая производная функции
  16. };
  17.  
  18. double F2(double x) {
  19. return(3 * sin(x) * pow(pow(sin(x), 3) + 1, -2) * (pow(sin(x), 2) + pow(cos(x), 2) * (6 * pow(sin(x), 3) * pow(pow(sin(x), 3) + 1, -1) - 2)));
  20. }
  21.  
  22. int main()
  23. {
  24. setlocale(LC_ALL, "Russian");
  25. int n; // количество прямоугольников
  26. const int N = 4; // для массива значений F1
  27. double a = 0, b = 3.14159, // отрезок
  28. M1, h, e = 0.0001, max = 0; // М1 - максимальное значение производной, h - шаг, е - заданная точность, max - переменная для хранения макс значения
  29. cout << "Метод прямоугольников \n\n";
  30. double x0 = 0, x1 = 0.703840003, x2 = 2.43775265, x3 = 3.141592654, // корни, найденные в маткаде
  31. f0 = F1(x0), f1 = F1(x1), f2 = F1(x2), f3 = trunc(F1(x3)); // значения F1(xi)
  32. double Fl2[] = { f0, f1, f2, f3 }; // массив значений F1
  33. for (int i = 1; i <= N; i++) { // находим максимальное значений
  34. if (max < abs(Fl2[i])) {
  35. max = abs(Fl2[i]);
  36. }
  37. };
  38. M1 = max;
  39. n = (M1 * pow((b - a), 2) / (2 * e)) + 1; // находим кол-во прямоугольников
  40. cout << "Разобьем отрезок на " << n << " равных частей\n";
  41. if ((M1 * pow((b - a), 2) / 2 * e) <= n) // если выполняется это условие, то находим шаг по формуле
  42. h = (b - a) / n;
  43. cout << "Шаг: " << h << "\n";
  44. double X;
  45. double sum = 0;
  46. for (int i = 1; i <= n; i++) { // считаем сумму значений функции в узловых точках
  47. X = a + h * i;
  48. sum += f(X);
  49. };
  50. double res = h * sum; // считаем значение интеграла как произведение шага и сумму значений функции
  51. cout << "Значение интеграла: " << res;
  52.  
  53. cout << "\n\nМетод трапеций \n\n";
  54. x0 = 0.33900351274, x1 = 1.14242977325, x2 = 1.57079632679, x3 = 1.9991628803;
  55. double x4 = 2.8025891409;
  56. f0 = F2(x0), f1 = F2(x1), f2 = F2(x2), f3 = F2(x3);
  57. double f4 = F2(x4);
  58. double Fl1[] = { f0,f1,f2,f3,f4 };
  59. max = 0;
  60. for (int i = 0; i <= 6; i++) {
  61. if (max < abs(Fl1[i])) {
  62. max = abs(Fl1[i]);
  63. }
  64. }
  65. M1 = max;
  66. cout<<max<<endl;
  67. n = sqrt(pow((b - a), 3) * M1 / 12 / e)+1;
  68. cout << "Разобьем отрезок на " << n << " равных частей\n";
  69. h = (b - a) / n;
  70. cout << "Шаг: " << h << "\n";
  71. sum = 0;
  72. for (int i = 0; i <= n; i++) {
  73. X = a + h * i;
  74. if ((i == 0) || (i == n - 1)) sum += f(X) / 2;
  75. else sum += f(X);
  76. }
  77. res = h * sum;
  78. cout << "Значение интеграла:" << res;
  79. cout << "\n\nМетод Симпсона \n\n";
  80. x0 = 0.3345893674, x1 = 0.8086105384, x2 = 1.5707963268, x3 = 2.3329821152, x4=2.8070032862;
  81. f0 = 32.21683968749, f1 = -14.154799784, f2 = 1.5, f3 = -14.154799784, f4=32.2168396875;
  82. double Fl3[] = { f0,f1,f2,f3,f4 };
  83. max = 0;
  84. for (int i = 0; i <= 4; i++) {
  85. if (max < abs(Fl3[i])) {
  86. max = abs(Fl3[i]);
  87. }
  88. }
  89. double M4=max;
  90. n=pow((pow((b-a),5)*M4)/e/2880,0.25)+1;
  91. cout << "Разобьем отрезок на " << n << " равных частей\n";
  92. h = (b - a) / (n*2);
  93. cout << "Шаг: " << h << "\n";
  94. res=f(a)+f(2*b);
  95. sum=0;
  96. for(int i=1;i<=n;i++){
  97. X=a+h*(2*i-1);
  98. sum+=f(X);
  99. }
  100. res=res+4*sum;
  101. sum=0;
  102. for(int i=1;i<n;i++){
  103. X=a+h*2*i;
  104. sum+=f(X);
  105. }
  106. res=res+2*sum;
  107. res=h/3*res;
  108. cout << "Значение интеграла:" << res;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment