Advertisement
mlmisha

NM0

May 13th, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.49 KB | None | 0 0
  1. using System;
  2.  
  3. namespace ЧМ1
  4. {
  5.     class MainClass
  6.     {
  7.         public delegate double ff(double e, double t);
  8.         public delegate double fff(double e);
  9.         public static double F(double e)
  10.         {
  11.             double Fx = Math.Pow(e, 5) + 6 * Math.Pow(e, 4) - 58 * Math.Pow(e, 3) - 156 * e * e + 1017 * e - 809.5;
  12.             return Fx;
  13.         }
  14.         public static double f(double e, double t)
  15.         {
  16.             double fx = e + t * 0.00008 * (Math.Pow(e, 5) + 6 * Math.Pow(e, 4) - 58 * Math.Pow(e, 3) - 156 * e * e + 1017 * e - 809.5);
  17.             return fx;
  18.         }
  19.         public static double f0(double e, double t)
  20.         {
  21.             double fe = 1 + t * 0.00008 * (5 * Math.Pow(e, 4) + 24 * Math.Pow(e, 3) - 174 * Math.Pow(e, 2) - 312 * e + 1017);
  22.             return fe;
  23.         }
  24.         public static double diff(double e)
  25.         {
  26.             double diffx = 5 * Math.Pow(e, 4) + 24 * Math.Pow(e, 3) - 174 * Math.Pow(e, 2) - 312 * e + 1017;
  27.             return diffx;
  28.         }
  29.         public static double fdiff(double e, double t)
  30.         {
  31.             double fe = e + t * 0.0008 * (5 * Math.Pow(e, 4) + 24 * Math.Pow(e, 3) - 174 * Math.Pow(e, 2) - 312 * e + 1017);
  32.             return fe;
  33.         }
  34.         public static double f1(double e, double t)
  35.         {
  36.             double fe = 1 + t * 0.0008 * (20 * Math.Pow(e, 3) + 72 * Math.Pow(e, 2) - 348 * e - 312);
  37.             return fe;
  38.         }
  39.         public static double diff2(double e)
  40.         {
  41.             double dif = 20 * Math.Pow(e, 3) + 72 * Math.Pow(e, 2) - 348 * e - 312;
  42.             return dif;
  43.         }
  44.         public static double fdiff2(double e, double t)
  45.         {
  46.             double fdif = e + t * 0.00006 * (20 * Math.Pow(e, 3) + 72 * Math.Pow(e, 2) - 348 * e - 312);
  47.             return fdif;
  48.         }
  49.         public static double f2(double e, double t)
  50.         {
  51.             double fe = 1 + t * 0.00006 * (60 * e * e + 144 * e - 348);
  52.             return fe;
  53.         }
  54.         public static double diff3(double e)
  55.         {
  56.             double dif = 60 * e * e + 144 * e - 348;
  57.             return dif;
  58.         }
  59.         public static double iteration(double a, double eps, ff f, int k)
  60.         {
  61.             double x = 0;
  62.             double d = 0;
  63.             do
  64.             {
  65.                 x = f(a, k);
  66.                 d = Math.Abs(a - x);
  67.                 a = x;
  68.             }
  69.             while (d > eps);
  70.             return a;
  71.         }
  72.         public static double Newton(double e, double eps, fff f, fff f1)
  73.         {
  74.             double x = 0;
  75.             double d = 0;
  76.             do
  77.             {
  78.                 x = e - f(e) / f1(e);
  79.                 d = Math.Abs(x - e);
  80.                 e = x;
  81.             }
  82.             while (d >= eps);
  83.             return e;
  84.         }
  85.         public static void Main(string[] args)
  86.         {
  87.             double t = 0.00001;
  88.             Console.WriteLine("Дано: ");
  89.             Console.WriteLine("Функция: f(x) = x^5 +6x^4-58x^3-156x^2+1017x-809.5");
  90.             double[] isol = new double[10];
  91.             double x1 = (-72 + Math.Sqrt(72 * 72 + 60 * 348)) / 60;
  92.             double x2 = (-72 - Math.Sqrt(72 * 72 + 60 * 348)) / 60;
  93.             //Ищем интервалы изоляции для 5 корней исходной функции, последовательно находя корни всех производных 1-3 порядков
  94.             double fu1 = diff2(x2);
  95.             double fu2 = diff2(x1);
  96.             int pot = 0;
  97.             int r = 0;
  98.             double[] root = new double[2 + pot];
  99.             double[] ris = new double[root.Length * 2 + 2];
  100.             root[0] = x2;
  101.             root[1] = x1;
  102.             double v = 0;
  103.             double c = 0;
  104.             int g = 0;
  105.             do
  106.             {
  107.                 if (r < root.Length)
  108.                 {
  109.                     v = Math.Floor(root[r]);
  110.                     c = v;
  111.                     do
  112.                     {
  113.                         c--;
  114.                     }
  115.                     while (diff2(v) * diff2(c) > 0 || diff3(c) * diff3(v) < 0);
  116.                     ris[g] = c;
  117.                     g++;
  118.                     ris[g] = v;
  119.                     g++;
  120.                 }
  121.                 if (r == root.Length)
  122.                 {
  123.                     v = Math.Floor(root[r - 1]) + 1;
  124.                     c = v;
  125.                     do
  126.                     {
  127.                         c++;
  128.                     }
  129.                     while (diff2(v) * diff2(c) > 0 || diff3(c) * diff3(v) < 0);
  130.                     ris[g] = v;
  131.                     g++;
  132.                     ris[g] = c;
  133.                 }
  134.                 r++;
  135.             }
  136.             while (r < 3);
  137.             bool prov = false;
  138.             pot++;
  139.             root = new double[2 + pot];
  140.             Console.WriteLine("Проверка сходимости метода итераций");
  141.             for (int k = 0; k < r; k++)
  142.             {
  143.                 int u = 1;
  144.                 double Xo = ris[k + k] + 0.01;
  145.                 if (diff3(Xo) < 0)
  146.                 {
  147.                     u = 1;
  148.                 }
  149.                 else
  150.                 {
  151.                     u = -1;
  152.                 }
  153.                 for (double i = ris[k + k]; i < ris[k + k + 1]; i += 0.001)
  154.                 {
  155.                     if (Math.Abs(f2(i, u)) > 1)
  156.                     {
  157.                         prov = true;
  158.                     }
  159.                 }
  160.                 if (prov)
  161.                 {
  162.                     Console.WriteLine("Итерационный процесс невозможен");
  163.                 }
  164.                 else
  165.                 {
  166.                     double xx = iteration(Xo, t, fdiff2, u);
  167.                     root[k] = Math.Round(xx, 3);
  168.                 }
  169.             }
  170.             ris = new double[root.Length * 2 + 2];
  171.             r = 0;
  172.             g = 0;
  173.             //Вычисляем интервалы изоляции для первой производной
  174.             do
  175.             {
  176.                 if (r < root.Length)
  177.                 {
  178.  
  179.                     v = Math.Floor(root[r]);
  180.                     c = v;
  181.                     do
  182.                     {
  183.                         c--;
  184.                     }
  185.                     while (diff(v) * diff(c) > 0 || diff2(c) * diff2(v) < 0);
  186.                     ris[g] = c;
  187.                     g++;
  188.                     ris[g] = v;
  189.                     g++;
  190.                 }
  191.                 if (r == root.Length)
  192.                 {
  193.                     v = Math.Floor(root[r - 1]) + 1;
  194.                     c = v;
  195.                     do
  196.                     {
  197.                         c++;
  198.                     }
  199.                     while (diff(v) * diff(c) > 0 || diff2(c) * diff2(v) < 0);
  200.                     ris[g] = v;
  201.                     g++;
  202.                     ris[g] = c;
  203.                 }
  204.                 r++;
  205.             }
  206.             while (r < 4);
  207.             prov = false;
  208.             pot++;
  209.             root = new double[2 + pot];
  210.             for (int k = 0; k < r; k++)
  211.             {
  212.                 double Xo = ris[k + k] + 0.01;
  213.                 if (diff(Xo) * diff3(Xo) > 0)
  214.                 {
  215.                 }
  216.                 else
  217.                 {
  218.                     while (diff(Xo) * diff3(Xo) <= 0 && Xo < ris[k + k + 1])
  219.                     {
  220.                         Xo += 0.01;
  221.                     }
  222.                 }
  223.                 root[k] = Math.Round(Newton(Xo, t, diff, diff2), 3);
  224.             }
  225.             ris = new double[root.Length * 2 + 2];
  226.             r = 0;
  227.             g = 0;
  228.             do
  229.             {
  230.                 if (r < root.Length)
  231.                 {
  232.  
  233.                     v = Math.Floor(root[r]);
  234.                     c = v;
  235.                     do
  236.                     {
  237.                         c--;
  238.                     }
  239.                     while (F(v) * F(c) > 0 || diff(c) * diff(v) < 0);
  240.                     ris[g] = c;
  241.                     g++;
  242.                     ris[g] = v;
  243.                     g++;
  244.                 }
  245.                 if (r == root.Length)
  246.                 {
  247.                     v = Math.Floor(root[r - 1]) + 0.9;
  248.                     c = v;
  249.                     while (F(v) * F(c) > 0 || diff(c) * diff(v) < 0)
  250.                     {
  251.                         c++;
  252.                     }
  253.                     ris[g] = v;
  254.                     g++;
  255.                     ris[g] = c;
  256.                 }
  257.                 r++;
  258.             }
  259.             while (r < 5);
  260.             Console.WriteLine("Интервалы изоляции исходной функции");
  261.             for (int i = 0; i < r; i++)
  262.             {
  263.                 Console.WriteLine("{0}. [{1};{2}]", i + 1, ris[i + i], ris[i + i + 1]);
  264.             }
  265.             prov = false;
  266.             pot++;
  267.             root = new double[2 + pot];
  268.             Console.WriteLine("Проверка сходимости метода итераций");
  269.             for (int k = 0; k < r; k++)
  270.             {
  271.                 int u = 1;
  272.                 double Xo = ris[k + k] + 0.01;
  273.                 if (diff(Xo) < 0)
  274.                 {
  275.                     u = 1;
  276.                 }
  277.                 else
  278.                 {
  279.                     u = -1;
  280.                 }
  281.                 for (double i = ris[k + k]; i < ris[k + k + 1]; i += 0.001)
  282.                 {
  283.                     if (Math.Abs(f0(i, u)) > 1)
  284.                     {
  285.                         prov = true;
  286.                     }
  287.                 }
  288.                 if (prov)
  289.                 {
  290.                     Console.WriteLine("Итерационный процесс невозможен");
  291.                 }
  292.                 else
  293.                 {
  294.                     double xx = iteration(Xo, t, f, u);
  295.                     root[k] = Math.Round(xx, 3);
  296.                 }
  297.             }
  298.             Console.WriteLine("Корни уравнения согласно методу итераций: ");
  299.             for (int i = 0; i < r; i++)
  300.             {
  301.                 Console.WriteLine("{0}. X = {1:f3}", i + 1, root[i]);
  302.             }
  303.             for (int k = 0; k<r; k++)
  304.             {
  305.                 double Xo = ris[k + k];
  306.                 if (F(Xo) * diff2(Xo) > 0)
  307.                 {
  308.                 }
  309.                 else
  310.                 {
  311.                     Console.WriteLine(k);
  312.                     while (F(Xo) * diff2(Xo) <= 0 && Xo<ris[k + k + 1])
  313.                     {
  314.                         Xo += 0.01;
  315.                     }
  316.                     Xo -= 0.01;
  317.                 }
  318.                 root[k] = Math.Round(Newton(Xo, t, F, diff), 3);
  319.             }
  320.             Console.WriteLine("Корни уравнения согласно методу Ньютона: ");
  321.             for (int i = 0; i < r; i++)
  322.             {
  323.                 Console.WriteLine("{0}. X = {1:f3}", i + 1, root[i]);
  324.             }
  325.         }
  326.     }
  327. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement