Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.44 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement