Xsufu

Интегрирование Табличных данных C#

Dec 9th, 2020 (edited)
965
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.69 KB | None | 0 0
  1. using System;
  2.  
  3. namespace IntegratonTable {
  4.     static class Program {
  5.  
  6.         static double[] x = { 2.7, 3.0, 3.3, 3.7, 4.0, 4.5, 4.9, 5.1 };
  7.         static double[] y = { 0.3, -0.2, -0.7, -1.0, -0.9, -0.5, 0.2, 1.3 };
  8.         static double[] x3 = { -0.707107, 0, 0.707107 };
  9.         static double[] x2 = { -0.577350, 0.577350};
  10.  
  11.         //4.1
  12.         #region
  13.  
  14.         //Метод правых квадратов
  15.         public static void RecR() {
  16.             int n = 8;
  17.             double integral = 0.00;
  18.             double step = 0.00;
  19.             for (int i = n - 1; i >= 0; i--) {
  20.                 if (i == (n - 1)) {
  21.                     step = x[i] - x[i - 1];
  22.                 }
  23.                 else step = x[i + 1] - x[i];
  24.                 integral += step * y[i];
  25.             }
  26.             Console.WriteLine($"Интеграл равен={integral.ToString()}");
  27.         }
  28.  
  29.         //Метод Левых прямоугольников
  30.         public static void RecL() {
  31.             int n = 8;
  32.             double integral = 0.00;
  33.             double step = 0.00;
  34.             for (int i = 0; i < n; i++) {
  35.                 if (i == (n - 1)) {
  36.                     step = x[i] - x[i - 1];
  37.                 }
  38.                 else step = x[i + 1] - x[i];
  39.                 integral += step * y[i];
  40.             }
  41.             Console.WriteLine($"Интеграл равен={integral.ToString()}");
  42.         }
  43.  
  44.         //Метод средних прямоугольников
  45.         static void RecM() {
  46.             int n = 8;
  47.             double integral = 0.00;
  48.             double step = 0.00;
  49.             for (int i = 0; i < n-1; i++) {
  50.                 if (i == (n - 1)) {
  51.                     step = x[i] - x[i - 1];
  52.                 }
  53.                 else step = x[i + 1] - x[i];
  54.                 integral += step * ((y[i]+y[i+1])/2);
  55.             }
  56.             Console.WriteLine($"Интеграл равен={integral.ToString()}");
  57.         }
  58.         //Метод трапеций
  59.         public static void Trapezium() {
  60.             int n = 8;
  61.             double integral = 0.00;
  62.             double step = 0.00;
  63.             for (int i = 1; i < n; i++) {
  64.                 step = x[i] - x[i - 1];
  65.                 integral += step * ((y[i-1] + y[i]) / 2);
  66.             }
  67.             Console.WriteLine($"Интеграл равен={integral.ToString()}");
  68.         }
  69.  
  70.         //Метод Симпсона
  71.         static void simpson() {
  72.             //Выделяем память под ответ
  73.             double integral = 0.0f;
  74.             //Вычисляем сумму площадей в установленных границах
  75.             //x меняется на шаг
  76.             for (int i = 0; i < 7; i++)
  77.                 integral += (x[i+1] - x[i]) / 6 * (y[i] + 4 * ((y[i]+y[i+1])/2) + y[i+1]);
  78.             Console.WriteLine($"Интеграл равен: {integral}");
  79.         }
  80.  
  81.         static void simpson38() {
  82.             //Выделяем память под ответ
  83.             double integral = 0.0f;
  84.             integral = y[0] + y[7];
  85.             for (int i = 1; i<7; i++) {
  86.                 //Если элемент третий в триаде, то домножаем на 2
  87.                 if (i % 3 == 0)
  88.                     integral += 2 * y[i];
  89.                 //Если 1-ый или 2-ой в триаде то на 3
  90.                 else
  91.                     integral += 3 * y[i];
  92.             }
  93.             integral = (0.9 / 8) * integral;
  94.             Console.WriteLine($"Интеграл равен: {integral}");
  95.         }
  96.  
  97.         static void simpson245() {
  98.             //Выделяем память под ответ
  99.             double integral = 0.0f;
  100.             integral = y[0] + y[7];
  101.             //Костыль для 12 и 14
  102.             Boolean flag = false;
  103.  
  104.             //ВЫчисляем до последнего слагаемого
  105.             for (int i = 1; i < 7; i++) {
  106.                 //Если элемент нечётный, то множитель 32
  107.                 if (i % 2 != 0) {
  108.                     integral += 32 * y[i];
  109.                 }
  110.  
  111.                 //Иначе 12 или 14 по очереди
  112.                 else if (!flag) {
  113.                     integral += 12 * y[i];
  114.                     flag = true;
  115.                 }
  116.  
  117.                 else if (flag) {
  118.                     integral += 14 * y[i];
  119.                     flag = false;
  120.                 }
  121.             }
  122.             integral = (0.6 / 45) * integral;
  123.             Console.WriteLine($"Интеграл равен: {integral}");
  124.         }
  125.         #endregion
  126.  
  127.         //4.2
  128.         #region
  129.         static double t(double x) {
  130.             double min = 2.7, max = 5.1;
  131.             return (max + min) / 2 + (max - min) / 2 * x;
  132.         }
  133.  
  134.         static double fY(int j, int m) {
  135.             double output = 0;
  136.             if (m == 2)
  137.                 output = t(x2[j]);
  138.             else if (m == 3)
  139.                 output = t(x3[j]);
  140.  
  141.             for (int i = 0; i < 7; i++) {
  142.                 double eps;
  143.                 eps = Math.Abs(x[i] - output);
  144.  
  145.                 if (eps <= 0.19) {
  146.                     Console.WriteLine(y[i]);
  147.                     return y[i];
  148.                 }
  149.                    
  150.             }
  151.             return 0;
  152.         }
  153.  
  154.         static void Cheb(int m, double min, double max) {
  155.  
  156.             double integral = 0;
  157.             if (m == 2) {
  158.                 for (int j = 0; j < m; j++) {
  159.                     integral += fY(j, m);
  160.                 }
  161.             }
  162.            
  163.             else if (m == 3) {
  164.                 for (int j = 0; j < m; j++) {
  165.                     integral += fY(j, m);
  166.                 }
  167.             }
  168.             integral *= (max - min) / m;
  169.             Console.WriteLine(integral);
  170.         }
  171.  
  172.         static void Gauss(int m, double min, double max) {
  173.             double[] Aj = { 5 / 9f, 8 / 9f, 5 / 9f };
  174.             double integral = 0;
  175.             if (m == 2) {
  176.                 for (int j = 0; j < m; j++) {
  177.                     integral += fY(j, m);
  178.                 }
  179.             }
  180.  
  181.             else if (m == 3) {
  182.                 for (int j = 0; j < m; j++) {
  183.                     integral += Aj[j] * fY(j,m);
  184.                 }
  185.             }
  186.             integral *= (max - min) / 2;
  187.             Console.WriteLine(integral);
  188.         }
  189.  
  190.  
  191.         #endregion
  192.  
  193.         //4.3
  194.         #region
  195.         static double Tdef1(int i, double step) {
  196.             return (y[i + 1] - y[i - 1]) / 2 * step;
  197.         }
  198.  
  199.         static double Tdef2(int i, double step) {
  200.             return (y[i + 1] - 2 * y[i] + y[i - 1]) / Math.Pow(step, 2);
  201.         }
  202.  
  203.         //Метод аппроксимации рядом Тейлора
  204.         static void ART(double min, double max, double n) {
  205.             //Память под результат
  206.             double integral = 0.0f;
  207.             //Вычисляем шаг
  208.             double step = (max - min) / n;
  209.             //"Шагаем" по иксам
  210.             for (int i = 1; i<7; i++) {
  211.                 //Считаем по формуле, используя две производные
  212.                 integral += y[i] * step + Tdef1(i, step) / 2 * Math.Pow(step,2) + Tdef2(i, step) / 6 * Math.Pow(step, 3);
  213.             }
  214.             Console.WriteLine(integral);
  215.         }
  216.  
  217.         //Метод Монте-Карло
  218.         static void MonteCarlo(double n) {
  219.             //Создаём генератор псевдослучайных чисел
  220.             Random rnd = new Random();
  221.             //Память под ответ
  222.             double integral = 0.0f;
  223.             int mem = 0;
  224.             //Рандомим n чисел
  225.             for (int i = 0; i < n; i++) {
  226.                 //Рандомим число на отрезке [min,max]
  227.                 double u = rnd.Next(27, 51);
  228.                 u /= 10;
  229.                 for (int j = 0; j < 8; j++) {
  230.                     if (Math.Abs(x[j] - u) <= 0.15)
  231.                         mem = j;
  232.                 }
  233.                 //Суммируем значение функции в случайной точке
  234.                 integral += y[mem];
  235.             }
  236.             integral *= (5.1 - 2.7)/n;
  237.             Console.WriteLine(integral);
  238.         }
  239.  
  240.             #endregion
  241.  
  242.         static void Main(string[] args) {
  243.             double min = 2.7, max = 5.1;
  244.             //4.1
  245.  
  246.             #region
  247.             /*
  248.             Console.WriteLine("Метод средних прямоугольников:");
  249.             RecM();
  250.  
  251.             Console.WriteLine();
  252.             Console.WriteLine("Метод левых прямоугольников:");
  253.             RecL();
  254.  
  255.             Console.WriteLine();
  256.             Console.WriteLine("Метод правых прямоугольников:");
  257.             RecR();
  258.  
  259.             Console.WriteLine();
  260.             Console.WriteLine("Метод трапеций:");
  261.             Trapezium();
  262.  
  263.             Console.WriteLine();
  264.             Console.WriteLine("Метод Симпсона:");
  265.             simpson();
  266.  
  267.             Console.WriteLine();
  268.             Console.WriteLine("Правило Симпсона 3/8:");
  269.             simpson38();
  270.  
  271.             Console.WriteLine();
  272.             Console.WriteLine("Правило Симпсона 2/45:");
  273.             simpson245();
  274.             */
  275.             #endregion
  276.  
  277.             //4.2
  278.  
  279.             #region
  280.             Cheb(3, min, max);
  281.             Gauss(3, min, max);
  282.             #endregion
  283.            
  284.             //4.3
  285.             #region
  286.            
  287.             MonteCarlo(10000);
  288.  
  289.             #endregion
  290.  
  291.         }
  292.     }
  293. }
  294.  
  295.  
Add Comment
Please, Sign In to add comment