Advertisement
Xsufu

Комбинированные методы решения нелинейных уравнений

Oct 28th, 2020
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 101.55 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Xml.XPath;
  5.  
  6. namespace Nonlinear_Iteration {
  7.     class Program {
  8.  
  9.         //делегат для методов ф-ий
  10.         delegate float function(float x);
  11.         //делегат для методов производных
  12.         delegate float derivative(float x);
  13.         //делегат для Фи в простых итерациях
  14.         delegate float Phi(float x);
  15.  
  16.         //выбор ф-ии >>
  17.         static float test_function1(float x) {
  18.             return (float)Math.Pow(x, 3) + 3 * x + 1;
  19.         }
  20.  
  21.         static float test_function2(float x) {
  22.             return x + (float)Math.Log(x, 10) - 0.5F;
  23.         }
  24.  
  25.         static float test_function3(float x) {
  26.             return (float)Math.Tan(0.4 * x + 0.4) - (float)Math.Pow(x, 2);
  27.         }
  28.         //<<
  29.  
  30.         //производная первого порядка
  31.         static float derivative1(float x) {
  32.             return 3 * (float)Math.Pow(x, 2) + 3;
  33.         }
  34.  
  35.         static float derivative2(float x) {
  36.             return 1 + (1 / ((float)Math.Log(10) * x));
  37.         }
  38.  
  39.         static float derivative3(float x) {
  40.             return -2 * x + (0.4F / (float)Math.Pow(Math.Cos(0.4 - 0.4 * x), 2));
  41.         }
  42.         //<<
  43.  
  44.         //производная второго порядка
  45.         static float SecondDerivative(float x, int menu) {
  46.             switch (menu) {
  47.                 case 1:
  48.                     return 6 * x;
  49.                 case 2:
  50.                     return -1 / ((float)Math.Log(10) * (float)Math.Pow(x, 2));
  51.                 case 3:
  52.                     float up = 8 * (float)Math.Sin(0.4F * x + 0.4);
  53.                     float down = 25 * (float)Math.Pow(Math.Cos(0.4F * x + 0.4F), 3);
  54.                     return (up / down) - 2;
  55.             }
  56.             return 0;
  57.         }
  58.  
  59.         //вычисление "x" для Ньютона
  60.         static float CalculatingX(float x, function test_function, derivative derivative) {
  61.             return x - (test_function(x) / derivative(x));
  62.         }
  63.  
  64.         //вычисление "x" для Мод-го Ньютона
  65.         static float ModCalculatingX(float x, float Dx0, function test_function) {
  66.             return x - (test_function(x) / Dx0);
  67.         }
  68.  
  69.         //вычисление "x" для метода секущих
  70.         static float SecantCalc(float x, float xp, function test_function) {
  71.             return x - (test_function(x) * (x - xp) / (test_function(x) - test_function(xp)));
  72.         }
  73.  
  74.         //бета для Риддерса
  75.         static float B(float x, float xp) {
  76.             return (xp + x) / 2;
  77.         }
  78.  
  79.         //вычисление "x" для Риддерса
  80.         static float CalcXRidder(float x, float xp, function test_function) {
  81.             float sqr = (float)Math.Pow(test_function(B(x, xp)), 2) - test_function(xp) * test_function(x);
  82.             return B(x, xp) + (B(x, xp) - xp) * ((test_function(xp) - test_function(x)) * test_function(B(x, xp)) / (float)Math.Sqrt(sqr));
  83.         }
  84.  
  85.         //вычисление "x" для Мюллера
  86.         static float CalcXMuller(float x, float xp, float xp2, function test_function) {
  87.             float a, b, c, q, res, znam1, znam2;
  88.             q = (x - xp) / (xp - xp2);
  89.             c = (1 + q) * test_function(x);
  90.             b = (2 * q) * test_function(x) - (float)Math.Pow(1 + q, 2) * test_function(xp) + (float)Math.Pow(q, 2) * test_function(xp2);
  91.             a = q * test_function(x) - q * (1 + q) * test_function(xp) + (float)Math.Pow(q, 2) * test_function(xp2);
  92.             znam1 = b + (float)Math.Sqrt(Math.Pow(b, 2) - 4 * a * c);
  93.             znam2 = b - (float)Math.Sqrt(Math.Pow(b, 2) - 4 * a * c);
  94.             if (znam1 > znam2)
  95.                 res = x - (x - xp) * (2 * c / znam1);
  96.             else
  97.                 res = x - (x - xp) * (2 * c / znam2);
  98.             return res;
  99.         }
  100.  
  101.         //Выбор Фи для простых итераций >>
  102.         static float Phi1(float x) {
  103.             return (float)Math.Pow(-3 * x - 1, 1 / 3f);
  104.         }
  105.  
  106.         static float Phi2(float x) {
  107.             return 0.5F - (float)Math.Log(x, 10);
  108.         }
  109.  
  110.         static float Phi3(float x) {
  111.             return (float)Math.Sqrt((float)Math.Tan(0.4f * x + 0.4));
  112.         }
  113.         //<<
  114.  
  115.         //производная от фи
  116.         static float DerivativePhi(float x, int menu) {
  117.             switch (menu) {
  118.                 case 1:
  119.                     return 1 / (float)Math.Pow(-3 * x - 1, 2 / 3F);
  120.                 case 2:
  121.                     return -(1 / (x * (float)Math.Log(10)));
  122.                 case 3:
  123.                     float sec = 1 / (float)Math.Pow((float)Math.Cos(0.4f * x + 0.4), 2);
  124.                     float znam = 5 * (float)Math.Sqrt(Math.Tan(0.4f * x + 0.4));
  125.                     return sec / znam;
  126.             }
  127.             return 0;
  128.         }
  129.  
  130.         //шаг
  131.         static float h = 0.0003F;
  132.         //точность
  133.         static double eps = 0.0031;
  134.         //Константа Фидия
  135.         static float Ф = 1.618F;
  136.  
  137.         //Метод Ньютона и Половинного деления
  138.         static void NewtonHD(int a, int b, int menu) {
  139.             //массив для ответов
  140.             string[] lines = new string[20];
  141.             //счётчик корней
  142.             int count = 1;
  143.             //счётчик итераций
  144.             int ItCount = 0;
  145.             //шаг
  146.             //float h = 0.0003F;
  147.             //сохранение предыщего значения x
  148.             float prevF = 0;
  149.             //индекс массива result
  150.             int i = 0;
  151.             //точность
  152.             //double eps = 0.1;
  153.  
  154.             //массив хранения f(x) в локализации
  155.             List<float> result = new List<float>();
  156.  
  157.             //делегат для ф-ии
  158.             function test_function = test_function1;
  159.             //делегат для производной
  160.             derivative derivative = derivative1;
  161.             //присваение ф-ии делегату
  162.             switch (menu) {
  163.                 case 1:
  164.                     test_function = test_function1;
  165.                     derivative = derivative1;
  166.                     break;
  167.                 case 2:
  168.                     test_function = test_function2;
  169.                     derivative = derivative2;
  170.                     break;
  171.                 case 3:
  172.                     test_function = test_function3;
  173.                     derivative = derivative3;
  174.                     break;
  175.             }
  176.  
  177.             //локализуем и сразу считаем
  178.             for (float f = a; f <= b; f += h, i++) {
  179.                 //вычисляем знаечение f(x)
  180.                 result.Add(test_function(f));
  181.  
  182.                 //если дошли до второго f(x)
  183.                 if (i > 0) {
  184.                     //если знак поменялся или одно из f(x) равно нулю
  185.                     if ((result[i] * result[i - 1] <= 0) && (result[i] != 0 && result[i - 1] != 0)) {
  186.                         //перезаписываем предыдущее заначение x
  187.                         float A = prevF;
  188.                         //перезаписываем текущее заначение x
  189.                         float B = f;
  190.                         float fa, fb, fx;
  191.                         //вычисляем x для уточнения корней
  192.                         float x = (A + B) / 2;
  193.  
  194.                         //вычисляем расстояние между точками
  195.                         float check1 = Math.Abs(A - B);
  196.  
  197.                         //счиатем пока расстояние между точками
  198.                         //больше заданной точности
  199.                         while (check1 > eps) {
  200.                             //вычисляем f(a)
  201.                             fa = test_function(A);
  202.                             //вычисляем f(b)
  203.                             fb = test_function(B);
  204.                             //вычисляем f(x)
  205.                             fx = test_function(x);
  206.                             //если знак f(x) изменился
  207.                             //то сдвиагем границу
  208.                             A = fx * fa > 0 ? x : B = x;
  209.                             //вычисляем новое значение x
  210.                             x = (A + B) / 2;
  211.                             //вычисляем расстояние между точками
  212.                             check1 = Math.Abs(A - B);
  213.                         }
  214.  
  215.                         float xi = CalculatingX(x, test_function, derivative);
  216.                         //вычисляем расстояние между точками
  217.                         //float check = Math.Abs(x - xi);
  218.                         float check = 1;
  219.                         // x = x1, xi = x0;
  220.                         while (check > eps) {
  221.                             x = xi;
  222.                             //вычисляем xk+1
  223.                             xi = CalculatingX(x, test_function, derivative);
  224.                             //вычисляем расстояние между точками
  225.                             check = Math.Abs(x - xi);
  226.                             //запоминаем xk                            
  227.                             ItCount++;
  228.                         }
  229.  
  230.                         Console.WriteLine($"x{count}: " + x);
  231.                         lines[count - 1] = Convert.ToString(x);
  232.                         count++;
  233.                     }
  234.                 }
  235.                 prevF = f;
  236.             }
  237.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  238.         }
  239.  
  240.         //Метод Ньютона и Хорд
  241.         static void NewtonChord(int a, int b, int menu) {
  242.             //массив для ответов
  243.             string[] lines = new string[20];
  244.             //счётчик корней
  245.             int count = 1;
  246.             //счётчик итераций
  247.             int ItCount = 0;
  248.             //шаг
  249.             //float h = 0.03F;
  250.             //сохранение предыщего значения x
  251.             float prevF = 0;
  252.             //индекс массива result
  253.             int i = 0;
  254.             //точность
  255.             //double eps = 0.00001;
  256.  
  257.             //массив хранения f(x) в локализации
  258.             List<float> result = new List<float>();
  259.  
  260.             //делегат для ф-ии
  261.             function test_function = test_function1;
  262.             //делегат для производной
  263.             derivative derivative = derivative1;
  264.             //присваение ф-ии делегату
  265.             switch (menu) {
  266.                 case 1:
  267.                     test_function = test_function1;
  268.                     derivative = derivative1;
  269.                     break;
  270.                 case 2:
  271.                     test_function = test_function2;
  272.                     derivative = derivative2;
  273.                     break;
  274.                 case 3:
  275.                     test_function = test_function3;
  276.                     derivative = derivative3;
  277.                     break;
  278.             }
  279.  
  280.             //локализуем и сразу считаем
  281.             for (float f = a; f <= b; f += h, i++) {
  282.                 //вычисляем знаечение f(x)
  283.                 result.Add(test_function(f));
  284.  
  285.                 //если дошли до второго f(x)
  286.                 if (i > 0) {
  287.                     //если знак поменялся или одно из f(x) равно нулю
  288.                     if ((result[i] * result[i - 1] <= 0) && (result[i] != 0 && result[i - 1] != 0)) {
  289.                         //перезаписываем предыдущее заначение x
  290.                         float A = prevF;
  291.                         //перезаписываем текущее заначение x
  292.                         float B = f;
  293.                         //вычисляем x для уточнения корней
  294.                         //float x = (A + B) / 2;
  295.                         float fa, fb, fx;
  296.                         //вычисляем f(a)
  297.                         fa = test_function(A);
  298.                         //вычисляем f(b)
  299.                         fb = test_function(B);
  300.  
  301.                         float x = (float)(A - (B - A) / (fb - fa) * fa);
  302.  
  303.                         //вычисляем расстояние между точками
  304.                         float check1 = Math.Abs(A - B);
  305.  
  306.                         //счиатем пока расстояние между точками
  307.                         //больше заданной точности
  308.                         while (check1 > eps) {
  309.                             //вычисляем f(a)
  310.                             fa = test_function(A);
  311.                             //вычисляем f(b)
  312.                             fb = test_function(B);
  313.                             //вычисляем f(x)
  314.                             fx = test_function(x);
  315.                             //если знак f(x) изменился
  316.                             //то сдвиагем границу
  317.                             A = fx * fa > 0 ? x : B = x;
  318.                             //вычисляем новое значение x
  319.                             x = (float)(A - (B - A) / (fb - fa) * fa);
  320.                             //вычисляем расстояние между точками
  321.                             check1 = Math.Abs(A - B);
  322.                         }
  323.  
  324.                         float xi = CalculatingX(x, test_function, derivative);
  325.                         //вычисляем расстояние между точками
  326.                         float check = Math.Abs(x - xi);
  327.  
  328.                         while (check > eps) {
  329.                             //вычисляем xk+1
  330.                             xi = CalculatingX(x, test_function, derivative);
  331.                             //вычисляем расстояние между точками
  332.                             check = Math.Abs(x - xi);
  333.                             //запоминаем xk
  334.                             x = xi;
  335.                             ItCount++;
  336.                         }
  337.  
  338.                         Console.WriteLine($"x{count}: " + x);
  339.                         lines[count - 1] = Convert.ToString(x);
  340.                         count++;
  341.                     }
  342.                 }
  343.                 prevF = f;
  344.             }
  345.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  346.         }
  347.  
  348.         //Метод Ньютона и Золотого сечения
  349.         static void NewtonGold(int a, int b, int menu) {
  350.             //массив для ответов
  351.             string[] lines = new string[20];
  352.             //счётчик корней
  353.             int count = 1;
  354.             //счётчик итераций
  355.             int ItCount = 0;
  356.             //сохранение предыщего значения x
  357.             float prevF = 0;
  358.             //индекс массива result
  359.             int i = 0;
  360.  
  361.             //массив хранения f(x) в локализации
  362.             List<float> result = new List<float>();
  363.  
  364.             //делегат для ф-ии
  365.             function test_function = test_function1;
  366.             //делегат для производной
  367.             derivative derivative = derivative1;
  368.             //присваение ф-ии делегату
  369.             switch (menu) {
  370.                 case 1:
  371.                     test_function = test_function1;
  372.                     derivative = derivative1;
  373.                     break;
  374.                 case 2:
  375.                     test_function = test_function2;
  376.                     derivative = derivative2;
  377.                     break;
  378.                 case 3:
  379.                     test_function = test_function3;
  380.                     derivative = derivative3;
  381.                     break;
  382.             }
  383.  
  384.             //локализуем и сразу считаем
  385.             for (float f = a; f <= b; f += h, i++) {
  386.                 //вычисляем знаечение f(x)
  387.                 result.Add(test_function(f));
  388.  
  389.                 //если дошли до второго f(x)
  390.                 if (i > 0) {
  391.                     //если знак поменялся или одно из f(x) равно нулю
  392.                     if ((result[i] * result[i - 1] <= 0) && (result[i] != 0 && result[i - 1] != 0)) {
  393.                         //перезаписываем предыдущее заначение x
  394.                         float A = prevF;
  395.                         //перезаписываем текущее заначение x
  396.                         float B = f;
  397.                         //вычисляем x для уточнения корней
  398.                         float x;
  399.                         float fa, fb, fx1, fx2;
  400.  
  401.                         //вычисляем x для уточнения корней
  402.                         float x1 = B - (B - A) / Ф;
  403.                         float x2 = A + (B - A) / Ф;
  404.  
  405.                         //вычисляем расстояние между точками
  406.                         float check1 = Math.Abs(A - B);
  407.  
  408.                         //счиатем пока расстояние между точками
  409.                         //больше заданной точности
  410.                         while (check1 > eps) {
  411.                             //вычисляем f(a)
  412.                             fa = test_function(A);
  413.                             //вычисляем f(b)
  414.                             fb = test_function(B);
  415.                             //вычисляем f(x1)
  416.                             fx1 = test_function(x1);
  417.                             //вычисляем f(x2)
  418.                             fx2 = test_function(x2);
  419.                             //если знак f(x) изменился
  420.                             //то сдвиагем границу
  421.                             if (x1 > x2)
  422.                                 A = fx1 * fa > 0 ? x1 : B = x1;
  423.                             else
  424.                                 A = fx2 * fa > 0 ? x2 : B = x2;
  425.                             //вычисляем новые значения x
  426.                             x1 = B - (B - A) / Ф;
  427.                             x2 = A + (B - A) / Ф;
  428.                             //вычисляем расстояние между точками
  429.                             check1 = Math.Abs(A - B);
  430.                         }
  431.  
  432.                         x = (x1 + x2) / 2;
  433.  
  434.                         float xi = CalculatingX(x, test_function, derivative);
  435.                         //вычисляем расстояние между точками
  436.                         float check = Math.Abs(x - xi);
  437.  
  438.                         while (check > eps) {
  439.                             //вычисляем xk+1
  440.                             xi = CalculatingX(x, test_function, derivative);
  441.                             //вычисляем расстояние между точками
  442.                             check = Math.Abs(x - xi);
  443.                             //запоминаем xk
  444.                             x = xi;
  445.                             ItCount++;
  446.                         }
  447.  
  448.                         Console.WriteLine($"x{count}: " + x);
  449.                         lines[count - 1] = Convert.ToString(x);
  450.                         count++;
  451.                     }
  452.                 }
  453.                 prevF = f;
  454.             }
  455.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  456.         }
  457.  
  458.         //Модифицированный метод Ньютона и половинного деления
  459.         static void ModNewtonHD(int a, int b, int menu) {
  460.             //массив для ответов
  461.             string[] lines = new string[20];
  462.             //счётчик корней
  463.             int count = 1;
  464.             //счётчик итераций
  465.             int ItCount = 0;
  466.             //шаг
  467.             //float h = 0.00003F;
  468.             //сохранение предыщего значения x
  469.             float prevF = 0;
  470.             //индекс массива result
  471.             int i = 0;
  472.             //точность
  473.             //double eps = 0.000001;
  474.  
  475.             //массив хранения f(x) в локализации
  476.             List<float> result = new List<float>();
  477.  
  478.             //делегат для ф-ии
  479.             function test_function = test_function1;
  480.             //делегат для производной
  481.             derivative derivative = derivative1;
  482.             //присваение ф-ии делегату
  483.             switch (menu) {
  484.                 case 1:
  485.                     test_function = test_function1;
  486.                     derivative = derivative1;
  487.                     break;
  488.                 case 2:
  489.                     test_function = test_function2;
  490.                     derivative = derivative2;
  491.                     break;
  492.                 case 3:
  493.                     test_function = test_function3;
  494.                     derivative = derivative3;
  495.                     break;
  496.             }
  497.  
  498.             //локализуем и сразу считаем
  499.             for (float f = a; f <= b; f += h, i++) {
  500.                 //вычисляем знаечение f(x)
  501.                 result.Add(test_function(f));
  502.  
  503.                 //если дошли до второго f(x)
  504.                 if (i > 0) {
  505.                     //если знак поменялся или одно из f(x) равно нулю
  506.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  507.                         //перезаписываем предыдущее заначение x
  508.                         float A = prevF;
  509.                         //перезаписываем текущее заначение x
  510.                         float B = f;
  511.                         float fa, fb, fx;
  512.                         //вычисляем x для уточнения корней
  513.                         float x = (A + B) / 2;
  514.  
  515.                         //вычисляем расстояние между точками
  516.                         float check1 = Math.Abs(A - B);
  517.  
  518.                         //счиатем пока расстояние между точками
  519.                         //больше заданной точности
  520.                         while (check1 > eps) {
  521.                             //вычисляем f(a)
  522.                             fa = test_function(A);
  523.                             //вычисляем f(b)
  524.                             fb = test_function(B);
  525.                             //вычисляем f(x)
  526.                             fx = test_function(x);
  527.                             //если знак f(x) изменился
  528.                             //то сдвиагем границу
  529.                             A = fx * fa > 0 ? x : B = x;
  530.                             //вычисляем новое значение x
  531.                             x = (A + B) / 2;
  532.                             //вычисляем расстояние между точками
  533.                             check1 = Math.Abs(A - B);
  534.                         }
  535.                         //вычисляем производную x0
  536.                         float DerX0 = derivative(x);
  537.                         //вычисляем xk
  538.                         float xi = ModCalculatingX(x, DerX0, test_function);
  539.                         //вычисляем расстояние между корнями
  540.                         float check = Math.Abs(x - xi);
  541.  
  542.                         while (check > eps) {
  543.                             //вычисляем новое значение x
  544.                             xi = ModCalculatingX(x, DerX0, test_function);
  545.                             //вычисляем расстояние между точками
  546.                             check = Math.Abs(x - xi);
  547.                             //запоминаем xk
  548.                             x = xi;
  549.                             ItCount++;
  550.                         }
  551.  
  552.                         Console.WriteLine($"x{count}: " + x);
  553.                         lines[count - 1] = Convert.ToString(x);
  554.                         count++;
  555.                     }
  556.                 }
  557.                 prevF = f;
  558.             }
  559.             //путь для ответа
  560.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  561.             //запись ответа в файл
  562.             File.WriteAllLines($"{AnswerPath}", lines);
  563.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  564.         }
  565.  
  566.         //Модифицированный метод Ньютона и хорд
  567.         static void ModNewtonChord(int a, int b, int menu) {
  568.             //массив для ответов
  569.             string[] lines = new string[20];
  570.             //счётчик корней
  571.             int count = 1;
  572.             //счётчик итераций
  573.             int ItCount = 0;
  574.             //шаг
  575.             //float h = 0.00003F;
  576.             //сохранение предыщего значения x
  577.             float prevF = 0;
  578.             //индекс массива result
  579.             int i = 0;
  580.             //точность
  581.             //double eps = 0.000001;
  582.  
  583.             //массив хранения f(x) в локализации
  584.             List<float> result = new List<float>();
  585.  
  586.             //делегат для ф-ии
  587.             function test_function = test_function1;
  588.             //делегат для производной
  589.             derivative derivative = derivative1;
  590.             //присваение ф-ии делегату
  591.             switch (menu) {
  592.                 case 1:
  593.                     test_function = test_function1;
  594.                     derivative = derivative1;
  595.                     break;
  596.                 case 2:
  597.                     test_function = test_function2;
  598.                     derivative = derivative2;
  599.                     break;
  600.                 case 3:
  601.                     test_function = test_function3;
  602.                     derivative = derivative3;
  603.                     break;
  604.             }
  605.  
  606.             //локализуем и сразу считаем
  607.             for (float f = a; f <= b; f += h, i++) {
  608.                 //вычисляем знаечение f(x)
  609.                 result.Add(test_function(f));
  610.  
  611.                 //если дошли до второго f(x)
  612.                 if (i > 0) {
  613.                     //если знак поменялся или одно из f(x) равно нулю
  614.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  615.                         //перезаписываем предыдущее заначение x
  616.                         float A = prevF;
  617.                         //перезаписываем текущее заначение x
  618.                         float B = f;
  619.                         float fa, fb, fx;
  620.                         //вычисляем f(a)
  621.                         fa = test_function(A);
  622.                         //вычисляем f(b)
  623.                         fb = test_function(B);
  624.  
  625.                         float x = (float)(A - (B - A) / (fb - fa) * fa);
  626.  
  627.                         //вычисляем расстояние между точками
  628.                         float check1 = Math.Abs(A - B);
  629.  
  630.                         //счиатем пока расстояние между точками
  631.                         //больше заданной точности
  632.                         while (check1 > eps) {
  633.                             //вычисляем f(a)
  634.                             fa = test_function(A);
  635.                             //вычисляем f(b)
  636.                             fb = test_function(B);
  637.                             //вычисляем f(x)
  638.                             fx = test_function(x);
  639.                             //если знак f(x) изменился
  640.                             //то сдвиагем границу
  641.                             A = fx * fa > 0 ? x : B = x;
  642.                             //вычисляем новое значение x
  643.                             x = (float)(A - (B - A) / (fb - fa) * fa);
  644.                             //вычисляем расстояние между точками
  645.                             check1 = Math.Abs(A - B);
  646.                         }
  647.                         //вычисляем производную x0
  648.                         float DerX0 = derivative(x);
  649.                         //вычисляем xk
  650.                         float xi = ModCalculatingX(x, DerX0, test_function);
  651.                         //вычисляем расстояние между корнями
  652.                         float check = Math.Abs(x - xi);
  653.  
  654.                         while (check > eps) {
  655.                             //вычисляем новое значение x
  656.                             xi = ModCalculatingX(x, DerX0, test_function);
  657.                             //вычисляем расстояние между точками
  658.                             check = Math.Abs(x - xi);
  659.                             //запоминаем xk
  660.                             x = xi;
  661.                             ItCount++;
  662.                         }
  663.  
  664.                         Console.WriteLine($"x{count}: " + x);
  665.                         lines[count - 1] = Convert.ToString(x);
  666.                         count++;
  667.                     }
  668.                 }
  669.                 prevF = f;
  670.             }
  671.             //путь для ответа
  672.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  673.             //запись ответа в файл
  674.             File.WriteAllLines($"{AnswerPath}", lines);
  675.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  676.         }
  677.  
  678.         //Модифицированный метод Ньютона и золотого сечения
  679.         static void ModNewtonGold(int a, int b, int menu) {
  680.             //массив для ответов
  681.             string[] lines = new string[20];
  682.             //счётчик корней
  683.             int count = 1;
  684.             //счётчик итераций
  685.             int ItCount = 0;
  686.             //шаг
  687.             //float h = 0.00003F;
  688.             //сохранение предыщего значения x
  689.             float prevF = 0;
  690.             //индекс массива result
  691.             int i = 0;
  692.             //точность
  693.             //double eps = 0.000001;
  694.  
  695.             //массив хранения f(x) в локализации
  696.             List<float> result = new List<float>();
  697.  
  698.             //делегат для ф-ии
  699.             function test_function = test_function1;
  700.             //делегат для производной
  701.             derivative derivative = derivative1;
  702.             //присваение ф-ии делегату
  703.             switch (menu) {
  704.                 case 1:
  705.                     test_function = test_function1;
  706.                     derivative = derivative1;
  707.                     break;
  708.                 case 2:
  709.                     test_function = test_function2;
  710.                     derivative = derivative2;
  711.                     break;
  712.                 case 3:
  713.                     test_function = test_function3;
  714.                     derivative = derivative3;
  715.                     break;
  716.             }
  717.  
  718.             //локализуем и сразу считаем
  719.             for (float f = a; f <= b; f += h, i++) {
  720.                 //вычисляем знаечение f(x)
  721.                 result.Add(test_function(f));
  722.  
  723.                 //если дошли до второго f(x)
  724.                 if (i > 0) {
  725.                     //если знак поменялся или одно из f(x) равно нулю
  726.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  727.                         //перезаписываем предыдущее заначение x
  728.                         float A = prevF;
  729.                         //перезаписываем текущее заначение x
  730.                         float B = f;
  731.                         //вычисляем x для уточнения корней
  732.                         float x;
  733.                         float fa, fb, fx1, fx2;
  734.  
  735.                         //вычисляем x для уточнения корней
  736.                         float x1 = B - (B - A) / Ф;
  737.                         float x2 = A + (B - A) / Ф;
  738.  
  739.                         //вычисляем расстояние между точками
  740.                         float check1 = Math.Abs(A - B);
  741.  
  742.                         //счиатем пока расстояние между точками
  743.                         //больше заданной точности
  744.                         while (check1 > eps) {
  745.                             //вычисляем f(a)
  746.                             fa = test_function(A);
  747.                             //вычисляем f(b)
  748.                             fb = test_function(B);
  749.                             //вычисляем f(x1)
  750.                             fx1 = test_function(x1);
  751.                             //вычисляем f(x2)
  752.                             fx2 = test_function(x2);
  753.                             //если знак f(x) изменился
  754.                             //то сдвиагем границу
  755.                             if (x1 > x2)
  756.                                 A = fx1 * fa > 0 ? x1 : B = x1;
  757.                             else
  758.                                 A = fx2 * fa > 0 ? x2 : B = x2;
  759.                             //вычисляем новые значения x
  760.                             x1 = B - (B - A) / Ф;
  761.                             x2 = A + (B - A) / Ф;
  762.                             //вычисляем расстояние между точками
  763.                             check1 = Math.Abs(A - B);
  764.                         }
  765.  
  766.                         x = (x1 + x2) / 2;
  767.                         //вычисляем производную x0
  768.                         float DerX0 = derivative(x);
  769.                         //вычисляем xk
  770.                         float xi = ModCalculatingX(x, DerX0, test_function);
  771.                         //вычисляем расстояние между корнями
  772.                         float check = Math.Abs(x - xi);
  773.  
  774.                         while (check > eps) {
  775.                             //вычисляем новое значение x
  776.                             xi = ModCalculatingX(x, DerX0, test_function);
  777.                             //вычисляем расстояние между точками
  778.                             check = Math.Abs(x - xi);
  779.                             //запоминаем xk
  780.                             x = xi;
  781.                             ItCount++;
  782.                         }
  783.  
  784.                         Console.WriteLine($"x{count}: " + x);
  785.                         lines[count - 1] = Convert.ToString(x);
  786.                         count++;
  787.                     }
  788.                 }
  789.                 prevF = f;
  790.             }
  791.             //путь для ответа
  792.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  793.             //запись ответа в файл
  794.             File.WriteAllLines($"{AnswerPath}", lines);
  795.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  796.         }
  797.  
  798.         //Метод Секущих и половинного деления
  799.         static void SecantHD(int a, int b, int menu) {
  800.             //массив для ответов
  801.             string[] lines = new string[20];
  802.             //счётчик корней
  803.             int count = 1;
  804.             //счётчик итераций
  805.             int ItCount = 0;
  806.             //шаг
  807.             //float h = 0.00003F;
  808.             //сохранение предыщего значения x
  809.             float prevF = 0;
  810.             //индекс массива result
  811.             int i = 0;
  812.             //точность
  813.             //double eps = 0.000001;
  814.  
  815.             //массив хранения f(x) в локализации
  816.             List<float> result = new List<float>();
  817.  
  818.             //делегат для ф-ии
  819.             function test_function = test_function1;
  820.             //делегат для производной
  821.             derivative derivative = derivative1;
  822.             //присваение ф-ии делегату
  823.             switch (menu) {
  824.                 case 1:
  825.                     test_function = test_function1;
  826.                     derivative = derivative1;
  827.                     break;
  828.                 case 2:
  829.                     test_function = test_function2;
  830.                     derivative = derivative2;
  831.                     break;
  832.                 case 3:
  833.                     test_function = test_function3;
  834.                     derivative = derivative3;
  835.                     break;
  836.             }
  837.  
  838.             //локализуем и сразу считаем
  839.             for (float f = a; f <= b; f += h, i++) {
  840.                 //вычисляем знаечение f(x)
  841.                 result.Add(test_function(f));
  842.  
  843.                 //если дошли до второго f(x)
  844.                 if (i > 0) {
  845.                     //если знак поменялся или одно из f(x) равно нулю
  846.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  847.                         //перезаписываем предыдущее заначение x
  848.                         float A = prevF;
  849.                         //перезаписываем текущее заначение x
  850.                         float B = f;
  851.                         float fa, fb, fx;
  852.                         //вычисляем x для уточнения корней
  853.                         float x = (A + B) / 2;
  854.  
  855.                         //вычисляем расстояние между точками
  856.                         float check1 = Math.Abs(A - B);
  857.  
  858.                         //счиатем пока расстояние между точками
  859.                         //больше заданной точности
  860.                         while (check1 > eps) {
  861.                             //вычисляем f(a)
  862.                             fa = test_function(A);
  863.                             //вычисляем f(b)
  864.                             fb = test_function(B);
  865.                             //вычисляем f(x)
  866.                             fx = test_function(x);
  867.                             //если знак f(x) изменился
  868.                             //то сдвиагем границу
  869.                             A = fx * fa > 0 ? x : B = x;
  870.                             //вычисляем новое значение x
  871.                             x = (A + B) / 2;
  872.                             //вычисляем расстояние между точками
  873.                             check1 = Math.Abs(A - B);
  874.                         }
  875.  
  876.                         float xp = x - (float)eps;
  877.  
  878.                         float xi = SecantCalc(x, xp, test_function);
  879.                         //вычисляем расстояние между корнями
  880.                         float check = Math.Abs(x - xi);
  881.  
  882.                         while (check > eps) {
  883.                             //вычисляем новое значение x
  884.                             xi = SecantCalc(x, xp, test_function);
  885.                             //вычисляем расстояние между точками
  886.                             check = Math.Abs(x - xi);
  887.                             //запоминаем xk-1
  888.                             xp = x;
  889.                             //запоминаем xk
  890.                             x = xi;
  891.                             ItCount++;
  892.                         }
  893.  
  894.                         Console.WriteLine($"x{count}: " + x);
  895.                         lines[count - 1] = Convert.ToString(x);
  896.                         count++;
  897.                     }
  898.                 }
  899.                 prevF = f;
  900.             }
  901.             //путь для ответа
  902.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  903.             //запись ответа в файл
  904.             File.WriteAllLines($"{AnswerPath}", lines);
  905.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  906.         }
  907.  
  908.         //Метод Секущих и хорд
  909.         static void SecantChord(int a, int b, int menu) {
  910.             //массив для ответов
  911.             string[] lines = new string[20];
  912.             //счётчик корней
  913.             int count = 1;
  914.             //счётчик итераций
  915.             int ItCount = 0;
  916.             //шаг
  917.             //float h = 0.00003F;
  918.             //сохранение предыщего значения x
  919.             float prevF = 0;
  920.             //индекс массива result
  921.             int i = 0;
  922.             //точность
  923.             //double eps = 0.000001;
  924.  
  925.             //массив хранения f(x) в локализации
  926.             List<float> result = new List<float>();
  927.  
  928.             //делегат для ф-ии
  929.             function test_function = test_function1;
  930.             //делегат для производной
  931.             derivative derivative = derivative1;
  932.             //присваение ф-ии делегату
  933.             switch (menu) {
  934.                 case 1:
  935.                     test_function = test_function1;
  936.                     derivative = derivative1;
  937.                     break;
  938.                 case 2:
  939.                     test_function = test_function2;
  940.                     derivative = derivative2;
  941.                     break;
  942.                 case 3:
  943.                     test_function = test_function3;
  944.                     derivative = derivative3;
  945.                     break;
  946.             }
  947.  
  948.             //локализуем и сразу считаем
  949.             for (float f = a; f <= b; f += h, i++) {
  950.                 //вычисляем знаечение f(x)
  951.                 result.Add(test_function(f));
  952.  
  953.                 //если дошли до второго f(x)
  954.                 if (i > 0) {
  955.                     //если знак поменялся или одно из f(x) равно нулю
  956.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  957.                         //перезаписываем предыдущее заначение x
  958.                         float A = prevF;
  959.                         //перезаписываем текущее заначение x
  960.                         float B = f;
  961.                         float fa, fb, fx;
  962.                         //вычисляем f(a)
  963.                         fa = test_function(A);
  964.                         //вычисляем f(b)
  965.                         fb = test_function(B);
  966.  
  967.                         float x = (float)(A - (B - A) / (fb - fa) * fa);
  968.  
  969.                         //вычисляем расстояние между точками
  970.                         float check1 = Math.Abs(A - B);
  971.  
  972.                         //счиатем пока расстояние между точками
  973.                         //больше заданной точности
  974.                         while (check1 > eps) {
  975.                             //вычисляем f(a)
  976.                             fa = test_function(A);
  977.                             //вычисляем f(b)
  978.                             fb = test_function(B);
  979.                             //вычисляем f(x)
  980.                             fx = test_function(x);
  981.                             //если знак f(x) изменился
  982.                             //то сдвиагем границу
  983.                             A = fx * fa > 0 ? x : B = x;
  984.                             //вычисляем новое значение x
  985.                             x = (float)(A - (B - A) / (fb - fa) * fa);
  986.                             //вычисляем расстояние между точками
  987.                             check1 = Math.Abs(A - B);
  988.                         }
  989.                         float xp = x - (float)eps;
  990.                         float xi = SecantCalc(x, xp, test_function);
  991.                         //вычисляем расстояние между корнями
  992.                         float check = Math.Abs(x - xi);
  993.  
  994.                         while (check > eps) {
  995.                             //вычисляем новое значение x
  996.                             xi = SecantCalc(x, xp, test_function);
  997.                             //вычисляем расстояние между точками
  998.                             check = Math.Abs(x - xi);
  999.                             //запоминаем xk-1
  1000.                             xp = x;
  1001.                             //запоминаем xk
  1002.                             x = xi;
  1003.                             ItCount++;
  1004.                         }
  1005.  
  1006.                         Console.WriteLine($"x{count}: " + x);
  1007.                         lines[count - 1] = Convert.ToString(x);
  1008.                         count++;
  1009.                     }
  1010.                 }
  1011.                 prevF = f;
  1012.             }
  1013.             //путь для ответа
  1014.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1015.             //запись ответа в файл
  1016.             File.WriteAllLines($"{AnswerPath}", lines);
  1017.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1018.         }
  1019.  
  1020.         //Метод Секущих и золотого сечения
  1021.         static void SecantGold(int a, int b, int menu) {
  1022.             //массив для ответов
  1023.             string[] lines = new string[20];
  1024.             //счётчик корней
  1025.             int count = 1;
  1026.             //счётчик итераций
  1027.             int ItCount = 0;
  1028.             //шаг
  1029.             //float h = 0.00003F;
  1030.             //сохранение предыщего значения x
  1031.             float prevF = 0;
  1032.             //индекс массива result
  1033.             int i = 0;
  1034.             //точность
  1035.             //double eps = 0.000001;
  1036.  
  1037.             //массив хранения f(x) в локализации
  1038.             List<float> result = new List<float>();
  1039.  
  1040.             //делегат для ф-ии
  1041.             function test_function = test_function1;
  1042.             //делегат для производной
  1043.             derivative derivative = derivative1;
  1044.             //присваение ф-ии делегату
  1045.             switch (menu) {
  1046.                 case 1:
  1047.                     test_function = test_function1;
  1048.                     derivative = derivative1;
  1049.                     break;
  1050.                 case 2:
  1051.                     test_function = test_function2;
  1052.                     derivative = derivative2;
  1053.                     break;
  1054.                 case 3:
  1055.                     test_function = test_function3;
  1056.                     derivative = derivative3;
  1057.                     break;
  1058.             }
  1059.  
  1060.             //локализуем и сразу считаем
  1061.             for (float f = a; f <= b; f += h, i++) {
  1062.                 //вычисляем знаечение f(x)
  1063.                 result.Add(test_function(f));
  1064.  
  1065.                 //если дошли до второго f(x)
  1066.                 if (i > 0) {
  1067.                     //если знак поменялся или одно из f(x) равно нулю
  1068.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1069.                         //перезаписываем предыдущее заначение x
  1070.                         float A = prevF;
  1071.                         //перезаписываем текущее заначение x
  1072.                         float B = f;
  1073.                         //вычисляем x для уточнения корней
  1074.                         float x;
  1075.                         float fa, fb, fx1, fx2;
  1076.  
  1077.                         //вычисляем x для уточнения корней
  1078.                         float x1 = B - (B - A) / Ф;
  1079.                         float x2 = A + (B - A) / Ф;
  1080.  
  1081.                         //вычисляем расстояние между точками
  1082.                         float check1 = Math.Abs(A - B);
  1083.  
  1084.                         //счиатем пока расстояние между точками
  1085.                         //больше заданной точности
  1086.                         while (check1 > eps) {
  1087.                             //вычисляем f(a)
  1088.                             fa = test_function(A);
  1089.                             //вычисляем f(b)
  1090.                             fb = test_function(B);
  1091.                             //вычисляем f(x1)
  1092.                             fx1 = test_function(x1);
  1093.                             //вычисляем f(x2)
  1094.                             fx2 = test_function(x2);
  1095.                             //если знак f(x) изменился
  1096.                             //то сдвиагем границу
  1097.                             if (x1 > x2)
  1098.                                 A = fx1 * fa > 0 ? x1 : B = x1;
  1099.                             else
  1100.                                 A = fx2 * fa > 0 ? x2 : B = x2;
  1101.                             //вычисляем новые значения x
  1102.                             x1 = B - (B - A) / Ф;
  1103.                             x2 = A + (B - A) / Ф;
  1104.                             //вычисляем расстояние между точками
  1105.                             check1 = Math.Abs(A - B);
  1106.                         }
  1107.  
  1108.                         x = (x1 + x2) / 2;
  1109.                         float xp = x - (float)eps;
  1110.  
  1111.                         float xi = SecantCalc(x, xp, test_function);
  1112.                         //вычисляем расстояние между корнями
  1113.                         float check = Math.Abs(x - xi);
  1114.  
  1115.                         while (check > eps) {
  1116.                             //вычисляем новое значение x
  1117.                             xi = SecantCalc(x, xp, test_function);
  1118.                             //вычисляем расстояние между точками
  1119.                             check = Math.Abs(x - xi);
  1120.                             //запоминаем xk-1
  1121.                             xp = x;
  1122.                             //запоминаем xk
  1123.                             x = xi;
  1124.                             ItCount++;
  1125.                         }
  1126.  
  1127.                         Console.WriteLine($"x{count}: " + x);
  1128.                         lines[count - 1] = Convert.ToString(x);
  1129.                         count++;
  1130.                     }
  1131.                 }
  1132.                 prevF = f;
  1133.             }
  1134.             //путь для ответа
  1135.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1136.             //запись ответа в файл
  1137.             File.WriteAllLines($"{AnswerPath}", lines);
  1138.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1139.         }
  1140.  
  1141.         //Метод простых итераций и половинного деления
  1142.         static void SimpleIterationHD(int a, int b, int menu) {
  1143.             //массив для ответов
  1144.             string[] lines = new string[20];
  1145.             //счётчик корней
  1146.             int count = 1;
  1147.             //счётчик итераций
  1148.  
  1149.             int ItCount = 0;
  1150.             //шаг
  1151.             //float h = 0.00003F;
  1152.             //сохранение предыщего значения x
  1153.             float prevF = 0;
  1154.             //индекс массива result
  1155.             int i = 0;
  1156.  
  1157.             //массив хранения f(x) в локализации
  1158.             List<float> result = new List<float>();
  1159.  
  1160.             //делегат для ф-ии
  1161.             function test_function = test_function1;
  1162.             Phi Phi = Phi1;
  1163.             //присваение ф-ии делегату
  1164.             switch (menu) {
  1165.                 case 1:
  1166.                     test_function = test_function1;
  1167.                     Phi = Phi1;
  1168.                     break;
  1169.                 case 2:
  1170.                     test_function = test_function2;
  1171.                     Phi = Phi2;
  1172.                     break;
  1173.                 case 3:
  1174.                     test_function = test_function3;
  1175.                     Phi = Phi3;
  1176.                     break;
  1177.             }
  1178.  
  1179.  
  1180.             //локализуем и сразу считаем
  1181.             for (float f = a; f <= b; f += h, i++) {
  1182.                 //вычисляем знаечение f(x)
  1183.                 result.Add(test_function(f));
  1184.  
  1185.                 //если дошли до второго f(x)
  1186.                 if (i > 0) {
  1187.                     //если знак поменялся или одно из f(x) равно нулю
  1188.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1189.                         //перезаписываем предыдущее заначение x
  1190.                         float A = prevF;
  1191.                         //перезаписываем текущее заначение x
  1192.                         float B = f;
  1193.                         float fa, fb, fx;
  1194.                         //вычисляем x для уточнения корней
  1195.                         float x = (A + B) / 2;
  1196.  
  1197.                         //вычисляем расстояние между точками
  1198.                         float check1 = Math.Abs(A - B);
  1199.  
  1200.                         //счиатем пока расстояние между точками
  1201.                         //больше заданной точности
  1202.                         while (check1 > eps) {
  1203.                             //вычисляем f(a)
  1204.                             fa = test_function(A);
  1205.                             //вычисляем f(b)
  1206.                             fb = test_function(B);
  1207.                             //вычисляем f(x)
  1208.                             fx = test_function(x);
  1209.                             //если знак f(x) изменился
  1210.                             //то сдвиагем границу
  1211.                             A = fx * fa > 0 ? x : B = x;
  1212.                             //вычисляем новое значение x
  1213.                             x = (A + B) / 2;
  1214.                             //вычисляем расстояние между точками
  1215.                             check1 = Math.Abs(A - B);
  1216.                         }
  1217.                         float xi;
  1218.                         //вычисляем расстояние между корнями
  1219.                         float check = Math.Abs(DerivativePhi(x, menu));
  1220.  
  1221.                         while (check >= 1) {
  1222.                             xi = Phi(x);
  1223.                             x = xi;
  1224.                             check = Math.Abs(DerivativePhi(x, menu));
  1225.                             ItCount++;
  1226.                         }
  1227.  
  1228.                         Console.WriteLine($"x{count}: " + x);
  1229.                         lines[count - 1] = Convert.ToString(x);
  1230.                         count++;
  1231.                     }
  1232.                 }
  1233.                 prevF = f;
  1234.             }
  1235.             //путь для ответа
  1236.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1237.             //запись ответа в файл
  1238.             File.WriteAllLines($"{AnswerPath}", lines);
  1239.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1240.         }
  1241.        
  1242.         //Метод простых итераций и хорд
  1243.         static void SimpleIterationChord(int a, int b, int menu) {
  1244.             //массив для ответов
  1245.             string[] lines = new string[20];
  1246.             //счётчик корней
  1247.             int count = 1;
  1248.             //счётчик итераций
  1249.             int ItCount = 0;
  1250.             //шаг
  1251.             //float h = 0.00003F;
  1252.             //сохранение предыщего значения x
  1253.             float prevF = 0;
  1254.             //индекс массива result
  1255.             int i = 0;
  1256.  
  1257.             //массив хранения f(x) в локализации
  1258.             List<float> result = new List<float>();
  1259.  
  1260.             //делегат для ф-ии
  1261.             function test_function = test_function1;
  1262.             Phi Phi = Phi1;
  1263.             //присваение ф-ии делегату
  1264.             switch (menu) {
  1265.                 case 1:
  1266.                     test_function = test_function1;
  1267.                     Phi = Phi1;
  1268.                     break;
  1269.                 case 2:
  1270.                     test_function = test_function2;
  1271.                     Phi = Phi2;
  1272.                     break;
  1273.                 case 3:
  1274.                     test_function = test_function3;
  1275.                     Phi = Phi3;
  1276.                     break;
  1277.             }
  1278.  
  1279.  
  1280.             //локализуем и сразу считаем
  1281.             for (float f = a; f <= b; f += h, i++) {
  1282.                 //вычисляем знаечение f(x)
  1283.                 result.Add(test_function(f));
  1284.  
  1285.                 //если дошли до второго f(x)
  1286.                 if (i > 0) {
  1287.                     //если знак поменялся или одно из f(x) равно нулю
  1288.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1289.                         //перезаписываем предыдущее заначение x
  1290.                         float A = prevF;
  1291.                         //перезаписываем текущее заначение x
  1292.                         float B = f;
  1293.                         float fa, fb, fx;
  1294.                         //вычисляем f(a)
  1295.                         fa = test_function(A);
  1296.                         //вычисляем f(b)
  1297.                         fb = test_function(B);
  1298.  
  1299.                         float x = (float)(A - (B - A) / (fb - fa) * fa);
  1300.  
  1301.                         //вычисляем расстояние между точками
  1302.                         float check1 = Math.Abs(A - B);
  1303.  
  1304.                         //счиатем пока расстояние между точками
  1305.                         //больше заданной точности
  1306.                         while (check1 > eps) {
  1307.                             //вычисляем f(a)
  1308.                             fa = test_function(A);
  1309.                             //вычисляем f(b)
  1310.                             fb = test_function(B);
  1311.                             //вычисляем f(x)
  1312.                             fx = test_function(x);
  1313.                             //если знак f(x) изменился
  1314.                             //то сдвиагем границу
  1315.                             A = fx * fa > 0 ? x : B = x;
  1316.                             //вычисляем новое значение x
  1317.                             x = (float)(A - (B - A) / (fb - fa) * fa);
  1318.                             //вычисляем расстояние между точками
  1319.                             check1 = Math.Abs(A - B);
  1320.                         }
  1321.  
  1322.                         float xi;
  1323.                         //вычисляем расстояние между корнями
  1324.                         float check = Math.Abs(DerivativePhi(x, menu));
  1325.  
  1326.                         while (check >= 1) {
  1327.                             xi = Phi(x);
  1328.                             x = xi;
  1329.                             check = Math.Abs(DerivativePhi(x, menu));
  1330.                             ItCount++;
  1331.                         }
  1332.  
  1333.                         Console.WriteLine($"x{count}: " + x);
  1334.                         lines[count - 1] = Convert.ToString(x);
  1335.                         count++;
  1336.                     }
  1337.                 }
  1338.                 prevF = f;
  1339.             }
  1340.             //путь для ответа
  1341.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1342.             //запись ответа в файл
  1343.             File.WriteAllLines($"{AnswerPath}", lines);
  1344.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1345.         }
  1346.  
  1347.         //Метод простых итераций и золотого сечения
  1348.         static void SimpleIterationGold(int a, int b, int menu) {
  1349.             //массив для ответов
  1350.             string[] lines = new string[20];
  1351.             //счётчик корней
  1352.             int count = 1;
  1353.             //счётчик итераций
  1354.             int ItCount = 0;
  1355.             //шаг
  1356.             //float h = 0.00003F;
  1357.             //сохранение предыщего значения x
  1358.             float prevF = 0;
  1359.             //индекс массива result
  1360.             int i = 0;
  1361.  
  1362.             //массив хранения f(x) в локализации
  1363.             List<float> result = new List<float>();
  1364.  
  1365.             //делегат для ф-ии
  1366.             function test_function = test_function1;
  1367.             Phi Phi = Phi1;
  1368.             //присваение ф-ии делегату
  1369.             switch (menu) {
  1370.                 case 1:
  1371.                     test_function = test_function1;
  1372.                     Phi = Phi1;
  1373.                     break;
  1374.                 case 2:
  1375.                     test_function = test_function2;
  1376.                     Phi = Phi2;
  1377.                     break;
  1378.                 case 3:
  1379.                     test_function = test_function3;
  1380.                     Phi = Phi3;
  1381.                     break;
  1382.             }
  1383.  
  1384.  
  1385.             //локализуем и сразу считаем
  1386.             for (float f = a; f <= b; f += h, i++) {
  1387.                 //вычисляем знаечение f(x)
  1388.                 result.Add(test_function(f));
  1389.  
  1390.                 //если дошли до второго f(x)
  1391.                 if (i > 0) {
  1392.                     //если знак поменялся или одно из f(x) равно нулю
  1393.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1394.                         //перезаписываем предыдущее заначение x
  1395.                         float A = prevF;
  1396.                         //перезаписываем текущее заначение x
  1397.                         float B = f;
  1398.                         //вычисляем x для уточнения корней
  1399.                         float x;
  1400.                         float fa, fb, fx1, fx2;
  1401.  
  1402.                         //вычисляем x для уточнения корней
  1403.                         float x1 = B - (B - A) / Ф;
  1404.                         float x2 = A + (B - A) / Ф;
  1405.  
  1406.                         //вычисляем расстояние между точками
  1407.                         float check1 = Math.Abs(A - B);
  1408.  
  1409.                         //счиатем пока расстояние между точками
  1410.                         //больше заданной точности
  1411.                         while (check1 > eps) {
  1412.                             //вычисляем f(a)
  1413.                             fa = test_function(A);
  1414.                             //вычисляем f(b)
  1415.                             fb = test_function(B);
  1416.                             //вычисляем f(x1)
  1417.                             fx1 = test_function(x1);
  1418.                             //вычисляем f(x2)
  1419.                             fx2 = test_function(x2);
  1420.                             //если знак f(x) изменился
  1421.                             //то сдвиагем границу
  1422.                             if (x1 > x2)
  1423.                                 A = fx1 * fa > 0 ? x1 : B = x1;
  1424.                             else
  1425.                                 A = fx2 * fa > 0 ? x2 : B = x2;
  1426.                             //вычисляем новые значения x
  1427.                             x1 = B - (B - A) / Ф;
  1428.                             x2 = A + (B - A) / Ф;
  1429.                             //вычисляем расстояние между точками
  1430.                             check1 = Math.Abs(A - B);
  1431.                         }
  1432.  
  1433.                         x = (x1 + x2) / 2;
  1434.  
  1435.                         float xi;
  1436.                         //вычисляем расстояние между корнями
  1437.                         float check = Math.Abs(DerivativePhi(x, menu));
  1438.  
  1439.                         while (check >= 1) {
  1440.                             xi = Phi(x);
  1441.                             x = xi;
  1442.                             check = Math.Abs(DerivativePhi(x, menu));
  1443.                             ItCount++;
  1444.                         }
  1445.  
  1446.                         Console.WriteLine($"x{count}: " + x);
  1447.                         lines[count - 1] = Convert.ToString(x);
  1448.                         count++;
  1449.                     }
  1450.                 }
  1451.                 prevF = f;
  1452.             }
  1453.             //путь для ответа
  1454.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1455.             //запись ответа в файл
  1456.             File.WriteAllLines($"{AnswerPath}", lines);
  1457.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1458.         }
  1459.  
  1460.         //Метод Риддерса и половинного деления
  1461.         static void RidderHD(int a, int b, int menu) {
  1462.             //массив для ответов
  1463.             string[] lines = new string[20];
  1464.             //счётчик корней
  1465.             int count = 1;
  1466.             //счётчик итераций
  1467.             int ItCount = 0;
  1468.             //шаг
  1469.             //float h = 0.00003F;
  1470.             //сохранение предыщего значения x
  1471.             float prevF = 0;
  1472.             //индекс массива result
  1473.             int i = 0;
  1474.             //точность
  1475.             //double eps = 0.000001;
  1476.  
  1477.             //массив хранения f(x) в локализации
  1478.             List<float> result = new List<float>();
  1479.  
  1480.             //делегат для ф-ии
  1481.             function test_function = test_function1;
  1482.             //делегат для производной
  1483.             derivative derivative = derivative1;
  1484.             //присваение ф-ии делегату
  1485.             switch (menu) {
  1486.                 case 1:
  1487.                     test_function = test_function1;
  1488.                     derivative = derivative1;
  1489.                     break;
  1490.                 case 2:
  1491.                     test_function = test_function2;
  1492.                     derivative = derivative2;
  1493.                     break;
  1494.                 case 3:
  1495.                     test_function = test_function3;
  1496.                     derivative = derivative3;
  1497.                     break;
  1498.             }
  1499.  
  1500.             //локализуем и сразу считаем
  1501.             for (float f = a; f <= b; f += h, i++) {
  1502.                 //вычисляем знаечение f(x)
  1503.                 result.Add(test_function(f));
  1504.  
  1505.                 //если дошли до второго f(x)
  1506.                 if (i > 0) {
  1507.                     //если знак поменялся или одно из f(x) равно нулю
  1508.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1509.                         //перезаписываем предыдущее заначение x
  1510.                         float A = prevF;
  1511.                         //перезаписываем текущее заначение x
  1512.                         float B = f;
  1513.                         //вычисляем x для уточнения корней
  1514.                         float xp, xi;
  1515.                         xp = A;
  1516.                         float fa, fb, fx;
  1517.                         //вычисляем x для уточнения корней
  1518.                         float x = (A + B) / 2;
  1519.  
  1520.                         //вычисляем расстояние между точками
  1521.                         float check1 = Math.Abs(A - B);
  1522.  
  1523.                         //счиатем пока расстояние между точками
  1524.                         //больше заданной точности
  1525.                         while (check1 > eps) {
  1526.                             //вычисляем f(a)
  1527.                             fa = test_function(A);
  1528.                             //вычисляем f(b)
  1529.                             fb = test_function(B);
  1530.                             //вычисляем f(x)
  1531.                             fx = test_function(x);
  1532.                             //если знак f(x) изменился
  1533.                             //то сдвиагем границу
  1534.                             A = fx * fa > 0 ? x : B = x;
  1535.                             //вычисляем новое значение x
  1536.                             x = (A + B) / 2;
  1537.                             //вычисляем расстояние между точками
  1538.                             check1 = Math.Abs(A - B);
  1539.                         }
  1540.  
  1541.                         xi = CalcXRidder(x, xp, test_function);
  1542.  
  1543.                         //вычисляем расстояние между корнями
  1544.                         float check = Math.Abs(x - xi);
  1545.  
  1546.                         while (check > eps) {
  1547.                             xi = CalcXRidder(x, xp, test_function);
  1548.                             check = Math.Abs(x - xi);
  1549.                             xp = x;
  1550.                             x = xi;
  1551.                             ItCount++;
  1552.                         }
  1553.  
  1554.                         Console.WriteLine($"x{count}: " + x);
  1555.                         lines[count - 1] = Convert.ToString(x);
  1556.                         count++;
  1557.                     }
  1558.                 }
  1559.                 prevF = f;
  1560.             }
  1561.             //путь для ответа
  1562.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1563.             //запись ответа в файл
  1564.             File.WriteAllLines($"{AnswerPath}", lines);
  1565.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1566.         }
  1567.  
  1568.         //Метод Риддерса и хорд
  1569.         static void RidderChord(int a, int b, int menu) {
  1570.             //массив для ответов
  1571.             string[] lines = new string[20];
  1572.             //счётчик корней
  1573.             int count = 1;
  1574.             //счётчик итераций
  1575.             int ItCount = 0;
  1576.             //шаг
  1577.             //float h = 0.00003F;
  1578.             //сохранение предыщего значения x
  1579.             float prevF = 0;
  1580.             //индекс массива result
  1581.             int i = 0;
  1582.             //точность
  1583.             //double eps = 0.000001;
  1584.  
  1585.             //массив хранения f(x) в локализации
  1586.             List<float> result = new List<float>();
  1587.  
  1588.             //делегат для ф-ии
  1589.             function test_function = test_function1;
  1590.             //делегат для производной
  1591.             derivative derivative = derivative1;
  1592.             //присваение ф-ии делегату
  1593.             switch (menu) {
  1594.                 case 1:
  1595.                     test_function = test_function1;
  1596.                     derivative = derivative1;
  1597.                     break;
  1598.                 case 2:
  1599.                     test_function = test_function2;
  1600.                     derivative = derivative2;
  1601.                     break;
  1602.                 case 3:
  1603.                     test_function = test_function3;
  1604.                     derivative = derivative3;
  1605.                     break;
  1606.             }
  1607.  
  1608.             //локализуем и сразу считаем
  1609.             for (float f = a; f <= b; f += h, i++) {
  1610.                 //вычисляем знаечение f(x)
  1611.                 result.Add(test_function(f));
  1612.  
  1613.                 //если дошли до второго f(x)
  1614.                 if (i > 0) {
  1615.                     //если знак поменялся или одно из f(x) равно нулю
  1616.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1617.                         //перезаписываем предыдущее заначение x
  1618.                         float A = prevF;
  1619.                         //перезаписываем текущее заначение x
  1620.                         float B = f;
  1621.                         //вычисляем x для уточнения корней
  1622.                         float xp, xi;
  1623.                         xp = A;
  1624.                         float fa, fb, fx;
  1625.                         //вычисляем f(a)
  1626.                         fa = test_function(A);
  1627.                         //вычисляем f(b)
  1628.                         fb = test_function(B);
  1629.  
  1630.                         float x = (float)(A - (B - A) / (fb - fa) * fa);
  1631.  
  1632.                         //вычисляем расстояние между точками
  1633.                         float check1 = Math.Abs(A - B);
  1634.  
  1635.                         //счиатем пока расстояние между точками
  1636.                         //больше заданной точности
  1637.                         while (check1 > eps) {
  1638.                             //вычисляем f(a)
  1639.                             fa = test_function(A);
  1640.                             //вычисляем f(b)
  1641.                             fb = test_function(B);
  1642.                             //вычисляем f(x)
  1643.                             fx = test_function(x);
  1644.                             //если знак f(x) изменился
  1645.                             //то сдвиагем границу
  1646.                             A = fx * fa > 0 ? x : B = x;
  1647.                             //вычисляем новое значение x
  1648.                             x = (float)(A - (B - A) / (fb - fa) * fa);
  1649.                             //вычисляем расстояние между точками
  1650.                             check1 = Math.Abs(A - B);
  1651.                         }
  1652.                         xi = CalcXRidder(x, xp, test_function);
  1653.  
  1654.                         //вычисляем расстояние между корнями
  1655.                         float check = Math.Abs(x - xi);
  1656.  
  1657.                         while (check > eps) {
  1658.                             xi = CalcXRidder(x, xp, test_function);
  1659.                             check = Math.Abs(x - xi);
  1660.                             xp = x;
  1661.                             x = xi;
  1662.                             ItCount++;
  1663.                         }
  1664.  
  1665.                         Console.WriteLine($"x{count}: " + x);
  1666.                         lines[count - 1] = Convert.ToString(x);
  1667.                         count++;
  1668.                     }
  1669.                 }
  1670.                 prevF = f;
  1671.             }
  1672.             //путь для ответа
  1673.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1674.             //запись ответа в файл
  1675.             File.WriteAllLines($"{AnswerPath}", lines);
  1676.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1677.         }
  1678.  
  1679.         //Метод Риддерса и золотого сечения
  1680.         static void RidderGold(int a, int b, int menu) {
  1681.             //массив для ответов
  1682.             string[] lines = new string[20];
  1683.             //счётчик корней
  1684.             int count = 1;
  1685.             //счётчик итераций
  1686.             int ItCount = 0;
  1687.             //шаг
  1688.             //float h = 0.00003F;
  1689.             //сохранение предыщего значения x
  1690.             float prevF = 0;
  1691.             //индекс массива result
  1692.             int i = 0;
  1693.             //точность
  1694.             //double eps = 0.000001;
  1695.  
  1696.             //массив хранения f(x) в локализации
  1697.             List<float> result = new List<float>();
  1698.  
  1699.             //делегат для ф-ии
  1700.             function test_function = test_function1;
  1701.             //делегат для производной
  1702.             derivative derivative = derivative1;
  1703.             //присваение ф-ии делегату
  1704.             switch (menu) {
  1705.                 case 1:
  1706.                     test_function = test_function1;
  1707.                     derivative = derivative1;
  1708.                     break;
  1709.                 case 2:
  1710.                     test_function = test_function2;
  1711.                     derivative = derivative2;
  1712.                     break;
  1713.                 case 3:
  1714.                     test_function = test_function3;
  1715.                     derivative = derivative3;
  1716.                     break;
  1717.             }
  1718.  
  1719.             //локализуем и сразу считаем
  1720.             for (float f = a; f <= b; f += h, i++) {
  1721.                 //вычисляем знаечение f(x)
  1722.                 result.Add(test_function(f));
  1723.  
  1724.                 //если дошли до второго f(x)
  1725.                 if (i > 0) {
  1726.                     //если знак поменялся или одно из f(x) равно нулю
  1727.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1728.                         //перезаписываем предыдущее заначение x
  1729.                         float A = prevF;
  1730.                         //перезаписываем текущее заначение x
  1731.                         float B = f;
  1732.                         //вычисляем x для уточнения корней
  1733.                         float x, xp, xi;
  1734.                         xp = A;
  1735.                         //вычисляем x для уточнения корней
  1736.                         float fa, fb, fx1, fx2;
  1737.  
  1738.                         //вычисляем x для уточнения корней
  1739.                         float x1 = B - (B - A) / Ф;
  1740.                         float x2 = A + (B - A) / Ф;
  1741.  
  1742.                         //вычисляем расстояние между точками
  1743.                         float check1 = Math.Abs(A - B);
  1744.  
  1745.                         //счиатем пока расстояние между точками
  1746.                         //больше заданной точности
  1747.                         while (check1 > eps) {
  1748.                             //вычисляем f(a)
  1749.                             fa = test_function(A);
  1750.                             //вычисляем f(b)
  1751.                             fb = test_function(B);
  1752.                             //вычисляем f(x1)
  1753.                             fx1 = test_function(x1);
  1754.                             //вычисляем f(x2)
  1755.                             fx2 = test_function(x2);
  1756.                             //если знак f(x) изменился
  1757.                             //то сдвиагем границу
  1758.                             if (x1 > x2)
  1759.                                 A = fx1 * fa > 0 ? x1 : B = x1;
  1760.                             else
  1761.                                 A = fx2 * fa > 0 ? x2 : B = x2;
  1762.                             //вычисляем новые значения x
  1763.                             x1 = B - (B - A) / Ф;
  1764.                             x2 = A + (B - A) / Ф;
  1765.                             //вычисляем расстояние между точками
  1766.                             check1 = Math.Abs(A - B);
  1767.                         }
  1768.  
  1769.                         x = (x1 + x2) / 2;
  1770.                         xi = CalcXRidder(x, xp, test_function);
  1771.  
  1772.                         //вычисляем расстояние между корнями
  1773.                         float check = Math.Abs(x - xi);
  1774.  
  1775.                         while (check > eps) {
  1776.                             xi = CalcXRidder(x, xp, test_function);
  1777.                             check = Math.Abs(x - xi);
  1778.                             xp = x;
  1779.                             x = xi;
  1780.                             ItCount++;
  1781.                         }
  1782.  
  1783.                         Console.WriteLine($"x{count}: " + x);
  1784.                         lines[count - 1] = Convert.ToString(x);
  1785.                         count++;
  1786.                     }
  1787.                 }
  1788.                 prevF = f;
  1789.             }
  1790.             //путь для ответа
  1791.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1792.             //запись ответа в файл
  1793.             File.WriteAllLines($"{AnswerPath}", lines);
  1794.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1795.         }
  1796.  
  1797.         //Метод Мюллера и половинного деления
  1798.         static void MullerHD(int a, int b, int menu) {
  1799.             //массив для ответов
  1800.             string[] lines = new string[20];
  1801.             //счётчик корней
  1802.             int count = 1;
  1803.             //счётчик итераций
  1804.             int ItCount = 0;
  1805.             //шаг
  1806.             //float h = 0.00003F;
  1807.             //сохранение предыщего значения x
  1808.             float prevF = 0;
  1809.             //индекс массива result
  1810.             int i = 0;
  1811.             //точность
  1812.             //double eps = 0.000001;
  1813.  
  1814.             //массив хранения f(x) в локализации
  1815.             List<float> result = new List<float>();
  1816.  
  1817.             //делегат для ф-ии
  1818.             function test_function = test_function1;
  1819.             //делегат для производной
  1820.             derivative derivative = derivative1;
  1821.             //присваение ф-ии делегату
  1822.             switch (menu) {
  1823.                 case 1:
  1824.                     test_function = test_function1;
  1825.                     derivative = derivative1;
  1826.                     break;
  1827.                 case 2:
  1828.                     test_function = test_function2;
  1829.                     derivative = derivative2;
  1830.                     break;
  1831.                 case 3:
  1832.                     test_function = test_function3;
  1833.                     derivative = derivative3;
  1834.                     break;
  1835.             }
  1836.  
  1837.             //локализуем и сразу считаем
  1838.             for (float f = a; f <= b; f += h, i++) {
  1839.                 //вычисляем знаечение f(x)
  1840.                 result.Add(test_function(f));
  1841.  
  1842.                 //если дошли до второго f(x)
  1843.                 if (i > 0) {
  1844.                     //если знак поменялся или одно из f(x) равно нулю
  1845.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1846.                         //перезаписываем предыдущее заначение x
  1847.                         float A = prevF;
  1848.                         //перезаписываем текущее заначение x
  1849.                         float B = f;
  1850.                         //вычисляем x для уточнения корней
  1851.                         float xp, xp2, xi;
  1852.                         float fa, fb, fx;
  1853.                         //вычисляем x для уточнения корней
  1854.                         float x = (A + B) / 2;
  1855.  
  1856.                         //вычисляем расстояние между точками
  1857.                         float check1 = Math.Abs(A - B);
  1858.  
  1859.                         //счиатем пока расстояние между точками
  1860.                         //больше заданной точности
  1861.                         while (check1 > eps) {
  1862.                             //вычисляем f(a)
  1863.                             fa = test_function(A);
  1864.                             //вычисляем f(b)
  1865.                             fb = test_function(B);
  1866.                             //вычисляем f(x)
  1867.                             fx = test_function(x);
  1868.                             //если знак f(x) изменился
  1869.                             //то сдвиагем границу
  1870.                             A = fx * fa > 0 ? x : B = x;
  1871.                             //вычисляем новое значение x
  1872.                             x = (A + B) / 2;
  1873.                             //вычисляем расстояние между точками
  1874.                             check1 = Math.Abs(A - B);
  1875.                         }
  1876.  
  1877.                         xp = B;
  1878.                         xp2 = (A + B) / 2;
  1879.                         xi = CalcXMuller(x, xp, xp2, test_function);
  1880.                         //вычисляем расстояние между корнями
  1881.                         float check = Math.Abs(x - xi);
  1882.  
  1883.                         while (check > eps) {
  1884.                             xi = CalcXMuller(x, xp, xp2, test_function);
  1885.                             check = Math.Abs(x - xi);
  1886.                             xp2 = xp;
  1887.                             xp = x;
  1888.                             x = xi;
  1889.                             ItCount++;
  1890.                         }
  1891.  
  1892.                         Console.WriteLine($"x{count}: " + x);
  1893.                         lines[count - 1] = Convert.ToString(x);
  1894.                         count++;
  1895.                     }
  1896.                 }
  1897.                 prevF = f;
  1898.             }
  1899.             //путь для ответа
  1900.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  1901.             //запись ответа в файл
  1902.             File.WriteAllLines($"{AnswerPath}", lines);
  1903.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  1904.         }
  1905.  
  1906.         //Метод Мюллера и хорд
  1907.         static void MullerChord(int a, int b, int menu) {
  1908.             //массив для ответов
  1909.             string[] lines = new string[20];
  1910.             //счётчик корней
  1911.             int count = 1;
  1912.             //счётчик итераций
  1913.             int ItCount = 0;
  1914.             //шаг
  1915.             //float h = 0.00003F;
  1916.             //сохранение предыщего значения x
  1917.             float prevF = 0;
  1918.             //индекс массива result
  1919.             int i = 0;
  1920.             //точность
  1921.             //double eps = 0.000001;
  1922.  
  1923.             //массив хранения f(x) в локализации
  1924.             List<float> result = new List<float>();
  1925.  
  1926.             //делегат для ф-ии
  1927.             function test_function = test_function1;
  1928.             //делегат для производной
  1929.             derivative derivative = derivative1;
  1930.             //присваение ф-ии делегату
  1931.             switch (menu) {
  1932.                 case 1:
  1933.                     test_function = test_function1;
  1934.                     derivative = derivative1;
  1935.                     break;
  1936.                 case 2:
  1937.                     test_function = test_function2;
  1938.                     derivative = derivative2;
  1939.                     break;
  1940.                 case 3:
  1941.                     test_function = test_function3;
  1942.                     derivative = derivative3;
  1943.                     break;
  1944.             }
  1945.  
  1946.             //локализуем и сразу считаем
  1947.             for (float f = a; f <= b; f += h, i++) {
  1948.                 //вычисляем знаечение f(x)
  1949.                 result.Add(test_function(f));
  1950.  
  1951.                 //если дошли до второго f(x)
  1952.                 if (i > 0) {
  1953.                     //если знак поменялся или одно из f(x) равно нулю
  1954.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  1955.                         //перезаписываем предыдущее заначение x
  1956.                         float A = prevF;
  1957.                         //перезаписываем текущее заначение x
  1958.                         float B = f;
  1959.                         //вычисляем x для уточнения корней
  1960.                         float xp, xp2, xi;
  1961.                         float fa, fb, fx;
  1962.                         //вычисляем f(a)
  1963.                         fa = test_function(A);
  1964.                         //вычисляем f(b)
  1965.                         fb = test_function(B);
  1966.  
  1967.                         float x = (float)(A - (B - A) / (fb - fa) * fa);
  1968.  
  1969.                         //вычисляем расстояние между точками
  1970.                         float check1 = Math.Abs(A - B);
  1971.  
  1972.                         //счиатем пока расстояние между точками
  1973.                         //больше заданной точности
  1974.                         while (check1 > eps) {
  1975.                             //вычисляем f(a)
  1976.                             fa = test_function(A);
  1977.                             //вычисляем f(b)
  1978.                             fb = test_function(B);
  1979.                             //вычисляем f(x)
  1980.                             fx = test_function(x);
  1981.                             //если знак f(x) изменился
  1982.                             //то сдвиагем границу
  1983.                             A = fx * fa > 0 ? x : B = x;
  1984.                             //вычисляем новое значение x
  1985.                             x = (float)(A - (B - A) / (fb - fa) * fa);
  1986.                             //вычисляем расстояние между точками
  1987.                             check1 = Math.Abs(A - B);
  1988.                         }
  1989.  
  1990.                         xp = B;
  1991.                         xp2 = (A + B) / 2;
  1992.                         xi = CalcXMuller(x, xp, xp2, test_function);
  1993.                         //вычисляем расстояние между корнями
  1994.                         float check = Math.Abs(x - xi);
  1995.  
  1996.                         while (check > eps) {
  1997.                             xi = CalcXMuller(x, xp, xp2, test_function);
  1998.                             check = Math.Abs(x - xi);
  1999.                             xp2 = xp;
  2000.                             xp = x;
  2001.                             x = xi;
  2002.                             ItCount++;
  2003.                         }
  2004.  
  2005.                         Console.WriteLine($"x{count}: " + x);
  2006.                         lines[count - 1] = Convert.ToString(x);
  2007.                         count++;
  2008.                     }
  2009.                 }
  2010.                 prevF = f;
  2011.             }
  2012.             //путь для ответа
  2013.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  2014.             //запись ответа в файл
  2015.             File.WriteAllLines($"{AnswerPath}", lines);
  2016.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  2017.         }
  2018.  
  2019.         //Метод Мюллера и золотого сечения
  2020.         static void MullerGold(int a, int b, int menu) {
  2021.             //массив для ответов
  2022.             string[] lines = new string[20];
  2023.             //счётчик корней
  2024.             int count = 1;
  2025.             //счётчик итераций
  2026.             int ItCount = 0;
  2027.             //шаг
  2028.             //float h = 0.00003F;
  2029.             //сохранение предыщего значения x
  2030.             float prevF = 0;
  2031.             //индекс массива result
  2032.             int i = 0;
  2033.             //точность
  2034.             //double eps = 0.000001;
  2035.  
  2036.             //массив хранения f(x) в локализации
  2037.             List<float> result = new List<float>();
  2038.  
  2039.             //делегат для ф-ии
  2040.             function test_function = test_function1;
  2041.             //делегат для производной
  2042.             derivative derivative = derivative1;
  2043.             //присваение ф-ии делегату
  2044.             switch (menu) {
  2045.                 case 1:
  2046.                     test_function = test_function1;
  2047.                     derivative = derivative1;
  2048.                     break;
  2049.                 case 2:
  2050.                     test_function = test_function2;
  2051.                     derivative = derivative2;
  2052.                     break;
  2053.                 case 3:
  2054.                     test_function = test_function3;
  2055.                     derivative = derivative3;
  2056.                     break;
  2057.             }
  2058.  
  2059.             //локализуем и сразу считаем
  2060.             for (float f = a; f <= b; f += h, i++) {
  2061.                 //вычисляем знаечение f(x)
  2062.                 result.Add(test_function(f));
  2063.  
  2064.                 //если дошли до второго f(x)
  2065.                 if (i > 0) {
  2066.                     //если знак поменялся или одно из f(x) равно нулю
  2067.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  2068.                         //перезаписываем предыдущее заначение x
  2069.                         float A = prevF;
  2070.                         //перезаписываем текущее заначение x
  2071.                         float B = f;
  2072.                         //вычисляем x для уточнения корней
  2073.                         float xp, xp2, xi;
  2074.                         //вычисляем x для уточнения корней
  2075.                         float x;
  2076.                         float fa, fb, fx1, fx2;
  2077.  
  2078.                         //вычисляем x для уточнения корней
  2079.                         float x1 = B - (B - A) / Ф;
  2080.                         float x2 = A + (B - A) / Ф;
  2081.  
  2082.                         //вычисляем расстояние между точками
  2083.                         float check1 = Math.Abs(A - B);
  2084.  
  2085.                         //счиатем пока расстояние между точками
  2086.                         //больше заданной точности
  2087.                         while (check1 > eps) {
  2088.                             //вычисляем f(a)
  2089.                             fa = test_function(A);
  2090.                             //вычисляем f(b)
  2091.                             fb = test_function(B);
  2092.                             //вычисляем f(x1)
  2093.                             fx1 = test_function(x1);
  2094.                             //вычисляем f(x2)
  2095.                             fx2 = test_function(x2);
  2096.                             //если знак f(x) изменился
  2097.                             //то сдвиагем границу
  2098.                             if (x1 > x2)
  2099.                                 A = fx1 * fa > 0 ? x1 : B = x1;
  2100.                             else
  2101.                                 A = fx2 * fa > 0 ? x2 : B = x2;
  2102.                             //вычисляем новые значения x
  2103.                             x1 = B - (B - A) / Ф;
  2104.                             x2 = A + (B - A) / Ф;
  2105.                             //вычисляем расстояние между точками
  2106.                             check1 = Math.Abs(A - B);
  2107.                         }
  2108.  
  2109.                         x = (x1 + x2) / 2;
  2110.                         xp = B;
  2111.                         xp2 = (A + B) / 2;
  2112.                         xi = CalcXMuller(x, xp, xp2, test_function);
  2113.                         //вычисляем расстояние между корнями
  2114.                         float check = Math.Abs(x - xi);
  2115.  
  2116.                         while (check > eps) {
  2117.                             xi = CalcXMuller(x, xp, xp2, test_function);
  2118.                             check = Math.Abs(x - xi);
  2119.                             xp2 = xp;
  2120.                             xp = x;
  2121.                             x = xi;
  2122.                             ItCount++;
  2123.                         }
  2124.  
  2125.                         Console.WriteLine($"x{count}: " + x);
  2126.                         lines[count - 1] = Convert.ToString(x);
  2127.                         count++;
  2128.                     }
  2129.                 }
  2130.                 prevF = f;
  2131.             }
  2132.             //путь для ответа
  2133.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  2134.             //запись ответа в файл
  2135.             File.WriteAllLines($"{AnswerPath}", lines);
  2136.             Console.WriteLine("Результат работы программы записан в файл, кол-во итераций: " + ItCount);
  2137.         }
  2138.  
  2139.         static void Main(string[] args) {
  2140.             DateTime t1 = new DateTime();
  2141.             t1 = DateTime.Now;
  2142.  
  2143.             int a = -10, b = -a;
  2144.             int menu = 3;
  2145.             Console.Write("Выберите ф-ию: \n1) x^3 + 3x + 1 \n2) x + Lg(x) - 0.5 \n3) tg(0.4x + 0.4) - x^2\n>> ");
  2146.             menu = Int32.Parse(Console.ReadLine());
  2147.  
  2148.             Console.WriteLine(" ————————————————————————— ");
  2149.             Console.WriteLine("|  Выберите метод решения |");
  2150.             Console.WriteLine("|-------------------------|");
  2151.             Console.WriteLine("| 1 |  Ньютона            |");
  2152.             Console.WriteLine("| 4 |  Мод-ый ньютона     |");
  2153.             Console.WriteLine("| 7 |  Секущих            |");
  2154.             Console.WriteLine("|10 |  Простых итераций   |");
  2155.             Console.WriteLine("|13 |  Риддерса           |");
  2156.             Console.WriteLine("|16 |  Мюллера            |");
  2157.             Console.WriteLine(" ————————————————————————— ");
  2158.             Console.Write(">> ");
  2159.             int MainMenu;
  2160.             MainMenu = Int32.Parse(Console.ReadLine());
  2161.             switch (MainMenu) {
  2162.                 case 1: NewtonHD(a, b, menu); break;
  2163.                 case 2: NewtonChord(a, b, menu); break;
  2164.                 case 3: NewtonGold(a, b, menu); break;
  2165.                 case 4: ModNewtonHD(a, b, menu); break;
  2166.                 case 5: ModNewtonChord(a, b, menu); break;
  2167.                 case 6: ModNewtonGold(a, b, menu); break;
  2168.                 case 7: SecantHD(a, b, menu); break;
  2169.                 case 8: SecantChord(a, b, menu); break;
  2170.                 case 9: SecantGold(a, b, menu); break;
  2171.                 case 10: SimpleIterationHD(a, b, menu); break;
  2172.                 case 11: SimpleIterationChord(a, b, menu); break;
  2173.                 case 12: SimpleIterationGold(a, b, menu); break;
  2174.                 case 13: RidderHD(a, b, menu); break;
  2175.                 case 14: RidderChord(a, b, menu); break;
  2176.                 case 15: RidderGold(a, b, menu); break;
  2177.                 case 16: MullerHD(a, b, menu); break;
  2178.                 case 17: MullerChord(a, b, menu); break;
  2179.                 case 18: MullerGold(a, b, menu); break;
  2180.  
  2181.                 default: Console.WriteLine("Неверное значение"); break;
  2182.             }
  2183.  
  2184.             DateTime t2 = new DateTime();
  2185.             t2 = DateTime.Now;
  2186.             Console.WriteLine(t2 - t1);
  2187.             Console.ReadKey();
  2188.         }
  2189.     }
  2190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement