Advertisement
MrGhost75

NumericalAnalysis_LAB_2

Apr 28th, 2021
744
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.80 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.text.DecimalFormat;
  5.  
  6.  
  7. //По условию: f(x) = (tg(5*x))^2;
  8. //По условию: F(x) = (tg(5*x)/5) - x;
  9. public class Main {
  10.  
  11.     public static void main(String[] args) throws IOException {
  12.  
  13.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  14.  
  15.         //Границы интегрирования
  16.         double a, b;
  17.         System.out.println("Введите левую и правую границы интегрирования:");
  18.         System.out.print("a: ");
  19.         a = Double.parseDouble(reader.readLine());
  20.         do {
  21.             System.out.print("b: ");
  22.             b = Double.parseDouble(reader.readLine());
  23.         } while (b <= a);
  24.  
  25.         //Ввод N(число разбиений):
  26.         int n;
  27.         do {
  28.             System.out.print("Введите N(число разбиений): ");
  29.             n = Integer.parseInt(reader.readLine());
  30.         } while (n <= 0);
  31.         System.out.println();
  32.  
  33.         printAllFormulas(a, b, n);
  34.         System.out.println();
  35.  
  36.         printAllRungeDeviations(a, b, n);
  37.         System.out.println();
  38.  
  39.         printAllNumbersOfIterations(a, b);
  40.         System.out.println();
  41.  
  42.     }
  43.  
  44.     //Вывод значений интеграла по каждой формуле
  45.     public static void printAllFormulas(double a, double b, int n) {
  46.         System.out.println("Точное значение интеграла(через первообразную) на отрезке ["
  47.                 + new DecimalFormat("#.###").format(a) + "; "
  48.                 + new DecimalFormat("#.###").format(b) + "] = "
  49.                 + new DecimalFormat("#.######").format(func_F(b) - func_F(a)));
  50.  
  51.         System.out.println("Приближённое значение интеграла (N = " + n + ") через квадратурную"
  52.                 + " формулу по ЛЕВЫМ прямоугольникам на отрезке ["
  53.                 + new DecimalFormat("#.###").format(a) + "; "
  54.                 + new DecimalFormat("#.###").format(b) + "] = "
  55.                 + new DecimalFormat("#.######").format(leftSquareFormula(a, b, n)));
  56.  
  57.         System.out.println("Приближённое значение интеграла (N = " + n + ") через квадратурную"
  58.                 + " формулу по ПРАВЫМ прямоугольникам на отрезке ["
  59.                 + new DecimalFormat("#.###").format(a) + "; "
  60.                 + new DecimalFormat("#.###").format(b) + "] = "
  61.                 + new DecimalFormat("#.######").format(rightSquareFormula(a, b, n)));
  62.  
  63.         System.out.println("Приближённое значение интеграла (N = " + n + ") через квадратурную"
  64.                 + " формулу по СРЕДНИМ прямоугольникам на отрезке ["
  65.                 + new DecimalFormat("#.###").format(a) + "; "
  66.                 + new DecimalFormat("#.###").format(b) + "] = "
  67.                 + new DecimalFormat("#.######").format(midSquareFormula(a, b, n)));
  68.  
  69.         System.out.println("Приближённое значение интеграла (N = " + n + ") через квадратурную"
  70.                 + " формулу ТРАПЕЦИЙ на отрезке ["
  71.                 + new DecimalFormat("#.###").format(a) + "; "
  72.                 + new DecimalFormat("#.###").format(b) + "] = "
  73.                 + new DecimalFormat("#.######").format(trapezoidFormula(a, b, n)));
  74.  
  75.         System.out.println("Приближённое значение интеграла (N = " + n + ") через квадратурную"
  76.                 + " формулу СИМПСОНА на отрезке ["
  77.                 + new DecimalFormat("#.###").format(a) + "; "
  78.                 + new DecimalFormat("#.###").format(b) + "] = "
  79.                 + new DecimalFormat("#.######").format(simpsonFormula(a, b, n)));
  80.     }
  81.  
  82.     //Вывод отклонений каждого метода по правилу Рунге
  83.     public static void printAllRungeDeviations(double a, double b, int n) {
  84.         System.out.println("Погрешность метода левых пр-ков при N = " + n + " по правилу Рунге = "
  85.                 + rungeDeviation(a, b, n, 1));
  86.         System.out.println("Погрешность метода правых пр-ков при N = " + n + " по правилу Рунге = "
  87.                 + rungeDeviation(a, b, n, 2));
  88.         System.out.println("Погрешность метода средних пр-ков при N = " + n + " по правилу Рунге = "
  89.                 + rungeDeviation(a, b, n, 3));
  90.         System.out.println("Погрешность метода трапеций при N = " + n + " по правилу Рунге = "
  91.                 + rungeDeviation(a, b, n, 4));
  92.         System.out.println("Погрешность метода Симпсона при N = " + n + " по правилу Рунге = "
  93.                 + rungeDeviation(a, b, n, 5));
  94.     }
  95.  
  96.     //Вывод всех N-разбиений, нужных для того, чтобы данный метод достиг погрешности <= 0.001
  97.     public static void printAllNumbersOfIterations(double a, double b) {
  98.         System.out.println("Число N, при котором достигается погрешность < 0.0001 по ф-ле ЛЕВЫХ пр-ков = "
  99.                 + findNumberOfIterations(a, b, 1));
  100.         System.out.println("Число N, при котором достигается погрешность < 0.0001 по ф-ле ПРАВЫХ пр-ков = "
  101.                 + findNumberOfIterations(a, b, 2));
  102.         System.out.println("Число N, при котором достигается погрешность < 0.0001 по ф-ле СРЕДНИХ пр-ков = "
  103.                 + findNumberOfIterations(a, b, 3));
  104.         System.out.println("Число N, при котором достигается погрешность < 0.0001 по ф-ле трапеций = "
  105.                 + findNumberOfIterations(a, b, 4));
  106.         System.out.println("Число N, при котором достигается погрешность < 0.0001 по ф-ле СИМПСОНА = "
  107.                 + findNumberOfIterations(a, b, 5));
  108.     }
  109.  
  110.     //Функция, заданная по условию
  111.     public static double func_f(double x) {
  112.         return Math.pow(Math.tan(5*x), 2);
  113.     }
  114.  
  115.     //Первоообразная, заданная по условию
  116.     public static double func_F(double x) {
  117.         return (Math.tan(5*x)/5) - x;
  118.     }
  119.  
  120.     //Квадратурная формула по левым прямоугольникам
  121.     public static double leftSquareFormula(double a, double b, int n) {
  122.         double result = 0;
  123.         double h = (b - a)/n;
  124.  
  125.         double xi;
  126.         for (int i = 0; i < n; i++) {
  127.             xi = a + i*h;
  128.             result += func_f(xi);
  129.         }
  130.         result *= h;
  131.  
  132.         return result;
  133.     }
  134.  
  135.     //Квадратурная формула по правым прямоугольникам
  136.     public static double rightSquareFormula(double a, double b, int n) {
  137.         double result = 0;
  138.         double h = (b - a)/n;
  139.  
  140.         double xi;
  141.         for (int i = 1; i <= n; i++) {
  142.             xi = a + i*h;
  143.             result += func_f(xi);
  144.         }
  145.         result *= h;
  146.  
  147.         return result;
  148.     }
  149.  
  150.     //Квадратурная формула по средним прямоугольникам
  151.     public static double midSquareFormula(double a, double b, int n) {
  152.         double result = 0;
  153.         double h = (b - a)/n;
  154.  
  155.         double xi, xi_1;
  156.         for (int i = 0; i < n; i++) {
  157.             xi = a + i*h;
  158.             xi_1 = a + (i + 1)*h;
  159.             result += func_f((xi + xi_1)/2);
  160.         }
  161.         result *= h;
  162.  
  163.         return result;
  164.     }
  165.  
  166.     //Обобщённая квадратурная формула трапеций
  167.     public static double trapezoidFormula(double a, double b, int n) {
  168.         double result = 0;
  169.         double h = (b - a)/n;
  170.  
  171.         double xi;
  172.         for (int i = 1; i < n; i++) {
  173.             xi = a + i*h;
  174.             result += func_f(xi);
  175.         }
  176.         result *= h;
  177.         result += (h/2)*(func_f(a) + func_f(b));
  178.         return result;
  179.     }
  180.  
  181.     //Обобщённая квадратурная формула Симпсона
  182.     public static double simpsonFormula(double a, double b, int n) {
  183.         double result = 0;
  184.         double h = (b - a)/n;
  185.  
  186.         double xi;
  187.  
  188.         double temp = 0;
  189.         for (int i = 2; i < n - 1; i += 2) {
  190.             xi = a + i*h;
  191.             temp += func_f(xi);
  192.         }
  193.         temp *= 2;
  194.         result += temp;
  195.  
  196.         temp = 0;
  197.         for (int i = 1; i < n; i += 2) {
  198.             xi = a + i*h;
  199.             temp += func_f(xi);
  200.         }
  201.         temp *= 4;
  202.         result += temp;
  203.  
  204.         result += (func_f(a) + func_f(b));
  205.         result *= (h/3);
  206.  
  207.         return result;
  208.     }
  209.  
  210.     //Погрешность метода по правилу Рунге:
  211.     public static double rungeDeviation(double a, double b, int n, int methodNumber) {
  212.  
  213.         switch (methodNumber) {
  214.             case 1: //ЛЕВЫЕ прямоугольники
  215.                 return Math.abs(leftSquareFormula(a, b, 2*n) - leftSquareFormula(a, b, n)) / 3;
  216.             case 2: //ПРАВЫЕ прямоугольники
  217.                 return Math.abs(rightSquareFormula(a, b, 2*n) - rightSquareFormula(a, b, n)) / 3;
  218.             case 3: //СРЕДНИЕ прямоугольники
  219.                 return Math.abs(midSquareFormula(a, b, 2*n) - midSquareFormula(a, b, n)) / 3;
  220.             case 4: //ТРАПЕЦИИ
  221.                 return Math.abs(trapezoidFormula(a, b, 2*n) - trapezoidFormula(a, b, n)) / 3;
  222.             case 5: //СИМПСОН
  223.                 return Math.abs(simpsonFormula(a, b, 2*n) - simpsonFormula(a, b, n)) / 15;
  224.         }
  225.  
  226.         return 0;
  227.     }
  228.  
  229.     public static int findNumberOfIterations(double a, double b, int methodNumber) {
  230.  
  231.         double eps = 0.0001;
  232.         int n = 1;
  233.         double accurateIntegral = func_F(b) - func_F(a);
  234.         double approximateIntegral;
  235.         switch (methodNumber) {
  236.             case 1: //ЛЕВЫЕ прямоугольники
  237.                 do {
  238.                     approximateIntegral = leftSquareFormula(a, b, n);
  239.                     n++;
  240.                 } while (Math.abs(accurateIntegral - approximateIntegral) > eps);
  241.                 return n-1;
  242.             case 2: //ПРАВЫЕ прямоугольники
  243.                 do {
  244.                     approximateIntegral = rightSquareFormula(a, b, n);
  245.                     n++;
  246.                 } while (Math.abs(accurateIntegral - approximateIntegral) > eps);
  247.                 return n-1;
  248.             case 3: //СРЕДНИЕ прямоугольники
  249.                 do {
  250.                     approximateIntegral = midSquareFormula(a, b, n);
  251.                     n++;
  252.                 } while (Math.abs(accurateIntegral - approximateIntegral) > eps);
  253.                 return n-1;
  254.             case 4: //ТРАПЕЦИИ
  255.                 do {
  256.                     approximateIntegral = trapezoidFormula(a, b, n);
  257.                     n++;
  258.                 } while (Math.abs(accurateIntegral - approximateIntegral) > eps);
  259.                 return n-1;
  260.             case 5: //СИМПСОН
  261.                 do {
  262.                     approximateIntegral = simpsonFormula(a, b, n);
  263.                     n++;
  264.                 } while (Math.abs(accurateIntegral - approximateIntegral) > eps);
  265.                 return n-1;
  266.         }
  267.  
  268.         return n;
  269.     }
  270.  
  271. }
  272.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement