SHARE
TWEET

Untitled

a guest Dec 16th, 2018 67 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace mo
  9. {
  10.     //class Program
  11.     //{
  12.         public class form1{
  13.             public int countf = 0;
  14.         static public double getSignificationDigit(int digs, double d)
  15.         {
  16.             double r;
  17.             //Порядок числа
  18.             int magnitudeOfNumber = (int)Math.Floor(Math.Log10(d));
  19.             //Общее количество десятичных разрядов
  20.             int numberOfDigits = (int)Math.Ceiling(Math.Log10(d));
  21.             if (d / 1000 >= 1)
  22.             {
  23.                 r = Math.Truncate(d);
  24.             } else
  25.             if (numberOfDigits == digs)
  26.             {
  27.                 //Если количество разрядов равно количеству значащих цифр
  28.                 r = d;
  29.             }
  30.             else
  31.             {
  32.                 //Если нет
  33.                 double dp = Math.Pow(10, magnitudeOfNumber);
  34.                 double dd = Math.Pow(10, digs - 1);
  35.                 r = d / dp;
  36.                 r = (Math.Round(r * dd) / dd) * dp;
  37.             }
  38.             return r;
  39.         }
  40.         public double Value(float x)/*Ищет значение функции в точке*/
  41.         {   countf++;
  42.             return 17 * x + x * x + 17 * Math.Pow(x, 3) + 6 * Math.Pow(x, 4) +
  43.             18 * Math.Pow(x, 5) + 15 * Math.Pow(x, 6) + 32 * Math.Pow(x, 7) +
  44.             12 * Math.Pow(x, 8) + Math.Exp(-19 * x) + Math.Exp(-x) + Math.Exp(-26 * x) +
  45.             Math.Exp(-x);
  46.         }
  47.         double Fproisvod(float x)/*Ищет значение первой производной в точке*/
  48.         {
  49.             countf++;
  50.             return 17 + 2 * x + 51 * Math.Pow(x, 2) + 24 * Math.Pow(x, 3) +
  51.             90 * Math.Pow(x, 4) + 90 * Math.Pow(x, 5) + 224 * Math.Pow(x, 6) +
  52.             96 * Math.Pow(x, 7) - 19 * Math.Exp(-19 * x) - Math.Exp(-x) - 26 * Math.Exp(-26 * x) -
  53.             Math.Exp(-x);
  54.         }
  55.         double Sproisvod(float x)/*Ищет значение второй производной в точке*/
  56.         {
  57.             countf++;
  58.             return 2 + 102 * x + 72 * Math.Pow(x, 2) +
  59.             360 * Math.Pow(x, 3) + 450 * Math.Pow(x, 4) + 1344 * Math.Pow(x, 5) + 672 * Math.Pow(x, 6) + 361 * Math.Exp(-19 * x) + Math.Exp(-x) + 676 * Math.Exp(-26 * x) + Math.Exp(-x);
  60.         }
  61.         public void Dichotomy(double a2, double b2, double e2, double f2)
  62.         {
  63.             int count = 1; float a = (float)a2; float b = (float)b2; float e = (float)e2; float f = (float)f2;/*в float*/
  64.             using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
  65.             {
  66.                 writer.WriteLine("Дихотомия");
  67.                 writer.WriteLine(a + " " + b + " || " + Value1(a) + " " + Value1(b));
  68.                 float c, d; while (b - a >= 2 * e)
  69.                 {
  70.                     c = ((b + a) / 2) - (f / 2);
  71.                     d = ((b + a) / 2) + (f / 2); writer.WriteLine(count + "  c:=   " + c + "  d:=  " + d + " || " + Value1(c) + "  " + Value1(d));
  72.                     if (Value(c) <= Value(d)) { b = d; } else { a = c; }
  73.                     writer.WriteLine(count + "  a:= " + a + " b:= " + b + " || " + Value1(a) + " " + Value1(b));
  74.                     count++;
  75.                 }
  76.                 writer.WriteLine(count + "     " + getSignificationDigit(4, (b + a) / 2) + " || " + getSignificationDigit(4, Value1((b + a) / 2)));
  77.                 writer.WriteLine("Количество посчётов " + countf);
  78.             }
  79.         }
  80.         public void GoldenSection(double a2, double b2, double e2)
  81.         {
  82.             using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
  83.             {
  84.                 writer.WriteLine("Золотое сечение:"); int count = 1;
  85.                 float a = (float)a2; float b = (float)b2; float e = (float)e2;
  86.                 writer.WriteLine(a + " " + b + " || " + Value1(a) + " " + getSignificationDigit(4, Value1(b)));
  87.                 float c, d; double fprevc, fprevd;/*preva -значение a во время предыдущей итерации*/;
  88.                 c = ((3 - (float)Math.Sqrt(5)) / 2) * (b - a) + a;
  89.                 d = (((float)Math.Sqrt(5) - 1) / 2) * (b - a) + a; fprevc = Value(c); fprevd = Value(d);
  90.                 writer.WriteLine(count + "  c:=   " + c + "  d:=  " + d + " || " + fprevc + "  " + fprevd);
  91.                 while (b - a >= 2 * e)
  92.                 {
  93.                     /*if (Value(c) < Value(d)) b = d; else { a = c; }*/
  94.                     count++;
  95.                     if (fprevc < fprevd) { b = d; d = c; c = ((3 - (float)Math.Sqrt(5)) / 2) * (b - a) + a; fprevc = Value(c);}
  96.                     else
  97.                     { a = c; c = d; d = (((float)Math.Sqrt(5) - 1) / 2) * (b - a) + a; fprevd = Value(d); }
  98.                     writer.WriteLine(count + "  c:=   " + c + "  d:=  " + d + " || " + Value1(c) + "  " + Value1(d));
  99.                     writer.WriteLine(count + " a:=  " + a + " b:=  " + b + " || " + Value1(a) + " " + Value1(b));
  100.                 }
  101.                 writer.WriteLine(count + "     " + getSignificationDigit(4, (b + a) / 2) + " || " + getSignificationDigit(4, Value1((b + a) / 2)));
  102.                 writer.WriteLine("Количество посчётов" + countf);
  103.             }
  104.         }
  105.         public void Fibonacci(double a2, double b2, double e2)
  106.         {
  107.             using (StreamWriter writer =
  108.  
  109.             File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
  110.             {
  111.                 writer.WriteLine("Фибоначчи:"); int count = 1;
  112.                 List<float> Fib = new List<float>() { 1, 1 }; double fprevc = 0, fprevd = 0;
  113.                 float a = (float)a2; float b = (float)b2; float e = (float)e2;
  114.                 float c = a - 1, d = b - 1;
  115.                 int n = 1, i = 1; do { n++; Fib.Add(Fib[n - 1] + Fib[n - 2]); }
  116.                 while (Fib[n] < ((b - a) / e)); n -= 1;
  117.                 while (n + 1 != i)
  118.                 {
  119.                     if (b == d)
  120.                     {
  121.                         d = c; fprevd = fprevc;
  122.                         c = a + (b - a) * (Fib[n - i] / Fib[n + 2 - i]);
  123.                         fprevc = Value(c);
  124.                     }
  125.                     else if (a == c)
  126.                     {
  127.                         c = d; fprevc = fprevd;
  128.                         d = a + (b - a) * (Fib[n + 1 - i] / Fib[n + 2 - i]); fprevd = Value(d);
  129.                     }
  130.                     else
  131.                     {
  132.                         d = a + (b - a) * (Fib[n + 1 - i] / Fib[n + 2 - i]);
  133.                         c = a + (b - a) * (Fib[n - i] / Fib[n + 2 - i]); fprevc = Value(c); fprevd = Value(d);
  134.                     }
  135.                     writer.WriteLine(count + "  c:=   " + c + "  d:=  " + d + " || " + Value1(c) + "  " + Value1(d));
  136.                     if (n != i)/*иначе будет лишняя итерация*/
  137.                     { if (fprevc <= fprevd) b = d; else a = c; }
  138.                     writer.WriteLine(count + "  a:=   " + a + "  b:= " + b + " || " + Value1(a) + " " + Value1(b));
  139.                     i++; count++;
  140.                 }
  141.                 count--;
  142.                 writer.WriteLine(count + "     " + getSignificationDigit(4, (b + a) / 2) + " || " + getSignificationDigit(4, Value1((b + a) / 2)));
  143.                 writer.WriteLine("Количество посчётов " + countf);
  144.             }
  145.         }
  146.        public void Nutona(double a2, double b2, double e2)
  147.         {
  148.             using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
  149.             {
  150.                 writer.WriteLine("Метод Ньютона"); int count = 1;
  151.                 float a = (float)a2; float b = (float)b2; float e = (float)e2; float x0 = (b - a) / 2;
  152.                 writer.WriteLine(x0 + " || " + Value1(x0)); double fval;
  153.                 do
  154.                 { fval = Fproisvod(x0); x0 = x0 - (float)(fval / Sproisvod(x0)); writer.WriteLine(count + "     " + x0 + " || " + Value1(x0));count++; }
  155.                 while (Math.Abs(fval) > e || x0 < a);count--;
  156.                 writer.WriteLine(count + "     " + getSignificationDigit(4, x0) + " || " + getSignificationDigit(4, Value1(x0)));
  157.                 writer.WriteLine("Количество посчётов " + countf);
  158.             }
  159.         }
  160.         public void Passive(double a2, double b2, double e2)
  161.         {
  162.             using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
  163.             {
  164.                 writer.WriteLine("Пассивный поиск"); double fmin;
  165.                 float a = (float)a2; float b = (float)b2; float e = (float)e2; float min = a, x = a; int i = 1; long k; int count = 1;
  166.                 long l = Convert.ToInt64((b - a) / e); k = l + 1/*выделение целой части*/; fmin = Value(a);
  167.                 while (x != b) { x = a + (b - a) * i / k; if (Value(x) < Value(min)) { fmin = Value(min); min = x;} i++;
  168.                     writer.WriteLine(count + "     " + x + " || " + Value1(x)); count++; }
  169.                 writer.WriteLine(count + "     " + getSignificationDigit(4, min) + " || " + getSignificationDigit(4, Value1(min)));
  170.                 writer.WriteLine("Количество посчётов " + countf);
  171.             }
  172.         }
  173.         public double Value1(float x)/*Ищет значение функции в точке*/
  174.         {
  175.             return 17 * x + x * x + 17 * Math.Pow(x, 3) + 6 * Math.Pow(x, 4) +
  176.             18 * Math.Pow(x, 5) + 15 * Math.Pow(x, 6) + 32 * Math.Pow(x, 7) +
  177.             12 * Math.Pow(x, 8) + Math.Exp(-19 * x) + Math.Exp(-x) + Math.Exp(-26 * x) +
  178.             Math.Exp(-x);
  179.         }
  180.     }
  181.     class Program {
  182.     static void Main(string[] args)
  183.         {
  184.             double a, b, e; form1 cl = new form1();
  185.             a = Convert.ToDouble(Console.ReadLine()); b = Convert.ToDouble(Console.ReadLine());
  186.             e = Convert.ToDouble(Console.ReadLine());
  187.             cl.Dichotomy(a, b, e, e / 2);cl.countf = 0;  cl.GoldenSection(a, b, e); cl.countf = 0;
  188.             cl.Fibonacci(a, b, e); cl.countf = 0; cl.Nutona(a, b, e); cl.countf = 0;
  189.             cl.Passive(a, b, e);
  190.         }
  191.     }
  192. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top