Program.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. namespace ProjMet
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. Console.WriteLine("Введите начало отрезка a: ");
  9. double a = 5;
  10. Console.WriteLine("Введите конец отрезка b: ");
  11. double b = 8;
  12. Console.WriteLine("Введите шаг разбиения h:");
  13. double h = 0.1;
  14. Console.WriteLine("Введите точность k:");
  15. string k = "0.00000001";
  16. int newK = k.Length - 2;
  17. int elements = (int)(((b - a) / h) + 1); // кол-во элементов
  18. double[,] function1 = new double[elements, 2]; // двумерный массив, в котором будут храниться x и f(x)
  19. function1[0, 0] = a; // первое x
  20. function1[0, 1] = 3/a-Math.Cos(a); // первая f(x)
  21. function1[0, 1] = Math.Round(function1[0, 1], 8); // Округление
  22. for (int i = 1; i < elements; i++) // поиск всех f(x)
  23. {
  24. function1[i, 0] = a + h;
  25. function1[i, 0] = Math.Round(function1[i, 0], 2);
  26. a += h;
  27. function1[i, 1] = 3 / a - Math.Cos(a);
  28. function1[i, 1] = Math.Round(function1[i, 1], 8);
  29. }
  30. for (int i = 0; i < elements; i++) // Убрать знак "-" у нулевых значений X, если они имеются
  31. {
  32. for (int j = 0; j < 1; j++)
  33. {
  34. if (function1[i, 0] == 0) function1[i, 0] = Math.Abs(function1[i, 0]);
  35. }
  36. }
  37. for (int i = 0; i < elements; i++) // Вывод массива
  38. {
  39. for (int j = 0; j < 2; j++)
  40. {
  41. if (function1[i, 1] == 0) // Если f(x) равна 0
  42. {
  43. Console.Write($"{function1[i, 0]}\t");
  44. Console.Write($"{function1[i, 1]}\t");
  45. Console.WriteLine(" - x = 0. Корень уравнения\t");
  46. i++;
  47. }
  48. Console.Write($"{function1[i, j]}\t");
  49. }
  50. Console.WriteLine();
  51. }
  52. Console.WriteLine();
  53. for (int i = 0; i < elements; i++) // Поиск подозрительных на отрезок изоляции
  54. {
  55. for (int j = 0; j < 1; j++)
  56. {
  57. if ((i < elements - 1) && ((function1[i, 1] < 0 && function1[i + 1, 1] > 0) || (function1[i, 1] > 0 && function1[i + 1, 1] < 0)))
  58. {
  59. double sideA = function1[i, 0], sideB = function1[i + 1, 0];
  60. Console.WriteLine($"Подозрительный на отрезок изоляции [{sideA};{sideB}]");
  61. int elementsTwo = (int)Math.Round(((sideB - sideA) / (h / 10)))+1;
  62. double[,] isolation = new double[elementsTwo, 2];
  63. isolation[0, 0] = sideA;
  64. isolation[0, 1] = Math.Sin(sideA)-3/Math.Pow(sideA,2);
  65. isolation[0, 1] = Math.Round(isolation[0, 1], 8);
  66. for (int rows = 1; rows < elementsTwo; rows++) // проверка подозрительного на отрезок изоляции
  67. {
  68. isolation[rows, 0] = sideA + h/10;
  69. isolation[rows, 0] = Math.Round(isolation[rows, 0], 2);
  70. sideA += h/10;
  71. isolation[rows, 1] = Math.Sin(sideA) - 3 / Math.Pow(sideA, 2);
  72. isolation[rows, 1] = Math.Round(isolation[rows, 1], 8);
  73. }
  74. double number = isolation[0,0], functionA = 0, functionDerivA = 0, x = 0;
  75. double[] tangentMethod = new double[1];
  76. int counter = 0;
  77. for (int rows = 0; rows < elementsTwo; rows++) // Вывод подозрительного на отрезок изоляции
  78. {
  79. for (int cols = 0; cols < 2; cols++)
  80. {
  81. Console.Write($"{isolation[rows, cols]}\t");
  82. }
  83. Console.WriteLine();
  84. }
  85. while (true) // Метод касательных
  86. {
  87. functionA = Math.Round((3/number) - Math.Cos(number), 15);
  88. functionDerivA = Math.Round(Math.Sin(sideA) - 3 / Math.Pow(sideA, 2), 8);
  89. x = Math.Round(number - (functionA / functionDerivA), 8);
  90. Console.WriteLine($"a = {number}\tf(a) = {functionA}\tf'(a) = {functionDerivA}\tx = {x}");
  91. number = x;
  92. tangentMethod[counter] = x;
  93. counter++;
  94. Array.Resize(ref tangentMethod, tangentMethod.Length + 1);
  95. if (counter >= 3 && tangentMethod[counter-1] == tangentMethod[counter-2])
  96. {
  97. Console.WriteLine($"{Math.Round(tangentMethod[counter-1], newK)} - корень");
  98. break;
  99. }
  100. }
  101. }
  102. }
  103. }
  104. }
  105. }
  106. }