Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace mo
- {
- //class Program
- //{
- public class form1{
- public int countf = 0;
- static public double getSignificationDigit(int digs, double d)
- {
- double r;
- //Порядок числа
- int magnitudeOfNumber = (int)Math.Floor(Math.Log10(d));
- //Общее количество десятичных разрядов
- int numberOfDigits = (int)Math.Ceiling(Math.Log10(d));
- if (d / 1000 >= 1)
- {
- r = Math.Truncate(d);
- } else
- if (numberOfDigits == digs)
- {
- //Если количество разрядов равно количеству значащих цифр
- r = d;
- }
- else
- {
- //Если нет
- double dp = Math.Pow(10, magnitudeOfNumber);
- double dd = Math.Pow(10, digs - 1);
- r = d / dp;
- r = (Math.Round(r * dd) / dd) * dp;
- }
- return r;
- }
- public double Value(float x)/*Ищет значение функции в точке*/
- { countf++;
- return 17 * x + x * x + 17 * Math.Pow(x, 3) + 6 * Math.Pow(x, 4) +
- 18 * Math.Pow(x, 5) + 15 * Math.Pow(x, 6) + 32 * Math.Pow(x, 7) +
- 12 * Math.Pow(x, 8) + Math.Exp(-19 * x) + Math.Exp(-x) + Math.Exp(-26 * x) +
- Math.Exp(-x);
- }
- double Fproisvod(float x)/*Ищет значение первой производной в точке*/
- {
- countf++;
- return 17 + 2 * x + 51 * Math.Pow(x, 2) + 24 * Math.Pow(x, 3) +
- 90 * Math.Pow(x, 4) + 90 * Math.Pow(x, 5) + 224 * Math.Pow(x, 6) +
- 96 * Math.Pow(x, 7) - 19 * Math.Exp(-19 * x) - Math.Exp(-x) - 26 * Math.Exp(-26 * x) -
- Math.Exp(-x);
- }
- double Sproisvod(float x)/*Ищет значение второй производной в точке*/
- {
- countf++;
- return 2 + 102 * x + 72 * Math.Pow(x, 2) +
- 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);
- }
- public void Dichotomy(double a2, double b2, double e2, double f2)
- {
- int count = 1; float a = (float)a2; float b = (float)b2; float e = (float)e2; float f = (float)f2;/*в float*/
- using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
- {
- writer.WriteLine("Дихотомия");
- writer.WriteLine(a + " " + b + " || " + Value1(a) + " " + Value1(b));
- float c, d; while (b - a >= 2 * e)
- {
- c = ((b + a) / 2) - (f / 2);
- d = ((b + a) / 2) + (f / 2); writer.WriteLine(count + " c:= " + c + " d:= " + d + " || " + Value1(c) + " " + Value1(d));
- if (Value(c) <= Value(d)) { b = d; } else { a = c; }
- writer.WriteLine(count + " a:= " + a + " b:= " + b + " || " + Value1(a) + " " + Value1(b));
- count++;
- }
- writer.WriteLine(count + " " + getSignificationDigit(4, (b + a) / 2) + " || " + getSignificationDigit(4, Value1((b + a) / 2)));
- writer.WriteLine("Количество посчётов " + countf);
- }
- }
- public void GoldenSection(double a2, double b2, double e2)
- {
- using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
- {
- writer.WriteLine("Золотое сечение:"); int count = 1;
- float a = (float)a2; float b = (float)b2; float e = (float)e2;
- writer.WriteLine(a + " " + b + " || " + Value1(a) + " " + getSignificationDigit(4, Value1(b)));
- float c, d; double fprevc, fprevd;/*preva -значение a во время предыдущей итерации*/;
- c = ((3 - (float)Math.Sqrt(5)) / 2) * (b - a) + a;
- d = (((float)Math.Sqrt(5) - 1) / 2) * (b - a) + a; fprevc = Value(c); fprevd = Value(d);
- writer.WriteLine(count + " c:= " + c + " d:= " + d + " || " + fprevc + " " + fprevd);
- while (b - a >= 2 * e)
- {
- /*if (Value(c) < Value(d)) b = d; else { a = c; }*/
- count++;
- if (fprevc < fprevd) { b = d; d = c; c = ((3 - (float)Math.Sqrt(5)) / 2) * (b - a) + a; fprevc = Value(c);}
- else
- { a = c; c = d; d = (((float)Math.Sqrt(5) - 1) / 2) * (b - a) + a; fprevd = Value(d); }
- writer.WriteLine(count + " c:= " + c + " d:= " + d + " || " + Value1(c) + " " + Value1(d));
- writer.WriteLine(count + " a:= " + a + " b:= " + b + " || " + Value1(a) + " " + Value1(b));
- }
- writer.WriteLine(count + " " + getSignificationDigit(4, (b + a) / 2) + " || " + getSignificationDigit(4, Value1((b + a) / 2)));
- writer.WriteLine("Количество посчётов" + countf);
- }
- }
- public void Fibonacci(double a2, double b2, double e2)
- {
- using (StreamWriter writer =
- File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
- {
- writer.WriteLine("Фибоначчи:"); int count = 1;
- List<float> Fib = new List<float>() { 1, 1 }; double fprevc = 0, fprevd = 0;
- float a = (float)a2; float b = (float)b2; float e = (float)e2;
- float c = a - 1, d = b - 1;
- int n = 1, i = 1; do { n++; Fib.Add(Fib[n - 1] + Fib[n - 2]); }
- while (Fib[n] < ((b - a) / e)); n -= 1;
- while (n + 1 != i)
- {
- if (b == d)
- {
- d = c; fprevd = fprevc;
- c = a + (b - a) * (Fib[n - i] / Fib[n + 2 - i]);
- fprevc = Value(c);
- }
- else if (a == c)
- {
- c = d; fprevc = fprevd;
- d = a + (b - a) * (Fib[n + 1 - i] / Fib[n + 2 - i]); fprevd = Value(d);
- }
- else
- {
- d = a + (b - a) * (Fib[n + 1 - i] / Fib[n + 2 - i]);
- c = a + (b - a) * (Fib[n - i] / Fib[n + 2 - i]); fprevc = Value(c); fprevd = Value(d);
- }
- writer.WriteLine(count + " c:= " + c + " d:= " + d + " || " + Value1(c) + " " + Value1(d));
- if (n != i)/*иначе будет лишняя итерация*/
- { if (fprevc <= fprevd) b = d; else a = c; }
- writer.WriteLine(count + " a:= " + a + " b:= " + b + " || " + Value1(a) + " " + Value1(b));
- i++; count++;
- }
- count--;
- writer.WriteLine(count + " " + getSignificationDigit(4, (b + a) / 2) + " || " + getSignificationDigit(4, Value1((b + a) / 2)));
- writer.WriteLine("Количество посчётов " + countf);
- }
- }
- public void Nutona(double a2, double b2, double e2)
- {
- using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
- {
- writer.WriteLine("Метод Ньютона"); int count = 1;
- float a = (float)a2; float b = (float)b2; float e = (float)e2; float x0 = (b - a) / 2;
- writer.WriteLine(x0 + " || " + Value1(x0)); double fval;
- do
- { fval = Fproisvod(x0); x0 = x0 - (float)(fval / Sproisvod(x0)); writer.WriteLine(count + " " + x0 + " || " + Value1(x0));count++; }
- while (Math.Abs(fval) > e || x0 < a);count--;
- writer.WriteLine(count + " " + getSignificationDigit(4, x0) + " || " + getSignificationDigit(4, Value1(x0)));
- writer.WriteLine("Количество посчётов " + countf);
- }
- }
- public void Passive(double a2, double b2, double e2)
- {
- using (StreamWriter writer = File.AppendText("C:\\Users\\Александр\\source\\repos\\mo\\mo\\mo.txt"))
- {
- writer.WriteLine("Пассивный поиск"); double fmin;
- 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;
- long l = Convert.ToInt64((b - a) / e); k = l + 1/*выделение целой части*/; fmin = Value(a);
- while (x != b) { x = a + (b - a) * i / k; if (Value(x) < Value(min)) { fmin = Value(min); min = x;} i++;
- writer.WriteLine(count + " " + x + " || " + Value1(x)); count++; }
- writer.WriteLine(count + " " + getSignificationDigit(4, min) + " || " + getSignificationDigit(4, Value1(min)));
- writer.WriteLine("Количество посчётов " + countf);
- }
- }
- public double Value1(float x)/*Ищет значение функции в точке*/
- {
- return 17 * x + x * x + 17 * Math.Pow(x, 3) + 6 * Math.Pow(x, 4) +
- 18 * Math.Pow(x, 5) + 15 * Math.Pow(x, 6) + 32 * Math.Pow(x, 7) +
- 12 * Math.Pow(x, 8) + Math.Exp(-19 * x) + Math.Exp(-x) + Math.Exp(-26 * x) +
- Math.Exp(-x);
- }
- }
- class Program {
- static void Main(string[] args)
- {
- double a, b, e; form1 cl = new form1();
- a = Convert.ToDouble(Console.ReadLine()); b = Convert.ToDouble(Console.ReadLine());
- e = Convert.ToDouble(Console.ReadLine());
- cl.Dichotomy(a, b, e, e / 2);cl.countf = 0; cl.GoldenSection(a, b, e); cl.countf = 0;
- cl.Fibonacci(a, b, e); cl.countf = 0; cl.Nutona(a, b, e); cl.countf = 0;
- cl.Passive(a, b, e);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement