Advertisement
Xsufu

Нелинейные уравнения

Oct 16th, 2020 (edited)
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.48 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3.  
  4. namespace Nonlinear_Interval {
  5.     class Program {
  6.  
  7.         static float a_func(float x) {
  8.             return (float)Math.Pow(x, 3) + 3 * x + 1;
  9.         }
  10.  
  11.         static float test_function(float x) {
  12.             return (float)Math.Tan(0.4 * x + 0.4) - (float)Math.Pow(x,2);
  13.         }
  14.  
  15.         static float b_func(float x) {
  16.             return x + (float)Math.Log(x, 10) - 0.5F;
  17.            
  18.         }
  19.        
  20.         //Метод Половинного Деления
  21.         static void HalfDivision(int a, int b) {
  22.             //массив для ответов
  23.             string[] lines = new string[20];
  24.             //счётчик корней
  25.             int count = 1;
  26.             //шаг
  27.             float h = 0.003F;
  28.             //сохранение предыщего значения x
  29.             float prevF = 0;
  30.             //индекс массива result
  31.             int i = 0;
  32.             //точность
  33.             double eps = 0.0001;
  34.             //переменные для f(a), f(b), f(x)
  35.             float fa = 0, fb = 0, fx = 0;
  36.             //вычисление длины массива
  37.             int len = (int)((Math.Abs(a) + (float)b) / h);
  38.  
  39.             //массив хранения f(x) в локализации
  40.             float[] result = new float[len+1];
  41.  
  42.             //локализуем и сразу считаем
  43.             for(float f = a; f<=b; f += h, i++) {
  44.                 //вычисляем знаечение f(x)
  45.                 result[i] = test_function(f);
  46.  
  47.                 //если дошли до второго f(x)
  48.                 if (i > 0) {
  49.                     //если знак поменялся или одно из f(x) равно нулю
  50.                     if (result[i] * result[i-1] < 0 || result[i] == 0 || result[i-1] == 0) {
  51.                         //перезаписываем предыдущее заначение x
  52.                         float A = prevF;
  53.                         //перезаписываем текущее заначение x
  54.                         float B = f;
  55.                         //вычисляем x для уточнения корней
  56.                         float x = (A + B) / 2;
  57.  
  58.                         //вычисляем расстояние между точками
  59.                         float check = Math.Abs(A - B);
  60.                        
  61.                         //счиатем пока расстояние между точками
  62.                         //больше заданной точности
  63.                         while (check > eps) {
  64.                             //вычисляем f(a)
  65.                             fa = test_function(A);
  66.                             //вычисляем f(b)
  67.                             fb = test_function(B);
  68.                             //вычисляем f(x)
  69.                             fx = test_function(x);
  70.                             //если знак f(x) изменился
  71.                             //то сдвиагем границу
  72.                             A = fx * fa > 0 ? x : B = x;
  73.                             //вычисляем новое значение x
  74.                             x = (A + B) / 2;
  75.                             //вычисляем расстояние между точками
  76.                             check = Math.Abs(A - B);
  77.                         }
  78.  
  79.                         Console.WriteLine($"x{count}: " + x);
  80.                         lines[count - 1] = Convert.ToString(x);
  81.                         count++;
  82.                            
  83.                     }
  84.                 }
  85.                 prevF = f;
  86.             }
  87.             //путь для ответа
  88.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  89.             //запись ответа в файл
  90.             File.WriteAllLines($"{AnswerPath}", lines);
  91.             Console.WriteLine("Результат работы программы записан в файл");
  92.         }
  93.  
  94.         //Метод Хорд
  95.         static void Chord(int a, int b) {
  96.             //массив для ответов
  97.             string[] lines = new string[20];
  98.             //счётчик корней
  99.             int count = 1;
  100.             //шаг
  101.             float h = 0.003F;
  102.             //сохранение предыщего значения x
  103.             float prevF = 0;
  104.             //индекс массива result
  105.             int i = 0;
  106.             //точность
  107.             double eps = 0.00001;
  108.             //переменные для f(a), f(b), f(x)
  109.             float fa = 0, fb = 0, fx = 0;
  110.             //вычисление длины массива
  111.             int len = (int)((Math.Abs(a) + (float)b) / h);
  112.  
  113.             //массив хранения f(x) в локализации
  114.             float[] result = new float[len + 1];
  115.  
  116.             //локализуем и сразу считаем
  117.             for (float f = a; f <= b; f += h, i++) {
  118.                 //вычисляем знаечение f(x)
  119.                 result[i] = test_function(f);
  120.  
  121.                 //если дошли до второго f(x)
  122.                 if (i > 0) {
  123.                     //если знак поменялся или одно из f(x) равно нулю
  124.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  125.                         //перезаписываем предыдущее заначение x
  126.                         float A = prevF;
  127.                         //перезаписываем текущее заначение x
  128.                         float B = f;
  129.                         //вычисляем f(a)
  130.                         fa = test_function(A);
  131.                         //вычисляем f(b)
  132.                         fb = test_function(B);
  133.                         //вычисляем x для уточнения корней
  134.                         float x = (float)(A - (B - A) / (fb - fa)*fa);
  135.  
  136.                         //вычисляем расстояние между точками
  137.                         float check = Math.Abs(A - B);
  138.  
  139.                         //счиатем пока расстояние между точками
  140.                         //больше заданной точности
  141.                         while (check > eps) {
  142.                             //вычисляем f(a)
  143.                             fa = test_function(A);
  144.                             //вычисляем f(b)
  145.                             fb = test_function(B);
  146.                             //вычисляем f(x)
  147.                             fx = test_function(x);
  148.                             //если знак f(x) изменился
  149.                             //то сдвиагем границу
  150.                             A = fx * fa > 0 ? x : B = x;
  151.                             //вычисляем новое значение x
  152.                             x = (float)(A - (B - A) / (fb - fa) * fa);
  153.                             //вычисляем расстояние между точками
  154.                             check = Math.Abs(A - B);
  155.                         }
  156.  
  157.                         Console.WriteLine($"x{count}: " + x);
  158.                         lines[count - 1] = Convert.ToString(x);
  159.                         count++;
  160.                     }
  161.                 }
  162.                 prevF = f;
  163.             }
  164.             //путь для ответа
  165.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  166.             //запись ответа в файл
  167.             File.WriteAllLines($"{AnswerPath}", lines);
  168.             Console.WriteLine("Результат работы программы записан в файл");
  169.         }
  170.  
  171.         //Метод Золотого Сечения
  172.         static void GoldenRatio(int a, int b) {
  173.             //массив для ответов
  174.             string[] lines = new string[20];
  175.             //Константа Фидия
  176.             float Ф = 1.618F;
  177.             //счётчик корней
  178.             int count = 1;
  179.             //шаг, вычисленный при помощи
  180.             //специальных методов
  181.             float h = 0.003F;
  182.             //сохранение предыщего значения x
  183.             float prevF = 0;
  184.             //индекс массива result
  185.             int i = 0;
  186.             //точность
  187.             double eps = 0.00001;
  188.             //переменные для f(a), f(b), f(x)
  189.             float fa = 0, fb = 0, fx1 = 0, fx2 = 0;
  190.             //вычисление длины массива
  191.             int len = (int)((Math.Abs(a) + (float)b) / h);
  192.  
  193.             //массив хранения f(x) в локализации
  194.             float[] result = new float[len + 1];
  195.  
  196.             //локализуем и сразу считаем
  197.             for (float f = a; f <= b; f += h, i++) {
  198.                 //вычисляем знаечение f(x)
  199.                 result[i] = test_function(f);
  200.  
  201.                 //если дошли до второго f(x)
  202.                 if (i > 0) {
  203.                     //если знак поменялся или одно из f(x) равно нулю
  204.                     if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
  205.                         //перезаписываем предыдущее заначение x
  206.                         float A = prevF;
  207.                         //перезаписываем текущее заначение x
  208.                         float B = f;
  209.                         //вычисляем f(a)
  210.                         fa = test_function(A);
  211.                         //вычисляем f(b)
  212.                         fb = test_function(B);
  213.                         //вычисляем x для уточнения корней
  214.                         float x1 = B - (B - A) / Ф;
  215.                         float x2 = A + (B - A) / Ф;
  216.  
  217.                         //вычисляем расстояние между точками
  218.                         float check = Math.Abs(A - B);
  219.  
  220.                         //счиатем пока расстояние между точками
  221.                         //больше заданной точности
  222.                         while (check > eps) {
  223.                             //вычисляем f(a)
  224.                             fa = test_function(A);
  225.                             //вычисляем f(b)
  226.                             fb = test_function(B);
  227.                             //вычисляем f(x1)
  228.                             fx1 = test_function(x1);
  229.                             //вычисляем f(x2)
  230.                             fx2 = test_function(x2);
  231.                             //если знак f(x) изменился
  232.                             //то сдвиагем границу
  233.                             if (x1 > x2)
  234.                                 A = fx1 * fa > 0 ? x1 : B = x1;
  235.                             else
  236.                                 A = fx2 * fa > 0 ? x2 : B = x2;
  237.                             //вычисляем новые значения x
  238.                             x1 = B - (B - A) / Ф;
  239.                             x2 = A + (B - A) / Ф;
  240.                             //вычисляем расстояние между точками
  241.                             check = Math.Abs(A - B);
  242.                         }
  243.  
  244.                         float x = (x1 + x2) / 2;
  245.  
  246.                         Console.WriteLine($"x{count}: " + x);
  247.                         lines[count - 1] = Convert.ToString(x);
  248.                         count++;
  249.                     }
  250.                 }
  251.                 prevF = f;
  252.             }
  253.             //путь для ответа
  254.             string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
  255.             //запись ответа в файл
  256.             File.WriteAllLines($"{AnswerPath}", lines);
  257.             Console.WriteLine("Результат работы программы записан в файл");
  258.         }
  259.  
  260.         static void Main(string[] args) {
  261.             int a = -10, b = -a;
  262.             HalfDivision(a,b);
  263.             Console.WriteLine();
  264.             Chord(a, b);
  265.             Console.WriteLine();
  266.             GoldenRatio(a, b);
  267.         }
  268.     }
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement