123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- using System;
- namespace ProjMet
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("Введите начало отрезка a: ");
- double a = 5;
- Console.WriteLine("Введите конец отрезка b: ");
- double b = 8;
- Console.WriteLine("Введите шаг разбиения h:");
- double h = 0.1;
- Console.WriteLine("Введите точность k:");
- string k = "0.00000001";
- int newK = k.Length - 2;
- int elements = (int)(((b - a) / h) + 1); // кол-во элементов
- double[,] function1 = new double[elements, 2]; // двумерный массив, в котором будут храниться x и f(x)
- function1[0, 0] = a; // первое x
- function1[0, 1] = 3/a-Math.Cos(a); // первая f(x)
- function1[0, 1] = Math.Round(function1[0, 1], 8); // Округление
- for (int i = 1; i < elements; i++) // поиск всех f(x)
- {
-
- function1[i, 0] = a + h;
- function1[i, 0] = Math.Round(function1[i, 0], 2);
- a += h;
- function1[i, 1] = 3 / a - Math.Cos(a);
- function1[i, 1] = Math.Round(function1[i, 1], 8);
-
- }
- for (int i = 0; i < elements; i++) // Убрать знак "-" у нулевых значений X, если они имеются
- {
- for (int j = 0; j < 1; j++)
- {
- if (function1[i, 0] == 0) function1[i, 0] = Math.Abs(function1[i, 0]);
- }
- }
- for (int i = 0; i < elements; i++) // Вывод массива
- {
- for (int j = 0; j < 2; j++)
- {
- if (function1[i, 1] == 0) // Если f(x) равна 0
- {
- Console.Write($"{function1[i, 0]}\t");
- Console.Write($"{function1[i, 1]}\t");
- Console.WriteLine(" - x = 0. Корень уравнения\t");
- i++;
- }
- Console.Write($"{function1[i, j]}\t");
-
- }
- Console.WriteLine();
- }
-
- Console.WriteLine();
- for (int i = 0; i < elements; i++) // Поиск подозрительных на отрезок изоляции
- {
- for (int j = 0; j < 1; j++)
- {
- if ((i < elements - 1) && ((function1[i, 1] < 0 && function1[i + 1, 1] > 0) || (function1[i, 1] > 0 && function1[i + 1, 1] < 0)))
- {
- double sideA = function1[i, 0], sideB = function1[i + 1, 0];
- Console.WriteLine($"Подозрительный на отрезок изоляции [{sideA};{sideB}]");
- int elementsTwo = (int)Math.Round(((sideB - sideA) / (h / 10)))+1;
- double[,] isolation = new double[elementsTwo, 2];
- isolation[0, 0] = sideA;
- isolation[0, 1] = Math.Sin(sideA)-3/Math.Pow(sideA,2);
- isolation[0, 1] = Math.Round(isolation[0, 1], 8);
- for (int rows = 1; rows < elementsTwo; rows++) // проверка подозрительного на отрезок изоляции
- {
- isolation[rows, 0] = sideA + h/10;
- isolation[rows, 0] = Math.Round(isolation[rows, 0], 2);
- sideA += h/10;
- isolation[rows, 1] = Math.Sin(sideA) - 3 / Math.Pow(sideA, 2);
- isolation[rows, 1] = Math.Round(isolation[rows, 1], 8);
- }
- double number = isolation[0,0], functionA = 0, functionDerivA = 0, x = 0;
- double[] tangentMethod = new double[1];
- int counter = 0;
- for (int rows = 0; rows < elementsTwo; rows++) // Вывод подозрительного на отрезок изоляции
- {
- for (int cols = 0; cols < 2; cols++)
- {
- Console.Write($"{isolation[rows, cols]}\t");
- }
- Console.WriteLine();
- }
- while (true) // Метод касательных
- {
- functionA = Math.Round((3/number) - Math.Cos(number), 15);
- functionDerivA = Math.Round(Math.Sin(sideA) - 3 / Math.Pow(sideA, 2), 8);
- x = Math.Round(number - (functionA / functionDerivA), 8);
- Console.WriteLine($"a = {number}\tf(a) = {functionA}\tf'(a) = {functionDerivA}\tx = {x}");
- number = x;
- tangentMethod[counter] = x;
- counter++;
- Array.Resize(ref tangentMethod, tangentMethod.Length + 1);
- if (counter >= 3 && tangentMethod[counter-1] == tangentMethod[counter-2])
- {
- Console.WriteLine($"{Math.Round(tangentMethod[counter-1], newK)} - корень");
- break;
- }
- }
-
- }
- }
- }
- }
- }
- }
|